如何解决在外部库的命名空间中创建 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 举报,一经查实,本站将立刻删除。