【发布时间】:2016-04-24 23:35:33
【问题描述】:
我正在尝试使用nltk 和Stanford NLP 工具从一段文本中提取关键字。运行代码后,我可以得到这样的列表
companyA
companyB
companyC
Trend Analysis For companyA
这一切都很好,但请注意最后一项。这实际上是出现在文本中的标题。由于标题的所有单词都是大写的,我的程序认为这些都是专有名词,因此将它们组合在一起,就好像它们是一个大公司名称一样。
好消息是,只要文中某处提到了一家公司,我的程序就会选择它,因此我也会得到像 companyA 这样的单个项目。这些来自关于该公司的实际文本。
这就是我想做的。
在我上面得到的列表中,有没有办法查看一个项目并确定任何以前的项目是否是当前项目的子字符串?比如这种情况当我遇到
Trend Analysis For companyA
我可以检查我以前是否看过这部分内容。所以我可以确定我已经拥有companyA,因此我将忽略Trend Analysis For companyA。 我相信本文会提到任何公司,足以让 StanfordNER 接受它。因此我不必依赖标题来获得我需要的东西。
这有意义吗?这是正确的方法吗?恐怕这不会很有效,但我想不出别的。
编辑
这是我使用的代码
sentences = nltk.sent_tokenize(document)
sentences = [nltk.word_tokenize(sent) for sent in sentences]
sentences = [nltk.pos_tag(sent) for sent in sentences]
之后我只是在每个句子上使用StanfordNERTagger
result = []
stn = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')
for s in sentences:
taggedwords = stn.tag(s)
for tag, chunk in groupby(taggedWords, lambda x:x[1]):
if tag == "ORGANIZATION":
result.append((tag, " ".join(w for w, t in chunk)))
return result
这样我可以得到所有的ORGANIZATIONs。
@Alvas 关于 Truecasing 的观点,你不觉得这有点矫枉过正吗?当我研究算法时,在我看来,他们试图为每个单词想出最有可能的拼写。可能性将基于语料库。我不认为我需要建立一个语料库,因为我可以使用像wordnet 或类似pyenchant 这样的字典来找出适当的拼写。另外,在这里我已经有了我需要的所有信息,即我正在挑选所有提到的公司。
还有一个问题。考虑公司名称
American Eagle Outfitters
注意American 和american 都是正确的拼写。 Eagle 和 eagle 的类似物。恐怕即使我在我的算法中使用 Truecasing,它最终也会小写不应该小写的术语。
再次,我现在的问题是我提取了所有公司名称,但我也在提取标题。蛮力方式是对结果列表执行子字符串检查。我只是想知道是否有更有效的方法来做到这一点。此外,我认为我所做的任何调整都不会改善标记。我不认为我能超越StanfordNERTagger
【问题讨论】:
-
再一次,有趣但不适合 Stackoverflow。你是如何使用
NLTK+Stanford NLP提取文本的?您可以发布代码链接或提供代码 sn-p 吗?根据您提取短语的方式,您可能无法提取您真正想要的内容。 -
你有没有尝试过stackoverflow.com/questions/34439208/… 的
truecasing建议?我很确定 truecasing 总体上会减少你对 NER 的痛苦。我将把它作为重复投票,因为现在你遇到了带有大写字母的“假阳性”而不是没有大写字母的“假阴性”的相反问题。可能的解决方案保持不变,例如做truecasing -
@GaborAngeli,他使用的是无壳模型和stackoverflow.com/questions/34439208/…。我认为更重要的是了解问题,了解现有技术,然后再着手实施或执行一项技术。
标签: python nlp nltk stanford-nlp named-entity-recognition