使用 sklearn load_files 进行解码/编码

Posted

技术标签:

【中文标题】使用 sklearn load_files 进行解码/编码【英文标题】:Decoding/Encoding using sklearn load_files 【发布时间】:2017-10-26 20:15:42 【问题描述】:

我在这里学习教程 https://github.com/amueller/introduction_to_ml_with_python/blob/master/07-working-with-text-data.ipynb 了解机器学习和文本。

就我而言,我使用的是我下载的推文,正面和负面推文的目录结构完全相同(试图学习情绪分析)。

在 iPython Notebook 中,我像他们一样加载我的数据:

tweets_train =load_files('Path to my training Tweets')

然后我尝试用 CountVectorizer 来拟合它们

vect = CountVectorizer().fit(text_train)

我明白了

UnicodeDecodeError: 'utf-8' 编解码器无法解码位置的字节 0xd8 561: 无效的继续字节

这是因为我的推文中有各种非标准文本吗?我没有对我的推文进行任何清理(我假设有一些库可以帮助我处理这些问题,以便让一堆单词起作用?)

编辑: 我使用 Twython 下载推文的代码:

def get_tweets(user):
    twitter = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)
    user_timeline = twitter.get_user_timeline(screen_name=user,count=1)
    lis = user_timeline[0]['id']
    lis = [lis]
    for i in range(0, 16): ## iterate through all tweets
    ## tweet extract method with the last list item as the max_id
        user_timeline = twitter.get_user_timeline(screen_name=user,
        count=200, include_retweets=False, max_id=lis[-1])
        for tweet in user_timeline:
            lis.append(tweet['id']) ## append tweet id's
            text = str(tweet['text']).replace("'", "")
            text_file = open(user, "a")
            text_file.write(text)
            text_file.close()

【问题讨论】:

这意味着您要么使用 UTF-8 以外的编码存储数据,要么数据已以某种方式损坏。请提供有关您如何下载推文并将推文保存到磁盘的详细信息(= 代码)。 查看编辑以获取下载推文的代码。 你能不能也展示一下你是如何从tweets_traintext_train 的? 与链接的 iPython Notebook 中的示例相同。 【参考方案1】:

您收到 UnicodeDecodeError,因为您的文件正在使用错误的文本编码进行解码。 如果这对您没有任何意义,请确保您了解 Unicode 和文本编码的基础知识,例如。与official Python Unicode HOWTO。

首先,您需要找出用于将推文存储在磁盘上的编码。 当您将它们保存到文本文件时,您使用了内置的open 函数而没有指定编码。这意味着使用了系统的默认编码。例如,在交互式会话中检查:

>>> f = open('/tmp/foo', 'a')
>>> f
<_io.TextIOWrapper name='/tmp/foo' mode='a' encoding='UTF-8'>

这里可以看到,在我的本地环境中,默认编码设置为 UTF-8。您也可以使用

直接检查默认编码
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

还有其他方法可以找出文件使用的编码。 例如,如果您碰巧在 Unix 平台上工作,Unix 工具file 非常擅长猜测现有文件的编码。

一旦您认为自己知道用于编写文件的编码,您可以在 load_files() 函数中指定:

tweets_train = load_files('path to tweets', encoding='latin-1')

... 如果您发现 Latin-1 是用于推文的编码;否则相应调整。

【讨论】:

谢谢,我下午回家试试你的建议。 如果不行,试试CountVectorizer()构造函数中的encoding=...参数,而不是load_files()函数。 谢谢!你让我指出了正确的方向,我最终发现 latin-1 是我需要的编码(它在 f 打开)。

以上是关于使用 sklearn load_files 进行解码/编码的主要内容,如果未能解决你的问题,请参考以下文章

sklearn管道适合:AttributeError:未找到下限

sklearn GridSearchCV:如何获得分类报告?

sklearn学习笔记之简单线性回归

mysql load_file()和 into outfile

sklearn cross_validation ValueError:无法将字符串转换为浮点数

使用自定义转换器子类对 sklearn 管道进行评分时出现 AttributeError,但在拟合时却没有