处理文本时出现字符编码问题

时间:2019-08-28 08:26:15

标签: python encoding gensim

我正在尝试处理大型语料库,但是在preprocess_string()中,它返回如下所示的错误

Traceback (most recent call last): File "D:/Projects/docs_handler/data_preprocessing.py", line 60, in <module> for temp in batch(iterator,1000): File "D:/Projects/docs_handler/data_preprocessing.py", line 30, in batch for item in iterable: File "D:/Projects/docs_handler/data_preprocessing.py", line 23, in iter_tokenized_documents document = preprocess_string(open(os.path.join(root, file)).read().strip(),filters=CUSTOM_FILTERS) File "C:\Users\koradg\AppData\Local\Programs\Python\Python36\lib\encodings\cp1252.py", line 23, in decode return codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 16144: character maps to <undefined>

Versions
Windows-10-10.0.17763-SP0
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
NumPy 1.17.0
SciPy 1.3.0
gensim 3.8.0
FAST_VERSION 0

def iter_tokenized_documents(input_directory):
    """Iterate over all documents, yielding a document (=list of utf8 tokens) at a time."""
    for root, dirs, files in os.walk(input_directory):
        for file in filter(lambda file: file.endswith('.txt'), files):
            document = preprocess_string(open(os.path.join(root, file)).read().strip(),filters=CUSTOM_FILTERS)
            if(len(document)):
                yield document

如何运行它而没有任何错误?

2 个答案:

答案 0 :(得分:2)

从您的问题来看,您似乎在编码错误。 只需在打开文件中使用 encoding ='utf-8'。 如果该章程不重要,请在打开文件中使用此 errors =“ ignore”

答案 1 :(得分:1)

open(os.path.join(root, file))

这是您的问题:如果以文本模式(默认)打开文件而不提供编码(也是默认),Python将使用sys.getpreferredencoding(False)

这很少是一个好主意,但是在Windows上尤其糟糕,在Windows中,“首选编码”很有可能已完全过时且无用(例如CP850)。

因此,根据您的确切需求来解决您的问题:

  • 明确提供数据文件的编码方式(如果是90年代以后的文本,则可能使用UTF8)
  • binary模式打开文件以绕过整个问题(并获得bytes作为输出而不是str

还有一些额外的nitpicks:

产生文档(= utf8令牌列表)

  1. 没有“ utf8令牌”之类的东西,目前尚不清楚您是指 utf8代码单元(在这种情况下,您真的要以二进制模式打开文件)还是代码点(文本模式) 。
  2. 字节和字符串是序列,但它们不是 lists ,因此将它们称为这样是有风险的