【问题标题】:Sapcy 3.0 : can't add costum lookups for LemmatizerSpacy 3.0:无法为 Lemmatizer 添加自定义查找
【发布时间】:2021-04-13 08:17:55
【问题描述】:

我使用下面的代码将自定义 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 中没有查找表。有什么问题,我该如何解决?

【问题讨论】:

    标签: python spacy spacy-3


    【解决方案1】:

    词形分析器查找不再包含在词汇表中。它们存储在 nlp.get_pipe("lemmatizer").lookups 下的 lemmatizer 组件中。

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

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多