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