Spaces:
Runtime error
Runtime error
from countriesIdentification import identify_locations | |
from datesIdentification import dates_binding | |
from magnitudeIdentification import magnitude_binding | |
from comparativesIdentification import comparatives_binding | |
from earthquaqeIdentification import identify_earthquake_event | |
def process_final_dict(final_dictionary): | |
""" | |
Function to convert each one of the error codes from each component into a relevant code number to be handled by the SF | |
""" | |
# convert all tuple error messages into dictionary error messages | |
for i, elem in enumerate(final_dictionary): | |
if isinstance(elem, tuple): | |
if elem == (0, "MAGNITUDE", "no_magnitude"): | |
final_dictionary[i] = {"Number": 9999911} | |
elif elem == (0, "MAGNITUDE", "more_magnitude"): | |
final_dictionary[i] = {"Number": 9999912} | |
elif elem == (0, "MAGNITUDE", "format_error"): | |
final_dictionary[i] = {"Number": 9999914} | |
elif elem == (0, "MAGNITUDE", "unknown_error"): | |
final_dictionary[i] = {"Number": 9999913} | |
elif elem == (0, "EARTHQUAKE_EVENT", "no_earthquake_reference"): | |
final_dictionary[i] = {"event":9999921} | |
elif elem == (0, "EARTHQUAKE_EVENT", "unknown_error"): | |
final_dictionary[i] = {"event": 9999922} | |
elif elem == (0,'DATES', 'wrong_date_format'): | |
final_dictionary[i] = {"date": {"day": 9999931, "month": 9999931, "year": 9999931}} | |
elif elem == (0,'DATES', 'no_date'): | |
final_dictionary[i] = {"date": {"day": 9999932, "month": 9999932, "year": 9999932}} | |
elif elem == (0,'DATES', 'more_dates'): | |
final_dictionary[i] = {"date": {"day": 9999933, "month": 9999933, "year": 9999933}} | |
elif elem == (0,'DATES', 'unknown_error'): | |
final_dictionary[i] = {"date": {"day": 9999934, "month": 9999934, "year": 9999934}} | |
elif elem == (0, "LOCATION", "no_country"): | |
final_dictionary[i] = {"city":[9999941], "country":[9999941]} | |
elif elem == (0, "LOCATION", "more_city_or_country"): | |
final_dictionary[i] = {"city": [9999942], "country": [9999942]} | |
elif elem == (0, "LOCATION", "more_country"): | |
final_dictionary[i] = {"city": [9999943], "country": [9999943]} | |
elif elem == (0, "LOCATION", "unknown_error"): | |
final_dictionary[i] = {"city": [9999944], "country": [9999944]} | |
elif elem == (0, "COMPARATIVES", "more_comparatives_mentions"): | |
final_dictionary[i] = {"comparative": 9999951} | |
elif elem == (0, "COMPARATIVES", "no_comparatives"): | |
final_dictionary[i] = {"comparative": 9999952} | |
elif elem == (0, "COMPARATIVES", "more_symbol_comparatives"): | |
final_dictionary[i] = {"comparative": 9999953} | |
elif elem == (0, "COMPARATIVES", "unknown_error"): | |
final_dictionary[i] = {"comparative": 9999954} | |
return final_dictionary | |
def natural_language_module(sentence): | |
""" | |
Function to execute the complete natural language module pipeline | |
""" | |
try: | |
final_dictionary = [] | |
# identify whether the sentence is referred on earthquake events | |
earth_event = identify_earthquake_event(sentence) | |
if earth_event: | |
final_dictionary.append(earth_event) | |
# identify the target country and city in the sentence | |
location = identify_locations(sentence) | |
if location: | |
final_dictionary.append(location) | |
# identify the target comparative in the sentence | |
comparative = comparatives_binding(sentence) | |
if comparative: | |
final_dictionary.append(comparative) | |
# identify the target date in the sentence | |
date = dates_binding(sentence) | |
if isinstance(date, list): | |
date_dict = date[0] | |
date_replc = date[1] | |
if date_dict: | |
final_dictionary.append(date_dict[0]) | |
# we also delete the date reference from the sentence so that there will | |
# not be any confusion with it for the magnitude identification module | |
if len(date_replc) == 1: | |
sentence = sentence.replace(date_replc[0], " ") | |
# in case it is a tuple we add it as it is and we do not substitute something in the sentence | |
elif isinstance(date, tuple): | |
final_dictionary.append(date) | |
# identify the target magnitude number in the sentence | |
magnitude = magnitude_binding(sentence) | |
if magnitude: | |
final_dictionary.append(magnitude) | |
clean_final_dictionary = process_final_dict(final_dictionary) | |
result = {} | |
for d in clean_final_dictionary: | |
result.update(d) | |
return result | |
except: | |
return "\n\n=== AN UNEXPECTED ERROR HAS OCCURED. PLEASE EXECUTE AGAIN THE SCRIPT OR COMMUNICATE WITH THE DEVELOPER TEAM === \n\n" | |
def replace_zero_with_null(d): | |
""" | |
This is a small helper function to convert the 0 references on the final json to be sent, into None, as needed by the SF | |
""" | |
for k, v in d.items(): | |
if isinstance(v, dict): | |
replace_zero_with_null(v) | |
elif v == 0 and k != "point": | |
d[k] = "null" | |
return d | |
def process_json_sf(nl_json, sentence): | |
""" | |
Function to convert the captured information an a relevant json format | |
""" | |
try: | |
sf_json_format = { | |
"text": sentence, | |
"page": "1", | |
"nlp": {"event": nl_json['event'], "city": nl_json['city'][0], "country": nl_json['country'][0], "year": int(nl_json['date']['year']), "month": int(nl_json['date']['month']), | |
"day": int(nl_json['date']['day']), "magnitude": nl_json['Number'], "comparative": nl_json['comparative'], "point": False, "latitude": "null", "lognitude": "null"} | |
} | |
return sf_json_format | |
except: | |
return "\n\n=== AN UNEXPECTED ERROR HAS OCCURED. PLEASE EXECUTE AGAIN THE SCRIPT OR COMMUNICATE WITH THE DEVELOPER TEAM === \n\n" | |
def main(sentence): | |
nl_data = natural_language_module(sentence) | |
nl_json = process_json_sf(nl_data, sentence) | |
nl_json_with_null = replace_zero_with_null(nl_json) | |
return nl_json_with_null |