Spaces:
Runtime error
Runtime error
File size: 3,668 Bytes
48c823d b7f929e 48c823d b7f929e 48c823d b7f929e 48c823d cb15a69 48c823d cb15a69 48c823d cb15a69 48c823d cb15a69 48c823d cb15a69 48c823d cb15a69 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
from mathtext_fastapi.logging import prepare_message_data_for_logging
from mathtext.sentiment import sentiment
from mathtext.text2int import text2int
import re
def build_nlu_response_object(type, data, confidence):
""" Builds a json object from the result of nlu functions to send back to Turn.io
Inputs
- type: str - the type of nlu run (integer or sentiment-analysis)
- data: str - the student message
- confidence: - the nlu confidence score. Integer is ''. Sentiment analysis is a float
"""
return {'type': type, 'data': data, 'confidence': confidence}
def test_for_float_or_int(message_data, message_text):
nlu_response = {}
if type(message_text) == int or type(message_text) == float:
nlu_response = build_nlu_response_object('integer', message_text, '')
prepare_message_data_for_logging(message_data, nlu_response)
return nlu_response
def test_for_number_sequence(message_text_arr, message_data, message_text):
nlu_response = {}
if all(ele.isdigit() for ele in message_text_arr):
nlu_response = build_nlu_response_object('integer', ','.join(message_text_arr), '')
prepare_message_data_for_logging(message_data, nlu_response)
return nlu_response
def run_text2int_on_each_list_item(message_text_arr):
""" Checks each item in an array to see if it can be converted to an integer
Input
- message_text_arr: list - a set of text extracted from the student message
Output
- student_response_arr: list - a set of integers derived from the nlu function
"""
student_response_arr = []
for student_response in message_text_arr:
int_api_resp = text2int(student_response.lower())
student_response_arr.append(int_api_resp)
return student_response_arr
def run_sentiment_analysis(message_text):
# TODO: Add intent labelling here
# TODO: Add logic to determine whether intent labeling or sentiment analysis is more appropriate (probably default to intent labeling)
return sentiment(message_text)
def evaluate_message_with_nlu(message_data):
message_text = message_data['message_body']
message_text_arr = re.split(", |,| ", message_text.strip())
# TODO: Replace this with appropriate utility function (is_int, is_float, render_int_or_float)
nlu_response = test_for_float_or_int(message_data, message_text)
if len(nlu_response) > 0:
return nlu_response
# TODO: Replace this with appropriate utility function
nlu_response = test_for_number_sequence(message_text_arr, message_data, message_text)
if len(nlu_response) > 0:
return nlu_response
student_response_arr = run_text2int_on_each_list_item(message_text_arr)
# '32202' is text2int's error code for non-integer student answers (ie., "I don't know")
# If any part of the list is 32202, sentiment analysis will run
# TODO: Need to replace this with logic that recognizes multiple intents (Maybe 36 = "sentiment analysis" & "integer")
student_response_arr = run_text2int_on_each_list_item(message_text_arr)
if 32202 in student_response_arr:
sentiment_api_resp = sentiment(message_text)
nlu_response = build_nlu_response_object('sentiment', sentiment_api_resp[0]['label'], sentiment_api_resp[0]['score'])
else:
if len(student_response_arr) > 1:
nlu_response = build_nlu_response_object('integer', ','.join(str(num) for num in student_response_arr), '' )
else:
nlu_response = build_nlu_response_object('integer', student_response_arr[0], '')
prepare_message_data_for_logging(message_data, nlu_response)
return nlu_response
|