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 工具。
当可能的 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 工具。