【问题标题】:Extracting Related Date and Location from a sentence从句子中提取相关日期和位置
【发布时间】:2020-04-22 18:21:55
【问题描述】:

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

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

我会有这样的输出:

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

我尝试通过“连接词”(例如“and”)拆分文本,并按以下方式处理部分内容:查找指示位置的词(“at”、“in”、“from”、“to ”等)和表示日期或时间的词(“on”、“during”等),并加入您找到的内容。然而,这被证明是有问题的,因为指示位置和日期的单词太多,有时基本的“查找”方法无法区分它们。

假设我能够识别日期,并且给定一个以大写字母开头的单词,我能够确定它是否是一个位置。主要问题是它们之间的连接,并确保它们是连接的。

我认为像 ntlkscapy 这样的工具会在这方面为我提供帮助,但是没有足够的文档来帮助我找到此类问题的确切解决方案。

任何帮助将不胜感激!

【问题讨论】:

  • Scapy 在这里不相关,因为它用于在真实网络上制作数据包,而不是 神经网络
  • @RossJacobs 感谢您的意见!从标签中删除它。

标签: python nlp nltk linguistics


【解决方案1】:

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

  1. here下载斯坦福NER
  2. 解压压缩文件夹并保存在驱动器中
  3. 从文件夹中复制“stanford-ner.jar”并将其保存在文件夹外,如下图所示。
  4. 点击“无壳”从https://stanfordnlp.github.io/CoreNLP/history.html 下载无壳模型,如下所示。但是,第一个链接中的模型也可以工作,无大小写模型有助于识别命名实体,即使它们没有按照正式语法规则的要求大写。
  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')]

这种方法适用于大多数情况。

【讨论】:

  • 太棒了,谢谢!有没有办法为这个斯坦福数据库本地添加位置?有时我会处理极端情况——例如,小的、未知的村庄,而不是国家名称(例如尼泊尔)——考虑到我可以识别一个位置等事实,我希望上面的脚本也能将它识别为一个位置标记。
  • 根据特征识别命名实体。他们不寻找确切的词。一方面这很好,因为一个人的名字是美国人还是尼泊尔人并不重要。而另一方面,由于它是一个通用模型,它不会识别出一些人类可以识别的明显名称。对作者有效的一种方法是使用名称查找列表,并在其上部署斯坦福 NER。因此可以使用一些集成方法。
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 2013-07-20
  • 2018-05-21
  • 2019-03-20
  • 1970-01-01
相关资源
最近更新 更多