推文分析,为 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'))
我使用 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'))