Untitled
user_6242850
plain_text
2 years ago
8.0 kB
9
Indexable
import requests import json import os from .models import CarDealer, DealerReview from requests.auth import HTTPBasicAuth from decouple import config from ibm_watson import NaturalLanguageUnderstandingV1 from ibm_cloud_sdk_core.authenticators import IAMAuthenticator from ibm_watson.natural_language_understanding_v1 import Features, SentimentOptions import requests from requests.auth import HTTPBasicAuth # Function for making HTTP GET requests def get_request(url, api_key=False, **kwargs): print(f"GET from {url}") try: headers = {'Content-Type': 'application/json'} if api_key: # Basic authentication GET response = requests.get(url, headers=headers, params=kwargs, auth=HTTPBasicAuth('apikey', api_key)) else: # No authentication GET response = requests.get(url, headers=headers, params=kwargs) response.raise_for_status() # If the request failed, this will raise a HTTPError return response.json() # Return the JSON response from the server except requests.exceptions.RequestException as e: print(f"An error occurred while making GET request: {e}") return {} # Return an empty dictionary when an exception occurs def get_dealers_from_cf(url): json_result = get_request(url) # Call the get_request function and assign the result to json_result if 'body' in json_result and 'rows' in json_result['body']: dealers = json_result['body']['rows'] else: dealers = [] return dealers # Return the list of dealers # Retrieving the response status code and content status_code = response.status_code print(f"With status {status_code}") json_data = json.loads(response.text) return json_data # Function for making HTTP POST requests def post_request(url, json_payload, **kwargs): print(f"POST to {url}") try: response = requests.post(url, params=kwargs, json=json_payload) except: print("An error occurred while making POST request. ") status_code = response.status_code print(f"With status {status_code}") return response # Gets all dealers from the Cloudant DB with the Cloud Function get-dealerships def get_dealers_from_cf(url): results = [] json_result = get_request(url) # Retrieve the dealer data from the response dealers = json_result["body"]["rows"] # For each dealer in the response for dealer in dealers: # Get its data in `doc` object dealer_doc = dealer["doc"] # Create a CarDealer object with values in `doc` object dealer_obj = CarDealer(address=dealer_doc["address"], city=dealer_doc["city"], full_name=dealer_doc["full_name"], id=dealer_doc["id"], lat=dealer_doc["lat"], long=dealer_doc["long"], short_name=dealer_doc["short_name"], st=dealer_doc["st"], state=dealer_doc["state"], zip=dealer_doc["zip"]) results.append(dealer_obj) return results # Gets a single dealer from the Cloudant DB with the Cloud Function get-dealerships # Requires the dealer_id parameter with only a single value def get_dealer_by_id(url, dealer_id): # Call get_request with the dealer_id param json_result = get_request(url, dealerId=dealer_id) # Create a CarDealer object from response dealer = json_result["entries"][0] dealer_obj = CarDealer(address=dealer["address"], city=dealer["city"], full_name=dealer["full_name"], id=dealer["id"], lat=dealer["lat"], long=dealer["long"], short_name=dealer["short_name"], st=dealer["st"], state=dealer["state"], zip=dealer["zip"]) return dealer_obj # Gets all dealers in the specified state from the Cloudant DB with the Cloud Function get-dealerships def get_dealers_by_state(url, state): results = [] # Call get_request with the state param json_result = get_request(url, state=state) dealers = json_result["body"]["docs"] # For each dealer in the response for dealer in dealers: # Create a CarDealer object with values in `doc` object dealer_obj = CarDealer(address=dealer["address"], city=dealer["city"], full_name=dealer["full_name"], id=dealer["id"], lat=dealer["lat"], long=dealer["long"], short_name=dealer["short_name"], st=dealer["st"], state=dealer["state"], zip=dealer["zip"]) results.append(dealer_obj) return results # Gets all dealer reviews for a specified dealer from the Cloudant DB # Uses the Cloud Function get_reviews def get_dealer_reviews_from_cf(url, dealer_id): results = [] # Perform a GET request with the specified dealer id json_result = get_request(url, dealerId=dealer_id) if json_result: # Get all review data from the response reviews = json_result["body"]["data"]["docs"] # For every review in the response for review in reviews: # Create a DealerReview object from the data # These values must be present review_content = review["review"] id = review["_id"] name = review["name"] purchase = review["purchase"] dealership = review["dealership"] try: # These values may be missing car_make = review["car_make"] car_model = review["car_model"] car_year = review["car_year"] purchase_date = review["purchase_date"] # Creating a review object review_obj = DealerReview(dealership=dealership, id=id, name=name, purchase=purchase, review=review_content, car_make=car_make, car_model=car_model, car_year=car_year, purchase_date=purchase_date ) except KeyError: print("Something is missing from this review. Using default values.") # Creating a review object with some default values review_obj = DealerReview( dealership=dealership, id=id, name=name, purchase=purchase, review=review_content) # Analysing the sentiment of the review object's review text and saving it to the object attribute "sentiment" review_obj.sentiment = analyze_review_sentiments(review_obj.review) print(f"sentiment: {review_obj.sentiment}") # Saving the review object to the list of results results.append(review_obj) return results # Calls the Watson NLU API and analyses the sentiment of a review def analyze_review_sentiments(review_text): # Watson NLU configuration try: if os.environ['env_type'] == 'PRODUCTION': url = os.environ['WATSON_NLU_URL'] api_key = os.environ["WATSON_NLU_API_KEY"] except KeyError: url = config('WATSON_NLU_URL') api_key = config('WATSON_NLU_API_KEY') version = '2021-08-01' authenticator = IAMAuthenticator(api_key) nlu = NaturalLanguageUnderstandingV1( version=version, authenticator=authenticator) nlu.set_service_url(url) # get sentiment of the review try: response = nlu.analyze(text=review_text, features=Features( sentiment=SentimentOptions())).get_result() print(json.dumps(response)) # sentiment_score = str(response["sentiment"]["document"]["score"]) sentiment_label = response["sentiment"]["document"]["label"] except: print("Review is too short for sentiment analysis. Assigning default sentiment value 'neutral' instead") sentiment_label = "neutral" # print(sentiment_score) print(sentiment_label) return sentiment_label
Editor is loading...
Leave a Comment