9

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

有什么例子吗?

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

会议将于 11 月至 18 日在 22 West Westin st., South Carolina, 12345 举行

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

(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 从某些文本中提取位置片段?

提前谢谢了!

4

1 回答 1

19

nltk确实有斯坦福 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 命令行工具来解析该文件,最后将输出解析回 python。因此,加载分类器的开销(我每次大约 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"]}'

希望这可以帮助。

于 2013-10-05T13:04:40.197 回答