【问题标题】:issue recognizing NEs with StanfordNER in python NLTK在 python NLTK 中使用 StanfordNER 识别 NE 的问题
【发布时间】:2015-11-09 06:26:03
【问题描述】:

当有一个潜在的 NE 后跟一个逗号时会发生这种情况,例如,如果我的字符串类似于,

“这些名字 Praveen Kumar,, David Harrison, Paul Harrison, blah”

“美国加利福尼亚州”

我的输出分别如下。

[[(u'这些', u'O'), (u'names', u'O'), (u'Praveen', u'O'), (u'Kumar,,', u 'O'), (u'David', u'PERSON'), (u'Harrison,', u'O'), (u'Paul', u'PERSON'), (u'Harrison,', u 'O'), (u'blah', u'O')]]

[[(u'California,', u'O'), (u'United', u'LOCATION'), (u'States', u'LOCATION')]]

为什么它不识别潜在的 NE,例如“Praveen Kumar”、“Harrison”和“California”?

下面是如何在代码中使用它:

from nltk.tag.stanford import NERTagger
st = NERTagger('stanford-ner/classifiers/english.all.3class.distsim.crf.ser.gz', 'stanford-ner/stanford-ner.jar')

tags = st.tag("California, United States".split())

是因为我用 split() 标记了输入搅拌吗?我该如何解决这个问题,因为它在 Java 中运行良好?

【问题讨论】:

  • 首先是from nltk import word_tokenize,然后是st.tag(word_tokenize("California, United States"))

标签: python nlp nltk stanford-nlp named-entity-recognition


【解决方案1】:

由于您是通过 nltk 执行此操作的,因此请使用它的分词器来拆分您的输入:

alltext = myfile.read()
tokenized_text = nltk.word_tokenize(alltext)

编辑:您可能最好使用斯坦福工具包自己的标记器,正如其他答案所建议的那样。因此,如果您要将标记提供给斯坦福工具之一,请像这样标记您的文本以获得工具期望的标记:

from nltk.tokenize.stanford import StanfordTokenizer
tokenize = StanfordTokenizer().tokenize

alltext = myfile.read()
tokenized_text = tokenize(alltext)

要使用此方法,您需要安装 Stanford 工具,并且 nltk 必须能够找到它们。我假设您已经解决了这个问题,因为您使用的是斯坦福 NER 工具。

【讨论】:

  • 应该足以使用 word_tokenize ,因为它在其中发送了_tokenize? nltk.org/_modules/nltk/tokenize.html
  • 你是对的!在版本 2 中并非如此:word_tokenize 如果在整个文本中调用,偶尔会在句子边界给出不同的标记。我喜欢新设计:-)
【解决方案2】:

逗号需要是单独的标记。仅使用 split() 并不能完成此操作,因此 NER 标记器无法识别像“California”这样的标记。

如果您想获得与在 Java 中使用 Stanford CoreNLP 类似的行为,我建议使用 nltk 包装器进行标记化:http://www.nltk.org/_modules/nltk/tokenize/stanford.html

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 2011-08-08
    • 1970-01-01
    • 2016-10-27
    • 2011-07-26
    • 2022-11-10
    • 2016-12-23
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多