【问题标题】:How to increase quality of Spacy results?如何提高 Spacy 结果的质量?
【发布时间】:2017-03-19 06:53:58
【问题描述】:

我已经安装了 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 等深度学习包差?

【问题讨论】:

    标签: python-2.7 information-extraction spacy


    【解决方案1】:

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

    1. 通过一套全面的正则表达式规则传递它,这些规则将涵盖大多数实际的人名。例如忽略“DARPA”、“CNN”、“BAFTA”、“2015Andrew”等人名

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

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

    4. 使用概率模型对名称模式和乱码进行分类。这个模块使用马尔可夫链来识别像“jdfgwerqdv”这样的乱码,而不是像“overflow”这样的词或像“andrew”这样的名字,基于字符序列的概率分布。 https://github.com/rrenaud/Gibberish-Detector

    【讨论】:

      【解决方案2】:

      一般来说,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,它会在不可见单词的情况下表现得更好。

      【讨论】:

        猜你喜欢
        • 2016-11-14
        • 2020-10-02
        • 2023-01-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2021-04-29
        相关资源
        最近更新 更多