加载 NLTK 感知器标记器时出现 IOError

IOError when loading NLTK perceptron tagger

代码简单如下

import nltk
nltk.data.path.append(r"E:\nltk_data")
nltk.pos_tag(["hello"])

错误是

File "C:\Program Files (x86)\IronPython
2.7\lib\site-packages\nltk\tag\__init__.py", line 110, in pos_tag
    tagger = PerceptronTagger()   File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\nltk\tag\perceptron.py", line 141, in __init__
    self.load(AP_MODEL_LOC)   File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\nltk\tag\perceptron.py", line 209, in load
    self.model.weights, self.tagdict, self.classes = load(loc)   File "C:\Program Files (x86)\IronPython
2.7\lib\site-packages\nltk\data.py", line 800, in load
    # Load the resource.   File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\nltk\data.py", line 921, in _open
    # urllib might not use mode='rb', so handle this one ourselves:   File "C:\Program Files (x86)\IronPython
2.7\lib\site-packages\nltk\data.py", line 603, in find
    if zipfile is None:   File "C:\Program Files (x86)\IronPython 2.7\Lib\nturl2path.py", line 26, in url2pathname
    raise IOError, error IOError: Bad URL: /C|/E|/nltk_data/taggers/averaged_perceptron_tagger/averaged_perceptron_tagger.pickle

为什么 url 变成了 /C|/E|/nltk_data/tagg...,为什么它首先需要调用 url2pathname?我已经在使用 Windows 并且我提供的 url 是 Windows 样式 url.

您的代码正在转义 \n:

\ 替换为 \

import nltk
nltk.data.path.append(r"E:\nltk_data")
nltk.pos_tag(["hello"])

你可以参考这个问题:What exactly do "u" and "r" string flags do in Python, and what are raw string literals?

有关原始字符串文字如何工作的更多信息。

我不得不深入研究代码,终于找到了问题所在。 nltk用if sys.platform.startswith('win'):判断操作系统(非常专业的判断方式,顺便说一句)

但是,如果您使用 IronPython,您的平台是 CLI

我怀疑这会给 IronPython 用户带来很多问题。因此,下次任何 Python 包的行为都像它的 unix 对应包时,只需检查模块中是否有此代码。

编辑: 我的解决方法是用 sys.platform.startswith('win') or sys.platform.startswith('cli') 替换校验码。