在 Spacy 中扩展引理查找表

hou*_*zi0 5 python nlp python-3.x spacy

我目前正在使用 NLP 库 Spacy 处理文本。然而,Spacy 并没有正确地对所有单词进行词形还原,因此我想扩展查找表。目前我正在将 Spacy 的常量查找表与我的扩展程序合并,然后覆盖 Spacy 的本机查找表。

然而,我有一种感觉,这种方法可能不是最好和最一致的方法。

问题:是否有另一种可能来更新 Spacy 中的查找表,例如更新或扩展功能?我已阅读文档,但找不到类似的内容。还是这种方法“很好”?

我当前方法的工作示例:

import spacy
nlp = spacy.load('de')
Spacy_lookup = spacy.lang.de.LOOKUP
New_lookup = {'AAA':'Anonyme Affen Allianz','BBB':'Berliner Bauern Bund','CCC':'Chaos Chaoten Club'}
Spacy_lookup.update(New_lookup)
spacy.lang.de.LOOKUP = Spacy_lookup
tagged = nlp("Die AAA besiegt die BBB und den CCC unverdient.")
[ print(each.lemma_) for each in tagged]

Die
Anonyme Affen Allianz
besiegen
der
Berliner Bauern Bund
und
der
Chaos Chaoten Club
unverdient
.
Run Code Online (Sandbox Code Playgroud)

gda*_*ras 4

你的解决方案看起来不错。

然而,我更干净的解决方法是利用自定义 spaCy 管道功能。具体来说,您可以创建一个新组件,如果令牌位于您的文档中,则该组件会更新 lemma 属性,然后将其堆栈到您的管道中。

示例代码:

import spacy
custom_lookup = {'AAA':'Anonyme Affen Allianz','BBB':'Berliner Bauern Bund','CCC':'Chaos Chaoten Club'}

def change_lemma_property(doc):
    for token in doc:
        if (token.text in custom_lookup):
            token.lemma_ = custom_lookup[token.text]
    return doc

nlp = spacy.load('de')
nlp.add_pipe(change_lemma_property, first=True)
text = 'Die AAA besiegt die BBB und den CCC unverdient.'
doc = nlp(text)
[print(x.lemma_) for x in doc]
Run Code Online (Sandbox Code Playgroud)