不同结果在python3.5中的StanfordNERTagger - Stanford-ner-2015-12-09

时间:2016-07-22 08:43:00

标签: python-3.x nlp nltk stanford-nlp named-entity-recognition

我试着运行一个例句:

from nltk.tag import StanfordNERTagger
_model_filename = r'D:/standford/stanford-ner-2015-12-09/classifiers/english.all.3class.distsim.crf.ser.gz'

_path_to_jar = r'D:/standford/stanford-ner-2015-12-09/stanford-ner.jar'

st = StanfordNERTagger(model_filename=_model_filename, path_to_jar=_path_to_jar)

st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) 

我的输出如下所示:python:

  

[(' Rami',' PERSON'),(' Eid',' PERSON'),'是& #39;,' O'),('学习',   ' O'),(' at',' O'),(' Stony','组织'), ('布鲁克&#39 ;,   '组织'),('大学','组织'),(' in',' O'), (' NY&#39 ;,   ' O&#39)]

虽然我预计纽约也会根据此reference选择地点。

我尝试了另一个例子如下:

st.tag('Ali is living in London.'.split())

结果如下所示是正确的。

  

[(' Ali',' PERSON'),('是',' O'),'生活& #39;,' O'),(' in',' O'),   ('伦敦。',' LOCATION')]

你知道为什么它没有认出纽约作为第一句话的位置吗?

我正在使用visual studio 2015,Python 3.5,Stanford-ner-2015-12-09

1 个答案:

答案 0 :(得分:1)

斯坦福NER工具经过适当格式化的新闻文本培训,因此标点符号非常重要。来自docs

  

Stanford NER是命名实体识别器的Java实现。   命名实体识别(NER)标记文本中的单词序列   这些是事物的名称,例如人员和公司名称,或   基因和蛋白质名称。它具有精心设计的功能   命名实体识别的提取器,以及许多用于定义的选项   特征提取器。下载中包含良好的命名实体   英语识别者,特别是3个班级(PERSON,   组织,位置),我们也在此页面上提供   针对不同语言和环境的各种其他模型,   包括仅通过CoNLL 2003英语培训数据培训的模型。

来自CoNLL 2003 doc

  

英文数据是来自的新闻线文章的集合   路透社语料库。注释已由人们完成   安特卫普大学。由于版权原因我们只做   提供注释。为了构建完整的数据集   您将需要访问路透社语料库。它可以获得   研究目的,无需NIST任何指控。

通过在示例句子中添加fullstop,你应该得到你想要的输出,但仍然没有模型是完美的=)

alvas@ubi:~$ export STANFORDTOOLSDIR=$HOME
alvas@ubi:~$ export CLASSPATH=$STANFORDTOOLSDIR/stanford-ner-2015-12-09/stanford-ner.jar
alvas@ubi:~$ export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-ner-2015-12-09/classifiers
alvas@ubi:~$ python3
Python 3.5.2 (default, Jul  5 2016, 12:43:10) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from nltk.tag import StanfordNERTagger
>>> st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')
>>> sent = 'Rami Eid is studying at Stony Brook University in NY .'.split()
>>> st.tag(sent)
[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'), ('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'), ('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'LOCATION'), ('.', 'O')]
>>> sent = 'Rami Eid is studying at Stony Brook University in NY'.split()
>>> st.tag(sent)
[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'), ('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'), ('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'O')]