model_pred_report.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import csv
  2. import json
  3. import requests
  4. from difflib import SequenceMatcher
  5. from django.utils import timezone
  6. from django.conf import settings
  7. from .models import Review, CustomReply
  8. # constants
  9. nlu_server_url = settings.NLU_SERVER_URI
  10. replies = CustomReply.objects.all()
  11. def model_inference(text):
  12. url = nlu_server_url + '/model/parse'
  13. payload = {'text': text}
  14. headers = {'content-type': 'application/json'}
  15. response = requests.post(url, data=json.dumps(payload), headers=headers)
  16. if response.status_code == 200:
  17. res = response.json()
  18. intents_rankings = res.get('intent_ranking')
  19. intents = []
  20. for intent in intents_rankings:
  21. if intent.get('confidence') > 0.3:
  22. intents.append(intent['name'])
  23. return intents
  24. def get_review_actual_intent(review):
  25. actual_reply = review.reply.replied_text
  26. for c_r in replies:
  27. replied_text = c_r.reply
  28. similarity = SequenceMatcher(None, actual_reply, replied_text).ratio()
  29. if similarity > 0.7:
  30. return c_r.reply_category
  31. return None
  32. def do_predict_correctly(review, actual_intent):
  33. intents = model_inference(review.comment)
  34. return 1 if actual_intent in intents else 0
  35. def get_review_report_of_nth_days(days):
  36. date = timezone.now() - timezone.timedelta(days=days)
  37. reviews = Review.objects.filter(create_time__gte=date, star_rating__gte=4).exclude(comment=None)
  38. # Write report into a csv
  39. with open('review_report.csv', 'w') as file:
  40. header_row = ['review', 'reply', 'model_inference', 'actual_class', 'classified']
  41. writer = csv.writer(file)
  42. writer.writerow(header_row)
  43. for review in reviews:
  44. review_text = review.comment
  45. reply = review.reply.replied_text
  46. model_pred = model_inference(review_text)
  47. actual_class = get_review_actual_intent(review)
  48. classified = do_predict_correctly(review, actual_class)
  49. row = [review_text, reply, model_pred, actual_class, classified]
  50. writer.writerow(row)