nltk没有将$NLTK_DATA添加到搜索路径中吗?
nltk没有将$NLTK_DATA添加到搜索路径中吗?
在Linux下,我已经设置了环境变量$NLTK_DATA('/home/user/data/nltk'),并且上面的测试按预期工作。
但是当运行另一个Python脚本时,我得到了以下错误:
查找错误:
**********************************************************************
资源u'tokenizers/punkt/english.pickle'未找到。请使用NLTK Downloader获取资源:>>>
nltk.download()
搜索路径:
- '/home/user/nltk_data'
- '/usr/share/nltk_data'
- '/usr/local/share/nltk_data'
- '/usr/lib/nltk_data'
- '/usr/local/lib/nltk_data'
- u''
正如我们所看到的,nltk没有将$NLTK_DATA添加到搜索路径中。在手动添加NLTK_DATA目录之后:
nltk.data.path.append("/NLTK_DATA_DIR");
脚本按预期运行,问题是:
如何让nltk自动将$NLTK_DATA添加到其搜索路径中?
问题出现的原因是因为NLTK在搜索路径中没有添加$NLTK_DATA。解决方法是在python脚本中使用
import nltk nltk.path.append('/home/alvas/some_path/nltk_data/')
将$NLTK_DATA添加到搜索路径中。
具体操作如下:
1. 将nltk_data目录移动到NLTK无法自动找到的非标准路径下。
2. 使用nltk.path.append()
方法将路径添加到NLTK的搜索路径中。
3. 检查是否成功添加路径。
4. 将nltk_data目录移回原始路径并检查是否正常工作。
如果希望NLTK自动找到nltk_data目录,可以使用以下代码:
import scandir import os, sys import time import nltk def find(name, path): for root, dirs, files in scandir.walk(path): if root.endswith(name): return root def find_nltk_data(): start = time.time() path_to_nltk_data = find('nltk_data', '/') print >> sys.stderr, 'Finding nltk_data took', time.time() - start print >> sys.stderr, 'nltk_data at', path_to_nltk_data with open('where_is_nltk_data.txt', 'w') as fout: fout.write(path_to_nltk_data) return path_to_nltk_data def magically_find_nltk_data(): if os.path.exists('where_is_nltk_data.txt'): with open('where_is_nltk_data.txt') as fin: path_to_nltk_data = fin.read().strip() if os.path.exists(path_to_nltk_data): nltk.data.path.append(path_to_nltk_data) else: nltk.data.path.append(find_nltk_data()) else: path_to_nltk_data = find_nltk_data() nltk.data.path.append(path_to_nltk_data) magically_find_nltk_data() print nltk.pos_tag('this is a foo bar'.split())
如果想要一次性解决此问题,可以添加系统变量。在调用python脚本之前,在终端中执行export NLTK_DATA=/home/alvas/some_path/nltk_data/
命令。
如果在Windows中运行出现错误AttributeError: module 'nltk' has no attribute 'path'
,可能是因为文件名为nltk.py
,请更改文件名尝试。
正确的语法是nltk.data.path.append
,如原始问题中所示。
NLTK是一个流行的自然语言处理工具包,可以用于文本分析和处理。在使用NLTK时,有时可能会遇到一个问题,即NLTK不会将NLTK_DATA添加到搜索路径中。这个问题的出现是因为在conda环境中安装NLTK数据时,我们不希望在每个脚本中指定数据位置或导出环境变量。为了解决这个问题,我们可以按照以下步骤进行操作:
1. 激活所需的conda环境。
2. 在conda环境中打印sys.prefix,并复制该路径(假设为/home/dickens/envs/nltk_env)。
3. 在conda环境中运行nltk.download(),选择所需的包,并将上述路径追加为下载位置的一部分。例如,在我们的情况下,路径将变为/home/dickens/envs/nltk_env/share/nltk_data。
4. 现在,问题已解决,可以开始使用NLTK了。
通过按照以上步骤操作,我们可以成功解决NLTK不将NLTK_DATA添加到搜索路径中的问题,从而在使用NLTK时无需指定数据位置或导出环境变量。