【问题标题】:Issue with sentence splitting code in pythonpython中的句子拆分代码问题
【发布时间】:2018-02-05 12:08:35
【问题描述】:

这是我在 python 中的分句代码

 import nltk.data
 tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
 fp = open("newoutput.en")
 data1 = fp.read()
 print '\n-----\n'.join(tokenizer.tokenize(data1))

但在执行时,我收到以下错误:

Traceback (most recent call last):
  File "pythontokeniser.py", line 7, in <module>
    print '\n-----\n'.join(tokenizer.tokenize(data1))
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 1237, in tokenize
    return list(self.sentences_from_text(text, realign_boundaries))
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 1285, in sentences_from_text
    return [text[s:e] for s, e in self.span_tokenize(text, realign_boundaries)]
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 1276, in span_tokenize
    return [(sl.start, sl.stop) for sl in slices]
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 1316, in _realign_boundaries
    for sl1, sl2 in _pair_iter(slices):
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 313, in _pair_iter
    for el in it:
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 1291, in _slices_from_text
    if self.text_contains_sentbreak(context):
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 1337, in text_contains_sentbreak
    for t in self._annotate_tokens(self._tokenize_words(text)):
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 1472, in _annotate_second_pass
    for t1, t2 in _pair_iter(tokens):
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 312, in _pair_iter
    prev = next(it)
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 581, in _annotate_first_pass
    for aug_tok in tokens:
  File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/punkt.py", line 546, in _tokenize_words
    for line in plaintext.split('\n'):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 7: ordinal not in range(128)***

【问题讨论】:

标签: python python-2.7 character-encoding


【解决方案1】:

以字节模式打开文件如下:

fp = open("newoutput.en", 'rb')

或尝试使用“ISO-8859-1”进行编码。

【讨论】:

  • 二进制模式仅适用于 Windows,无论如何都无法解决文本文件的编码问题。并且明确指定编码(这是要做的事情)要求您确实知道用于文件的有效编码,否则您仍然会遇到编码问题,因此建议使用任何随机编码都是无用的。
  • 我遇到了类似的问题,并使用以二进制模式读取文件并使用我上面提到的编码解决了它。
  • 解决问题意味着您既了解问题又了解解决方案。 IOW 你没有“解决”任何事情,只是偶然地设法“让它发挥作用”。下次你会遇到同样的问题,使用 utf-16 或 CP1252 或任何多种常见编码中的任何一种编码的文件,你会发现“使用 SO-8859-1 编码”不会“解决”任何问题。
  • 哦,你能建议如何根据错误跟踪我们应该使用哪种编码或如何决定吗?
  • 如果您不知道文件的编码并且它没有 bom,那么您确实有问题。有一些启发式方法可以尝试和猜测(cf unicodedammit),但这仍然是一个猜测。
猜你喜欢
  • 2017-06-13
  • 2019-08-27
  • 2018-05-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多