model_pred_report.py 2.1 KB

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