spacy - 是否可以使用自定义命名实体改善 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
任何提示将非常感谢!
解决方案
Doc.similarity
仅使用词向量,不使用任何其他注释。从文档 API:
默认估计是使用词向量平均值的余弦相似度。
推荐阅读
- c - 在 Luhn's Alg 上制作了一个脚本。无法理解如何为修改后的脚本清晰地创建和调用函数
- android - Firestore 的文档 ID 有多独特?考虑超过百万份文件
- java - SpringBoot CRUD
- jmeter - How to wait until I get a specific response in jmeter?
- python - docker上的Python打印到标准输出
- javascript - 使用 react-redux-toolkit 在 React 中获取未定义的 useSelector
- delphi - 没有发送者的呼叫过程
- c++ - 高效的样条多边形光栅化
- json - 使用 jpath 从 Json 获取值
- javascript - 如何匹配 JavaScript 中的文件名模式?