python NLTK 中使用 StanfordNER 识别 NE 的问题

issue recognizing NEs with StanfordNER in python NLTK

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

"These names Praveen Kumar,, David Harrison, Paul Harrison, blah "

"California, United States"

我的输出分别如下。

[[(u'These', 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')]]

为什么不识别"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() 标记了输入 stirng 吗?我该如何解决这个问题,因为它在 Java 中尝试时工作正常?

逗号需要是单独的标记。仅使用 split() 并不能实现这一点,因此 NER 标记器无法识别像 "California,".

这样的标记

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

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

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

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

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

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

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