【发布时间】: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