1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- from django.conf import settings
- from requests import post
- import json
- from difflib import SequenceMatcher
- from review.models import Review
- nlu_server_url = settings.NLU_SERVER_URI
- ner_model = settings.MODEL
- def filter_with_last_ten_reviews(location_id, replies):
- replies = list(replies)
- revs = Review.objects.filter(location_id=location_id).exclude(reply=None).order_by('-update_time')[:12]
- for r in revs:
- s1 = r.reply.replied_text
- for rep in replies:
- s2 = rep.reply
- similarity = SequenceMatcher(None, s1, s2).ratio()
- if similarity > 0.7:
- replies.remove(rep)
- print('%.2f'%similarity, ' -------------- ', rep.reply_category)
- return replies
- def model_inference(text):
- url = nlu_server_url + '/model/parse'
- payload = {'text': text}
- headers = {'content-type': 'application/json'}
- response = post(url, data=json.dumps(payload), headers=headers)
- if response.status_code == 200:
- return response.json()
- return response
- def is_a_name(name):
- '''
- function that decide whether it is a person name or not
- :param : name -> a string usually reviewer name
- :return: Boolean -> true or false
- '''
- doc = ner_model(name)
- if doc.ents and doc.ents[0].label_ == 'PERSON':
- return True
- else:
- return False
- def analyze_inference(response):
- '''
- response has four property
- ['intent', 'entities', 'intent_ranking', 'text']
- we took all intents that has more than 10% of intent confident.
- all the intents that has bellow confidence has been omitted.
- :param response: JSON -> a json response that RASA NLU server respond.
- :return: DICT ->dictionary with key of intent and value of it's confident.
- '''
- res_intents = response.get('intent_ranking')
- intents = {}
- for intent in res_intents:
- key = intent.get('name')
- values = intent.get('confidence')
- if values > 0.1:
- intents[key] = int(values*100)
- return intents
- def name_entity_recognition(text):
- doc = ner_model(text)
- names = [n for n in doc.ents if n.label_ == 'PERSON']
- return names
|