推文分析,为 LDA 制作字典时出现 Python 错误

Tweet analysis, Python error when making dictionary for LDA

我使用 python 的 Twitter API 下载了关于阿姆斯特丹的推文,UTF-8。 现在我正在尝试为 LDA 创建字典,使用此代码(只是代码的一部分,但这是导致错误的部分):

dictionary = corpora.Dictionary(line.lower().split() for line in open(input_file))

这总是给我一个错误,这取决于我选择哪个 txt 文件作为输入,要么:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xf1 in position 2: invalid continuation byte

 UnicodeDecodeError: 'utf8' codec can't decode byte xxxx in position 175-176: unexpected end of data

我预计这是因为 UTF-8 中未知的字符(可能在推文中使用了一些表情符号)并且在谷歌搜索尝试将代码替换为:

dictionary = corpora.Dictionary(line.lower().split() for line in open(input_file, errors='ignore'))

错误信息:

dictionary = corpora.Dictionary(line.lower().split() for line in open(input_file, errors='ignore'))
TypeError: 'errors' is an invalid keyword argument for this function

dictionary = corpora.Dictionary(line.lower().split() for line in open(input_file, 'ignore'))

错误信息:

dictionary = corpora.Dictionary(line.lower().split() for line in open(input_file, 'ignore'))
ValueError: mode string must begin with one of 'r', 'w', 'a' or 'U', not 'ignore'

有人有解决办法吗?谢谢

你的错误处理在错误的地方。您无法在要求忽略解码错误时打开文件;这发生在更远的地方。

您应该做的是以二进制模式(rb 修饰符)打开文件并读取行。它们将成为 bytes 个对象。然后你可以解码它们并忽略错误:

with open('/tmp/myfile', 'rb') as f:
    for linebytes in f.readlines():
        linestring = linebytes.decode(encoding='utf-8', errors='ignore')

您的输入文件显然不是 UTF-8。应该有文档解释这些 Twitter 文件的实际编码是什么;打开文件时相应地设置编码。

with open(input_file,encoding="whatever Twitter uses") as twitterfile:       
    dictionary = corpora.Dictionary(line.lower().split() for line in twitterfile)

这种方式Python会将输入无误地解码为字符串,这显然优于忽略错误和破坏数据。

如果您知道正在读取的数据是 utf-8,则可以导入编解码器模块并使用 codecs.open() 而不是 open()

Reading and Writing Unicode Data

试一试:

import codecs
dictionary = corpora.Dictionary(line.lower().split() for line in codecs.open(input_file, mode='r', encoding='utf-8', errors='ignore'))