我在spacy中使用名词_chunks,在textblob中使用np_extractor来查找某些文章中的所有短语。 他们将某些技术术语解析为错误。例如:“ ANOVA也称为方差分析”,结果显示名词短语是“ ANOVA”,“ analysis”,“ variance”,但我认为正确的名词短语是“ ANOVA”,“ variance analysis”。 我已经有一个短语列表,其中包含一些技术短语,我认为它可以帮助解析。如何使用此列表重新训练或改进名词短语提取器?
答案 0 :(得分:1)
这听起来像是rule-based matching的好用例。在像您这样的场景中,该功能特别强大,您可以将统计模型(例如,基于词性标记和依存关系的名词块)与您自己的规则结合起来,以覆盖其余的特定情况。
这是一个简单的例子:
import spacy
from spacy.matcher import PhraseMatcher
nlp = spacy.load("en_core_web_sm")
matcher = PhraseMatcher(nlp.vocab)
# This is just an example – see the docs for how to do this more elegantly
matcher.add("PHRASES", None, nlp("ANOVA"), nlp("analysis of variance"))
doc = nlp("A text about analysis of variance or ANOVA")
matches = matcher(doc)
for match_id, start, end in matches:
matched_span = doc[start:end]
print(matched_span.text)
# analysis of variance
# ANOVA
通过匹配项的start
和end
索引,您可以创建一个跨度–因此,最终将得到Span
个对象,就像doc.noun_chunks
返回的对象一样。如果您想更优雅地解决此问题,还可以添加doc._.custom_noun_chunks
之类的custom attribute,在Doc
上运行匹配器,并返回匹配的跨度,甚至匹配的跨度 plus 原始名词块。
顺便说一句,doc.noun_chunks
基于词性标记和依赖项解析。您可以查看代码以英语here进行计算。从理论上说,您可以通过微调标记器和解析器来改善名词组块,但这种方法似乎有点过头了,并且对您的用例更具投机性。如果您已经有了词组列表,则不妨直接将其匹配。