2017-03-19 88 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