我正在处理包括地点和日期的书面文本(文章和书籍的段落)。我想从文本中提取包含地点和日期的对子,这些对子相互关联。例如,给定以下短语。
该男子于1月离开阿姆斯特丹,10月21日到达尼泊尔。
我会有这样的输出。
>>>[(Amsterdam, January), (Nepal, October 21st)]
我试着通过 "连接词"(例如 "和")将文本分割开来,并按以下方式进行工作:找到表示位置的词("在"、"在"、"从"、"到 "等)和表示日期或时间的词("在"、"期间 "等),并将找到的词连接起来。但事实证明,这样做是有问题的,因为表示地点和日期的词太多,有时基本的 "查找 "方法无法区分它们。
假设我能够确定一个日期是这样的,给定一个以大写字母开头的词,我就能够确定它是否是一个地点。主要的问题是连接它们之间,并确保它们是。
我想,像这样的工具 ntlk 和 癞皮病 将协助我在这里,但没有足够的文档来帮助我找到这种问题的确切解决方案。
如果有任何帮助,我将不胜感激
这似乎是一个命名实体识别问题。以下是相同的步骤。详细的理解,请参考 这个 文章。
注意:请确保所有的路径都更新为本地机器上的路径。
#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')]
这种方法在大多数情况下都是可行的。