【问题标题】:Creating a Python module in the namespace of an external library (custom spaCy language)在外部库的命名空间中创建 Python 模块(自定义 spaCy 语言)
【发布时间】:2021-05-31 10:57:04
【问题描述】:

这个问题是在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 命名空间内(因为没有更好的词)?

【问题讨论】:

    标签: python-3.x setuptools spacy


    【解决方案1】:

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

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

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

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

    如果这个包安装在你的环境中,那么spacy.blank("ka") 应该找到这个类并将其加载为Georgian(),而不需要任何额外的步骤。同样,prodigy 应该能够将空白语言管道加载为blank:ka

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

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

    【讨论】:

    • 对于我的特定问题,这是一个非常好的答案。我会将答案标记为已接受,但我想看看是否有人有使用包装方面的意见/想法,这是对您的解决方案的补充。
    • 检查 find_namespace_packages 是否为您的包结构返回正确的输出。尝试只使用["spacy.lang.ka"],或使用include=["spacy.lang.*"] 限制它。在任何情况下,入口点都是推荐/测试的方法。
    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    相关资源
    最近更新 更多