2013-08-22 107 views
9

这是可能的:获得(类似于)斯坦福命名实体识别器功能只使用NLTK?斯坦福大学命名实体识别器(NER)功能与NLTK

有没有例子?

特别是,我对提取LOCATION部分文本感兴趣。例如,从文本

会议将于22西威斯汀日,南卡罗来纳州,12345 11月18

理想举行我想获得像

(S 
22/LOCATION 
(LOCATION West/LOCATION Westin/LOCATION) 
st./LOCATION 
,/, 
(South/LOCATION Carolina/LOCATION) 
,/, 
12345/LOCATION 

.....

或者干脆

22 West Westin st., South Carolina, 12345 

相反,我只能够得到

(S 
    The/DT 
    meeting/NN 
    will/MD 
    be/VB 
    held/VBN 
    at/IN 
    22/CD 
    (LOCATION West/NNP Westin/NNP) 
    st./NNP 
    ,/, 
    (GPE South/NNP Carolina/NNP) 
    ,/, 
    12345/CD 
    on/IN 
    Nov.-18/-NONE-) 

需要注意的是,如果我输入文本http://nlp.stanford.edu:8080/ner/process我得到的结果远非完美(门牌号和邮政编码仍然下落不明),但至少“ST。 “是LOCATION的一部分,南卡罗来纳州是LOCATION,而不是一些“GPE/NNP”:?

我在做什么错了?我该如何解决它以使用NLTK从一些文本中提取位置片?

非常感谢提前!

回答

19

nltk DOES有一个斯坦福NER的接口,检查nltk.tag.stanford.NERTagger

from nltk.tag.stanford import NERTagger 
st = NERTagger('/usr/share/stanford-ner/classifiers/all.3class.distsim.crf.ser.gz', 
       '/usr/share/stanford-ner/stanford-ner.jar') 
st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) 

输出:

[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'), 
('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'), 
('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'LOCATION')] 

但是每次调用tag时间,NLTK只是将目标句子到一个文件并运行斯坦福NER命令行工具来解析该文件并最终解析输出回蟒蛇。因此,加载分类器的开销(每次大约1分钟)是不可避免的。

如果这是个问题,请使用Pyner

首先运行斯坦福NER作为服务器

java -mx1000m -cp stanford-ner.jar edu.stanford.nlp.ie.NERServer \ 
-loadClassifier classifiers/english.all.3class.distsim.crf.ser.gz -port 9191 

然后去pyner文件夹

import ner 
tagger = ner.SocketNER(host='localhost', port=9191) 
tagger.get_entities("University of California is located in California, United States") 
# {'LOCATION': ['California', 'United States'], 
# 'ORGANIZATION': ['University of California']} 
tagger.json_entities("Alice went to the Museum of Natural History.") 
#'{"ORGANIZATION": ["Museum of Natural History"], "PERSON": ["Alice"]}' 

希望这有助于。

+1

你知道我是否可以训练斯坦福大学的NER吗?我尝试过。 “绿野仙踪离开了祖母绿城。”和“亚历山大大帝征服波斯帝国”。都没有工作。 – Hans

+0

@edfward java在端口9191上运行它,但python在8080端口上运行它。为什么? – bernie2436

+0

@ akh2103我的错。我已经在答案中更正了,他们应该是一致的,而实际的端口可能会有所不同。 – junjiah

相关问题