Python 从PlaintextCorpusReader获取句子时的NLTK断言错误

Python 从PlaintextCorpusReader获取句子时的NLTK断言错误,python,nlp,nltk,Python,Nlp,Nltk,我正在使用一个PlaintextCorpusReader处理古腾堡项目的一些文件。它似乎可以毫无问题地处理单词标记化,但在我请求句子或段落时会阻塞 我首先下载到当前目录。然后: >>> from nltk.corpus import PlaintextCorpusReader >>> r = PlaintextCorpusReader('.','Dracula.txt') >>> r.words() ['DRACULA', 'CHAPTER'

我正在使用一个PlaintextCorpusReader处理古腾堡项目的一些文件。它似乎可以毫无问题地处理单词标记化,但在我请求句子或段落时会阻塞

我首先下载到当前目录。然后:

>>> from nltk.corpus import PlaintextCorpusReader
>>> r = PlaintextCorpusReader('.','Dracula.txt')
>>> r.words()
['DRACULA', 'CHAPTER', 'I', 'JONATHAN', 'HARKER', "'", ...]
>>> r.sents()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/nltk/util.py", line 765, in __repr__
    for elt in self:
  File "/usr/local/lib/python3.5/dist-packages/nltk/corpus/reader/util.py", line 296, in iterate_from
    new_filepos = self._stream.tell()
  File "/usr/local/lib/python3.5/dist-packages/nltk/data.py", line 1333, in tell
    assert check1.startswith(check2) or check2.startswith(check1)
AssertionError
>>从nltk.corpus导入PlaintextCorpusReader
>>>r=明文微粒读取器('.','Dracula.txt')
>>>r.词语()
['DRACULA','CHAPTER','I','JONATHAN','HARKER','
>>>r.sents()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib/python3.5/dist-packages/nltk/util.py”,第765行,在__
对于自我教育:
文件“/usr/local/lib/python3.5/dist-packages/nltk/corpus/reader/util.py”,第296行,在
new\u filepos=self.\u stream.tell()
文件“/usr/local/lib/python3.5/dist-packages/nltk/data.py”,第1333行,在tell中
断言check1.startswith(check2)或check2.startswith(check1)
断言错误
我试着用各种方式修改这本书:去掉页眉,删除换行符,在结尾加上句号来完成最后一句话。错误依然存在。我做错什么了吗?或者我在NLTK中遇到了一些限制

(在Ubuntu上运行Python3.5.0、NLTK 3.2.1。其他Python3.x版本也会出现这个问题。)

编辑:内省在异常点显示以下局部变量

>>> pprint.pprint(inspect.trace()[-1][0].f_locals)
{'buf_size': 63,
 'bytes_read': 75,
 'check1': "\n\n\n CHAPTER I\n\nJONATHAN HARKER'S JOURNAL\n\n(_Kept i",
 'check2': '\n'
           '\n'
           ' CHAPTER I\n'
           '\n'
           "JONATHAN HARKER'S JOURNAL\n"
           '\n'
           '(_Kept in shorthand._)',
 'est_bytes': 9,
 'filepos': 11,
 'orig_filepos': 75,
 'self': <nltk.data.SeekableUnicodeStreamReader object at 0x7fd2694b90f0>}
>pprint.pprint(inspect.trace()[-1][0].f_局部变量)
{'buf_size':63,
“字节读取”:75,
“检查1”:“\n\n\n第一章\n\n关于哈克的日记\n\n(\u I”,
“检查2”:“\n”
“\n”
'第一章\n'
“\n”
“JONATHAN HARKER的日记\n”
“\n”
"(简写),,
'est_bytes':9,
“filepos”:11,
“原始文件位置”:75,
“self”:}

换句话说,check1不知何故丢失了一个初始换行符。

该特定文件的开头有一个UTF-8字节顺序标记(EF BB BF),这会混淆NLTK。手动删除这些字节,或将整个文本复制粘贴到一个新文件中,可以解决此问题


我不知道为什么NLTK不能处理BOM,但至少有一个解决方案。

在编码中使用“utf-8-sig”而不是默认的“utf8”…

不知道问题可能是什么,所以尝试一些方法来缩小它的范围:(a)是否有一个文件
Dracula.txt
在与脚本相同的文件夹中?(b)是否可以
r.raw()
工作?(c)尝试加载
nltk
中包含的古腾堡语料库子集,如下所示:
nltk.download(“古腾堡”);nltk.corpus.gutenberg.words()
。会发生什么?(d)如果上述所有操作都有效,并且您可以访问除3.5以外的Python版本,请尝试一下。(a)该文件确实存在。(b)它确实存在。(c)内置的语料库可以完美地工作同样的问题也出现在3.4和3.3上;我没有任何其他版本可以使用NLTK。我最好的猜测是该文件有问题,但我不知道是什么问题。很酷,你找到了它。我怀疑这有什么好处,但根据Unicode标准,UTF-8文件不应该有BOM——这是不必要的。但是Windows喜欢添加它rywhere,所以我很惊讶它这么容易被NLTK绊倒。希望有一个关于这个的错误报告。。。