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

2024-06-01 20:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我会有这样的输出:

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

我试着通过“连接词”(例如“和”)来拆分文本,并按照以下部分进行工作:查找表示位置的词(“在”、“在”、“从”、“到”等)和表示日期或时间的词(“在”、“在”等),然后加入您找到的内容。然而,这被证明是有问题的,因为有太多的单词表示位置和日期,有时基本的“查找”方法无法区分它们

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

我想像ntlkscapy这样的工具在这里会对我有所帮助,但是没有足够的文档来帮助我找到这类问题的精确解决方案

任何帮助都将不胜感激


Tags: 文本文章时间单词书籍段落地点我会
1条回答
网友
1楼 · 发布于 2024-06-01 20:18:15

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

  1. here下载Stanford NER
  2. 解压缩文件夹并保存到驱动器中
  3. 从文件夹中复制“stanford ner.jar”,并将其保存在文件夹外,如下图所示。
    enter image description here
  4. 点击下面给出的“无壳”从https://stanfordnlp.github.io/CoreNLP/history.html下载无壳模型。第一个链接中的模型也可以工作,但是,无大小写模型有助于识别命名实体,即使它们没有按照形式语法规则的要求大写。 enter image description here
  5. 运行以下Python代码。请注意,这段代码在Windows10、64位机器上使用Python2.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')]

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

相关问题 更多 >