Stanford使用NLTK命名实体识别器(NER)功能

bzd*_*boo 9 location named-entity-recognition nltk

这是可能的:使用NLTK获得(类似)斯坦福命名实体识别器功能吗?

有什么例子吗?

特别是,我感兴趣的是提取LOCATION部分文本.例如,来自文本

会议将于11月18日在南卡罗来纳州威斯汀西区22号12345举行

理想情况下,我想得到类似的东西

(S  
22/LOCATION
(LOCATION West/LOCATION Westin/LOCATION)
st./LOCATION
,/,
(South/LOCATION Carolina/LOCATION)
,/,
12345/LOCATION
Run Code Online (Sandbox Code Playgroud)

.....

或者干脆

22 West Westin st., South Carolina, 12345
Run Code Online (Sandbox Code Playgroud)

相反,我只能得到

(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-)
Run Code Online (Sandbox Code Playgroud)

请注意,如果我将文本输入 http://nlp.stanford.edu:8080/ner/process,我得到的结果远非完美(街道号和邮政编码仍然缺失),但至少"st." 是LOCATION的一部分,南卡罗来纳州是一个位置,而不是一些"GPE/NNP":?

我做错了什么?如何修复它以使用NLTK从某些文本中提取位置片?

提前谢谢了!

jun*_*iah 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()) 
Run Code Online (Sandbox Code Playgroud)

输出:

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

但是每次调用时tag,nltk只需将目标语句写入文件并运行Stanford NER命令行工具来解析该文件,最后将输出解析回python.因此,加载分类器(每次约1分钟)的开销是不可避免的.

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

首先运行Stanford NER作为服务器

java -mx1000m -cp stanford-ner.jar edu.stanford.nlp.ie.NERServer \
-loadClassifier classifiers/english.all.3class.distsim.crf.ser.gz -port 9191
Run Code Online (Sandbox Code Playgroud)

然后去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"]}'
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 对于那些从pyner得到空实体集(`{}`)的人,[这里是解决方案](https://github.com/dat/pyner/issues/2#issuecomment-51715087):`tagger = ner. SocketNER(host ='localhost',port = xxxx,output_format ='slashTags')` (2认同)