12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import csv
- import json
- import requests
- from difflib import SequenceMatcher
- from django.utils import timezone
- from django.conf import settings
- from nlu_job.nlu_utils import clean_text
- from .models import Review, CustomReply
- # constants
- nlu_server_url = settings.NLU_SERVER_URI
- replies = CustomReply.objects.all()
- def model_inference(text):
- url = nlu_server_url + '/predict'
- text = clean_text(text)
- payload = {'text': text}
- headers = {'content-type': 'application/json'}
- response = requests.post(url, data=json.dumps(payload), headers=headers)
- if response.status_code == 200:
- res = response.json()
- res_intents = res.get('response').get('intents')
- intents = []
- for k, v in res_intents:
- if v <= 0.3:
- intents.append(k)
- return intents
- def get_review_actual_intent(review):
- actual_reply = review.reply.replied_text
- for c_r in replies:
- replied_text = c_r.reply
- similarity = SequenceMatcher(None, actual_reply, replied_text).ratio()
- if similarity > 0.7:
- return c_r.reply_category
- return None
- def do_predict_correctly(review, actual_intent):
- intents = model_inference(review.comment)
- return 1 if actual_intent in intents else 0
- def get_review_report_of_nth_days(days):
- date = timezone.now() - timezone.timedelta(days=days)
- reviews = Review.objects.filter(create_time__gte=date, star_rating__gte=4).exclude(comment=None)
- # Write report into a csv
- with open('review_report.csv', 'w') as file:
- header_row = ['review', 'reply', 'model_inference', 'actual_class', 'classified']
- writer = csv.writer(file)
- writer.writerow(header_row)
- for review in reviews:
- review_text = review.comment
- reply = review.reply.replied_text
- model_pred = model_inference(review_text)
- actual_class = get_review_actual_intent(review)
- classified = do_predict_correctly(review, actual_class)
- row = [review_text, reply, model_pred, actual_class, classified]
- writer.writerow(row)
|