Sapcy 3.0:无法为 Lemmatizer 添加服装查找

问题描述

我使用下面的代码自定义 Lookups 添加自定义 Lanuage 类:

def create_lookups():
    lookups = Lookups()
    lookups.add_table("lemma_lookup",LOOKUP)
    lookups.add_table("lemma_rules",json_to_dict('lemma_rules.json'))
    lookups.add_table("lemma_index",json_to_dict('lemma_index.json'))
    lookups.add_table("lemma_exc",json_to_dict('lemma_exc.json'))
    return lookups


def json_to_dict(filename):
    location = os.path.realpath(
        os.path.join(os.getcwd(),os.path.dirname(__file__)))
    with open(os.path.join(location,filename)) as f_in:
        return json.load(f_in)


@CustomeLanguage.factory(
    "lemmatizer",assigns=["token.lemma"],default_config={"model": None,"mode": "lookup","overwrite": False},default_score_weights={"lemma_acc": 1.0},)
def make_lemmatizer(
        nlp: Language,model: Optional[Model],name: str,mode: str,overwrite: bool
):
    lemmatizer = Lemmatizer(nlp.vocab,model,name,mode=mode,overwrite=overwrite)
    lemmatizer.lookups = create_lookups()
    return lemmatizer


但是当我实例化 CustomLanguage 时,nlp.vocab.lookups 中没有查找表。是什么问题,我该如何解决

解决方法

词表中不再出现词形还原查找。它们存储在 nlp.get_pipe("lemmatizer").lookups 下的 lemmatizer 组件中。

如果您的 lemmatizer 工厂创建这样的 lemmatizer,则加载模型的任何人都需要有这些 JSON 文件可用,否则模型将无法加载。 (查找表保存在模型中,但您的 make_lemmatizer 方法在编写时并未考虑到这一点。)

相反,创建一个自定义词形还原类,在其 initialize 方法中加载这些表,然后您的代码将如下所示添加词形还原器并加载一次其表。

nlp = spacy.blank("lg")
nlp.add_pipe("lemmatizer").initialize()
nlp.to_disk("/path/to/model")

一旦您为 lemmatizer 运行了一次 initialize(),表将与模型目录一起保存,您无需在重新加载模型时再次运行它。

它可能看起来像这样,如果您愿意,它还允许您将 Lookups 对象传递给 initialize

class CustomLemmatizer(Lemmatizer):
    def initialize(
        self,get_examples: Optional[Callable[[],Iterable[Example]]] = None,*,nlp: Optional[Language] = None,lookups: Optional[Lookups] = None,):
        if lookups is None:
            self.lookups = create_lookups()
        else:
            self.lookups = lookups

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...