Untitled
user_6242850
plain_text
2 years ago
8.0 kB
22
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