我在我的项目中使用 NLTK 和 wordnet。我在我的电脑上使用 pip 手动安装:
pip3 install nltk --user
在终端中,然后 nltk.download()
在 python shell 中下载 wordnet。
我想用
setup.py
文件自动化这些,但我不知道安装 wordnet 的好方法。
目前,我在调用
setup
之后有这段代码("nltk"
位于调用install_requires
的setup
列表中):
import sys
if 'install' in sys.argv:
import nltk
nltk.download("wordnet")
有更好的方法吗?
我设法通过用我自己的
cmdclass
类覆盖 Install
来在 setup.py 中安装 NLTK 数据:
from setuptools import setup, find_packages
from setuptools.command.install import install as _install
class Install(_install):
def run(self):
_install.do_egg_install(self)
import nltk
nltk.download("popular")
setup(...
cmdclass={'install': Install},
...
install_requires=[
'nltk',
],
setup_requires=['nltk']
...
)
在调用
do_egg_install()
之前,在 run()
方法中使用 import nltk
方法来确保安装 nltk 非常重要(另请参阅此处 python setuptools install_requires 在覆盖 cmdclass 时被忽略)。另外,不要忘记将 nltk
添加到 setup_requires
。
您还可以使用 shell 脚本自动安装,例如运行(在 pip 安装 nltk 之后):
python -m nltk.downloader -d /usr/share/nltk_data wordnet
如本线程所述,外部数据不应由setup.py 中的setuptools 处理。作为替代方案,我建议在包的
__init__.py
文件中包含以下行(放置您要下载 punkt
和 stopwords
的案例):
__version__ = "x.x.x"
__organization__ = "your_organization"
import nltk
nltk.download("stopwords")
nltk.download("punkt")
这样,安装包时不会下载文件,而是导入包时(即
import my_package
)。
作为一个示例我分享了一个链接到一个Python库,它就是这样做的。
首先你必须安装库:
pip install -U pyleetspeak
然后导入库就会下载NLTK文件:
import pyleetspeak
pyleetspeak.__version__
这个设置对我有用:
import nltk
from setuptools import setup, find_packages
from setuptools.command.install import install
class InstallCommand(install):
def run(self):
install.run(self)
nltk.download('wordnet')
setup(
# other options...
install_requires=['nltk'],
cmdclass={
'install': InstallCommand,
}
)