2017-03-19 87 views
1

我已經安裝了Spacy和en_core_web_sm數據。 如果我嘗試我的代碼,應該提取隨機新聞文章中的人員信息,我可以獲得大約50%的正確數據。其餘包含問題和錯誤。如何提高Spacy結果的質量?

import spacy 
import io 

from spacy.en import English 
from spacy.parts_of_speech import NOUN 
from spacy.parts_of_speech import ADP as PREP 

nlp = English() 
ents = list(doc.ents) 
for entity in ents: 
    if entity.label_ == 'PERSON': 
     print(entity.label, entity.label_, ' '.join(t.orth_ for t in entity)) 

在此文件,例如: http://www.abc.net.au/news/2015-10-30/is-nauru-virtually-a-failed-state/6869648 我得到這些結果:

(377, u'PERSON', u'Lukas Coch)\\nMap') 
(377, u'PERSON', u'\\"never') 
(377, u'PERSON', u'Julie Bishop') 
(377, u'PERSON', u'Tanya Plibersek') 
(377, u'PERSON', u'Mr Eames') 
(377, u'PERSON', u'DFAT') 
(377, u'PERSON', u'2015Andrew Wilkie') 
(377, u'PERSON', u'Daniel Th\xfcrer') 
(377, u'PERSON', u'Australian Aid') 
(377, u'PERSON', u'Nauru') 
(377, u'PERSON', u'Rule') 

這怎麼可能增加結果的質量?

整個en_core_web_md有幫助嗎?

或者那些NLP庫方法總是比像TensorFlow這樣的深度學習包更糟?

回答

0

一般來說,POS標記只能代表數據,在未標記數據被標記的情況下,標記可能不如可靠。

SpaCy使用Perceptron標記模型,這是一種人工神經模型。它很可能與其他TensorFlow型號非常相似。

看起來大多數情況下使用PERSON,這是正確的(6/11),因此改善數據和再培訓可能是最好的解決方案。

取自SpaCy website on training,您可以重新訓練模型,添加錯誤標記的附加數據。

from spacy.vocab import Vocab 
from spacy.tagger import Tagger 
from spacy.tokens import Doc 
from spacy.gold import GoldParse 
vocab = Vocab(tag_map={'N': {'pos': 'NOUN'}, 'V': {'pos': 'VERB'}}) 
tagger = Tagger(vocab) 
doc = Doc(vocab, words=['I', 'like', 'stuff']) 
gold = GoldParse(doc, tags=['N', 'V', 'N']) 
tagger.update(doc, gold) 
tagger.model.end_training() 

如果您添加自己的vocab,它將在未見過的單詞的情況下表現更好。

1

使用spacy或nltk進行POS標記會爲您提供基於其使用模型的原始數據。 數據將有錯誤,需要預處理或分類模型以過濾無效數據。 幾點建議:

  1. 通過它通過一套全面的將涵蓋最現實的人的名字正則表達式規則。例如忽略諸如「DARPA」,「CNN」,「BAFTA」,「2015Andrew」之類的人名稱

  2. 檢查單詞的每個成分是否存在於參考字典中,並且該單詞的詞條與該單詞不同,它不是一個人的名字的可能性。 例如Mark Tailor,Rob Bolt是有效的人名,但Marked Tailored或Robs Bolt可能不是。

  3. 使用另一個命名實體識別工具,如斯坦福NER:http://www.nltk.org/_modules/nltk/tag/stanford.html並通過模糊匹配充分利用兩個輸出。

  4. 用戶概率模型來分類名稱模式&胡言亂語。根據字符序列的概率分佈,該模塊使用馬爾可夫鏈來識別諸如「jdfgwerqdv」之類的亂碼,而與諸如「溢出」之類的字或諸如「安德魯」之類的名稱相比,該模塊可識別亂碼。 https://github.com/rrenaud/Gibberish-Detector