ValadisCERTH's picture
Update main.py
9422b91
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