微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在外部库的命名空间中创建 Python 模块自定义 spaCy 语言

如何解决在外部库的命名空间中创建 Python 模块自定义 spaCy 语言

这个问题是在向 spaCy v2 library 添加语言的上下文中,但它可能是一个通用的 Python 打包问题。

在 spaCy 中,语言是 Language 基类的子类,并且大部分工具都希望将给定语言放置在规范命名的包中(例如 spacy.lang.en 表示英语)。

有多种方法可以满足此要求(例如,@spacy.registry.languages),但这通常需要进行一些权衡(例如,您必须先导入一些代码注册您的类,然后一切正常,但是当您拥有诸如自定义脚本、prodigy 食谱、库等工具,这些工具不允许您“注入”自定义导入或有自己的方式这样做,这不起作用 - 或者通常容易出错)。如果有办法,我很乐意听到有关缓解此问题的建议。

所以我想我只是把我的语言放在 spaCy 期望的地方,我会没事的。创建语言子类是 documented enough

所以我引导了一个库:

lib/
  src/
    spacy/
      lang/
        ka/ # example of a language that spaCy does not kNow about
          __init.py__ # my language subclass
  setup.py

init.py 是一种简单的语言(简化):

import spacy
from spacy.language import Language


class GeorgianDefaults(Language.Defaults):

@spacy.registry.languages("ka")
class Georgian(Language):
    lang = "ka"
    Defaults = GeorgianDefaults

我的 setup.py 是一个标准的,使用本地命名空间包:

setup(
    name="my-spacy-extras",packages=find_namespace_packages(where="src"),package_dir={"": "src"},install_requires=[
        "spacy>=2.3.0,<3.0.0"
    ]
)

我考虑使用本机命名空间包,因为据我所知,这是用于此用例的现代方法

但是当我打包代码时(或者真的只是设置一个 virtualenv 和 pip install -Ur requirements.txt,要求是一个简单的 -e .),我感到害怕

ModuleNotFoundError: No module named 'spacy.lang.ka'

认为这是因为 spaCy 本身(请参阅 repo)不使用本机命名空间打包,但由于它既不使用 pkgutil 样式的包,我开始想知道这是否可以奏效。

那么,我有没有办法将我的自定义语言创建为一个模块,并将其打包在一个库中,在 spacy 命名空间内(因为没有更好的词)?

解决方法

请务必遵循 spaCy v2 的 v2 文档,因为存在许多差异。 (注册表装饰器是 v3 中的新增功能)。

spaCy v2 支持自定义语言的入口点:https://v2.spacy.io/usage/saving-loading#entry-points

您的包将有自己的名称(不是 spacy),您可以通过在 spacy_languages 中的 setup.py 下添加入口点在 spaCy v2 中添加自定义语言:

    entry_points={
        "spacy_languages": [
            "ka = spacy_lang_ka:Georgian",]
    }

如果您的环境中安装了此软件包,则 spacy.blank("ka") 应查找此类并将其加载为 Georgian(),无需任何额外步骤。同样,prodigy 应该能够将空白语言管道加载为 blank:ka

setup.py v0.2.5 中显示了一个完整的 spacy-stanza 示例:

https://github.com/explosion/spacy-stanza/blob/v0.2.5/setup.py

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。