[英]Python NLTK NER tagger - won't return ngrams longer than 1
我想從utf-8文本中提取實體,但似乎無法獲取nltk.stanford.NERTagger返回大於1的ngram。
有人知道該怎么做嗎?
import nltk
NER = nltk.stanford.NERTagger("/Library/Java/Extensions/NER/classifiers/english.all.3class.distsim.crf.ser.gz",
"/Library/Java/Extensions/NER/stanford-ner.jar")
NER.tag('Game of Thrones by George R. R. Martin'.split())
輸出是這樣的:
[[(u'Game', u'O'),
(u'of', u'O'),
(u'Thrones', u'O'),
(u'by', u'O'),
(u'George', u'PERSON'),
(u'R.', u'PERSON'),
(u'R.', u'PERSON'),
(u'Martin', u'PERSON')]]
我需要這樣的東西:
[[(u'Game', u'O'),
(u'of', u'O'),
(u'Thrones', u'O'),
(u'by', u'O'),
(u'George R. R. Martin', u'PERSON')]]
我的一位同事用Java調用了相同的stanford NLP算法,並且這些實體沒有按單詞細分。
謝謝!
=====喜歡重復=====
基於亞歷克西斯在回答這個職位 ,斯坦福惡搞不公開的方式來區分兩個相鄰的命名實體和單一命名實體占用多個令牌。
話雖這么說,那里提到的解決方案只是將標記有相同實體的相鄰令牌分塊在一起通常是一種有效的啟發式方法(盡管絕對不是萬無一失的):
from itertools import groupby
from pprint import pprint
result = NER.tag('Game of Thrones by George R. R. Martin'.split())
chunked = []
for tag, chunk in groupby(result, lambda x:x[1]):
if tag == "O":
chunked.extend((w,t) for (w,t) in chunk)
else:
chunked.append((" ".join(w for (w,t) in chunk), tag))
pprint(chunked)
給出輸出:
[(u'Game', u'O'),
(u'of', u'O'),
(u'Thrones', u'O'),
(u'by', u'O'),
(u'George R. R. Martin', u'PERSON')]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.