这可能:使用NLTK获得(类似)斯坦福命名实体识别器功能吗?
有什么例子吗?
特别是,我对提取文本的LOCATION部分感兴趣。例如,来自文本
会议将于12345年在南卡罗来纳州威斯汀西区22号举行 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的一部分,南卡罗来纳州是一个位置,而不是一些“GPE / NNP”:?
我做错了什么?如何修复它以使用NLTK从某些文本中提取位置片?
非常感谢提前!
答案 0 :(得分:19)
nltk DOES 拥有Stanford 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只会将目标句子写入文件并运行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
然后转到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"]}'
希望这有帮助。