如何提高Spacy结果的质量?

时间:2017-03-19 06:53:59

标签: python-2.7 information-extraction spacy

我已经安装了Spacy和 en_core_web_sm 数据。 如果我尝试在随机新闻文章中提取人员信息的代码,我会获得大约50%的正确数据。其余的包含问题和错误。

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这样的深度学习包更差?

2 个答案:

答案 0 :(得分:2)

使用spacy或nltk进行POS标记会根据其使用的模型为您提供原始数据。 数据将有错误,需要预处理或分类模型以过滤无效数据。 几点建议:

  1. 通过一套全面的正则表达式规则,涵盖大多数实用人名。例如忽略像“DARPA”,“CNN”,“BAFTA”,“2015Andrew”这样的人名

  2. 检查单词的每个组成部分是否存在于参考词典中,并且单词的引理与单词不同,这增加了它不是人名的可能性。 例如Mark Tailor,Rob Bolt是有效的人名,但Marked Tailored或者Robs Bolt可能不是。

  3. 再使用一个命名实体识别工具,如Stanford NER:http://www.nltk.org/_modules/nltk/tag/stanford.html,并通过模糊匹配充分利用两个输出。

  4. 用户概率模型对名称模式进行分类&胡言乱语。基于字符序列的概率分布,该模块使用马尔可夫链来识别像“jdfgwerqdv”这样的乱码,比如“溢出”或类似“andrew”这样的名称。 https://github.com/rrenaud/Gibberish-Detector

答案 1 :(得分: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,那么在看不见的单词时效果会更好。