Извлечение связанной даты и местоположения из предложения - PullRequest
0 голосов
/ 22 апреля 2020

Я работаю с письменным текстом (параграфы статей и книг), который включает в себя как места, так и даты. Я хочу извлечь из текстовых пар, которые содержат местоположения и даты, которые связаны друг с другом. Например, учитывая следующую фразу:

Человек покинул Амстердам в январе и достиг Непала 21 октября

У меня был бы такой вывод:

>>>[(Amsterdam, January), (Nepal, October 21st)]

Я попытался разделить текст по «соединяющим словам» (таким как «и», например) и поработать над частью следующим образом: найти слова, которые указывают местоположение («в», « в "," из "," в "et c.) и слова, которые указывают дату или время (" on "," во время "et c.) и присоединяются к тому, что вы найдете. Однако это оказалось проблематичным c, так как слишком много слов указывают местоположение и дату, и иногда базовый c метод «найти» не может различить guish между ними.

Предположим, что я могу определить дату как таковую, и, учитывая слово, которое начинается с заглавной буквы, я могу определить, является ли это место или нет. Главная проблема заключается в том, чтобы соединиться между ними и убедиться, что они есть.

Я подумал, что такие инструменты, как ntlk и scapy , помогут мне здесь, но это не так. Достаточно документации, чтобы помочь мне найти точное решение этой проблемы.

Любая помощь будет признательна!

1 Ответ

2 голосов
/ 23 апреля 2020

Это похоже на проблему распознавания именованных объектов. Ниже приведены шаги к тому же. Для подробного понимания, пожалуйста, обратитесь к этой статье.

  1. Загрузите Stanford NER с здесь
  2. Распакуйте zip-архив и сохраните его на диске
  3. Скопируйте «stanford-ner.jar» из папки и сохраните ее только вне папки, как показано на рисунке ниже.
    enter image description here
  4. Загрузите модели без учета регистра https://stanfordnlp.github.io/CoreNLP/history.html нажав на «caseless», как указано ниже. Модели в первой ссылке также работают, однако, модели без учета регистра помогают идентифицировать именованные объекты, даже если они не пишутся с большой буквы, как того требуют правила формальной грамматики. enter image description here
  5. Введите следующий код Python. Обратите внимание, что этот код работал на windows 10, 64-битной машине с Python 2.7 версией.

Примечание: убедитесь, что все пути обновлены до путей на локальном компьютере

#Import all the required libraries.
import os
from nltk.tag import StanfordNERTagger
import pandas as pd

#Set environmental variables programmatically.
#Set the classpath to the path where the jar file is located
os.environ['CLASSPATH'] = "<your path>/stanford-ner-2015-04-20/stanford-ner.jar"
#Set the Stanford models to the path where the models are stored
os.environ['STANFORD_MODELS'] = '<your path>/stanford-corenlp-caseless-2015-04-20-models/edu/stanford/nlp/models/ner'

#Set the java jdk path. This code worked with this particular java jdk
java_path = "C:/Program Files/Java/jdk1.8.0_191/bin/java.exe"
os.environ['JAVAHOME'] = java_path


#Set the path to the model that you would like to use
stanford_classifier  =  '<your path>/stanford-corenlp-caseless-2015-04-20-models/edu/stanford/nlp/models/ner/english.muc.7class.caseless.distsim.crf.ser.gz'

#Build NER tagger object
st = StanfordNERTagger(stanford_classifier)

#A sample text for NER tagging
text = 'The man left Amsterdam on January and reached Nepal on October 21st'

#Tag the sentence and print output
tagged = st.tag(str(text).split())
print(tagged)
#[(u'The', u'O'), 
# (u'man', u'O'), 
# (u'left', u'O'), 
# (u'Amsterdam', u'LOCATION'), 
# (u'on', u'O'), 
# (u'January', u'DATE'), 
# (u'and', u'O'), 
# (u'reached', u'O'), 
# (u'Nepal', u'LOCATION'), 
# (u'on', u'O'), 
# (u'October', u'DATE'), 
# (u'21st', u'DATE')]

Этот подход работает в большинстве случаев .

...