【问题标题】:Tokenizing text with scikit-learn使用 scikit-learn 标记文本
【发布时间】:2015-07-10 21:09:57
【问题描述】:

我有以下代码从一组文件中提取特征(文件夹名称是类别名称)用于文本分类。

import sklearn.datasets
from sklearn.feature_extraction.text import TfidfVectorizer

train = sklearn.datasets.load_files('./train', description=None, categories=None, load_content=True, shuffle=True, encoding=None, decode_error='strict', random_state=0)
print len(train.data)
print train.target_names

vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(train.data)

它抛出以下堆栈跟踪:

Traceback (most recent call last):
  File "C:\EclipseWorkspace\TextClassifier\main.py", line 16, in <module>
    X_train = vectorizer.fit_transform(train.data)
  File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line 1285, in fit_transform
    X = super(TfidfVectorizer, self).fit_transform(raw_documents)
  File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line 804, in fit_transform
    self.fixed_vocabulary_)
  File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line 739, in _count_vocab
    for feature in analyze(doc):
  File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line 236, in <lambda>
    tokenize(preprocess(self.decode(doc))), stop_words)
  File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line 113, in decode
    doc = doc.decode(self.encoding, self.decode_error)
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 32054: invalid start byte

我运行 Python 2.7。我怎样才能让它工作?

编辑: 我刚刚发现这对于utf-8 编码的文件非常有效(我的文件是ANSI 编码的)。有什么方法可以让sklearn.datasets.load_files() 使用ANSI 编码?

【问题讨论】:

  • 您可以添加数据样本吗?可能是数据没有以 utf-8 编码——也许它们是 utf-16?在不了解数据格式的情况下,这很难。我不是专家,但您可以尝试使用 each_string.decode('utf-16').encode('utf-8') 之类的方式将字符串转换为 utf-8
  • @ohruunuruus 我的训练数据类似于20个新闻组数据集,编码是ANSI
  • TfidfVectorizer 采用 encoding 参数。尝试传递encoding=ansi 并报告任何错误

标签: python machine-learning scikit-learn text-classification scikits


【解决方案1】:

ANSI 是 UTF-8 的严格子集,因此它应该可以正常工作。但是,从堆栈跟踪来看,您的输入似乎在某处包含字节 0xFF,这不是有效的 ANSI 字符。

【讨论】:

    【解决方案2】:

    我通过将错误设置从“严格”更改为“忽略”来解决问题

    vectorizer = CountVectorizer(binary = True, decode_error = u'ignore')
    word_tokenizer = vectorizer.build_tokenizer()
    doc_terms_list_train = [word_tokenizer(str(doc_str, encoding = 'utf-8', errors = 'ignore')) for doc_str in doc_str_list_train]
    doc_train_vec = vectorizer.fit_transform(doc_str_list_train)
    

    here is the detailed explanation of countvectorizer fucntion

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-16
      • 2015-02-05
      • 2018-07-03
      • 2019-04-09
      • 2017-04-07
      • 2015-07-05
      • 2016-06-05
      • 2013-11-22
      相关资源
      最近更新 更多