从句子中提取相关日期和地点

问题描述 投票:0回答:1

我正在处理包括地点和日期的书面文本(文章和书籍的段落)。我想从文本中提取包含地点和日期的对子,这些对子相互关联。例如,给定以下短语。

该男子于1月离开阿姆斯特丹,10月21日到达尼泊尔。

我会有这样的输出。

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

我试着通过 "连接词"(例如 "和")将文本分割开来,并按以下方式进行工作:找到表示位置的词("在"、"在"、"从"、"到 "等)和表示日期或时间的词("在"、"期间 "等),并将找到的词连接起来。但事实证明,这样做是有问题的,因为表示地点和日期的词太多,有时基本的 "查找 "方法无法区分它们。

假设我能够确定一个日期是这样的,给定一个以大写字母开头的词,我就能够确定它是否是一个地点。主要的问题是连接它们之间,并确保它们是。

我想,像这样的工具 ntlk癞皮病 将协助我在这里,但没有足够的文档来帮助我找到这种问题的确切解决方案。

如果有任何帮助,我将不胜感激

python nlp nltk linguistics
1个回答
2
投票

这似乎是一个命名实体识别问题。以下是相同的步骤。详细的理解,请参考 这个 文章。

  1. 下载Stanford NER从 此处
  2. 解压压缩后的文件夹,并保存在一个驱动器中。
  3. 从文件夹中复制 "stanford-ner.jar "并保存在文件夹外,如下图所示。enter image description here
  4. 从以下地方下载无壳模型 https:/stanfordnlp.github.ioCoreNLPhistory.html。 点击下面给出的 "caseless"。第一个链接中的模型也可以工作,但是,无名模型有助于识别命名实体,即使它们没有按照正式语法规则的要求大写。enter image description here
  5. 运行下面的Python代码。请注意,这段代码在使用Python 2.7版本的windows 10, 64位机器上工作。

注意:请确保所有的路径都更新为本地机器上的路径。

#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')]

这种方法在大多数情况下都是可行的。

© www.soinside.com 2019 - 2024. All rights reserved.