首页 > 解决方案 > 是否可以使用自定义命名实体改善 spaCy 的相似性结果?

问题描述

我发现 spaCy 的相似性在使用开箱即用的“en_core_web_lg”比较我的文档方面做得不错。

我想加强某些领域的关系,并认为向模型添加自定义 NER 标签会有所帮助,但我之前和之后的结果没有任何改进,即使我已经能够创建自定义实体的测试集。

现在我想知道,我的理论是完全错误的,还是我只是在管道中遗漏了一些东西?

如果我错了,改善结果的最佳方法是什么?似乎某种自定义标签应该有所帮助。

这是我迄今为止测试过的一个例子:

import spacy
from spacy.pipeline import EntityRuler
from spacy.tokens import Doc
from spacy.gold import GoldParse

nlp = spacy.load("en_core_web_lg")

docA = nlp("Add fractions with like denominators.")
docB = nlp("What does one-third plus one-third equal?")

sim_before = docA.similarity(docB)
print(sim_before)

0.5949629181460099

^^ 不是太破旧,但我希望在这个例子中看到接近 0.85 的结果。
因此,我使用 EntityRuler 并添加一些模式来尝试加强关系:

ruler = EntityRuler(nlp)
patterns = [
    {"label": "ADDITION", "pattern": "Add"},
    {"label": "ADDITION", "pattern": "plus"},
    {"label": "FRACTION", "pattern": "one-third"},
    {"label": "FRACTION", "pattern": "fractions"},
    {"label": "FRACTION", "pattern": "denominators"},

]
ruler.add_patterns(patterns)
nlp.add_pipe(ruler, before='ner')
print(nlp.pipe_names)

['tagger', 'parser', 'entity_ruler', 'ner']

添加 GoldParse 似乎很重要,所以我添加了以下内容并更新了 NER:

doc1 = Doc(nlp.vocab, [u'What', u'does', u'one-third', u'plus', u'one-third', u'equal'])
gold1 = GoldParse(doc1, [u'0', u'0', u'U-FRACTION', u'U-ADDITION', u'U-FRACTION', u'O'])

doc2 = Doc(nlp.vocab, [u'Add', u'fractions', u'with', u'like', u'denominators'])
gold2 = GoldParse(doc2, [u'U-ADDITION', u'U-FRACTION', u'O', u'O', u'U-FRACTION'])

ner = nlp.get_pipe("ner")
losses = {}
optimizer = nlp.begin_training()
ner.update([doc1, doc2], [gold1, gold2], losses=losses, sgd=optimizer)

{'ner':0.0}

您可以看到我的自定义实体正在工作,但测试结果显示零改进:

test1 = nlp("Add fractions with like denominators.")
test2 = nlp("What does one-third plus one-third equal?")

print([(ent.text, ent.label_) for ent in test1.ents])
print([(ent.text, ent.label_) for ent in test2.ents])

sim = test1.similarity(test2)
print(sim)

[('Add', 'ADDITION'), ('fractions', 'FRACTION'), ('分母', 'FRACTION')]
[('one-third', 'FRACTION'), ('plus', '添加'), ('三分之一', '分数')]
0.5949629181460099

任何提示将非常感谢!

标签: spacysimilaritynamed-entity-recognition

解决方案


Doc.similarity仅使用词向量,不使用任何其他注释。从文档 API

默认估计是使用词向量平均值的余弦相似度。


推荐阅读