从句子中提取相关日期和位置

Extracting Related Date and Location from a sentence

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

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

我会得到这样的输出:

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

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

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

我认为像 ntlkscapy 这样的工具可以帮助我,但是没有足够的文档来帮助我找到一个这类问题的精确解。

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

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

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

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