Токенизация текста с помощью scikit-learn

У меня есть следующий код для извлечения функций из набора файлов (имя папки — это имя категории) для классификации текста.

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. Как я могу заставить это работать?

EDIT: я только что обнаружил, что это прекрасно работает для файлов с кодировкой utf-8 (мои файлы имеют кодировку ANSI). Есть ли способ заставить sklearn.datasets.load_files() работать с кодировкой ANSI?


person raul    schedule 01.05.2015    source источник
comment
Можете ли вы добавить образец ваших данных? Возможно, данные не закодированы в utf-8 - возможно, они в utf-16? Не зная больше о формате ваших данных, это сложно. Я не эксперт, но вы можете попробовать преобразовать строки в utf-8 с помощью чего-то вроде each_string.decode('utf-16').encode('utf-8')   -  person mattsilver    schedule 01.05.2015
comment
@ohruunuruus Мои обучающие данные аналогичны набору данных из 20 групп новостей, а кодировка — ANSI.   -  person raul    schedule 01.05.2015
comment
TfidfVectorizer принимает параметр encoding. Попробуйте передать encoding=ansi и сообщите обо всех ошибках   -  person mbatchkarov    schedule 01.05.2015


Ответы (2)


ANSI — это строгое подмножество UTF-8, поэтому он должен работать нормально. Однако из трассировки стека кажется, что ваш ввод где-то содержит байт 0xFF, который не является допустимым символом ANSI.

person cfh    schedule 01.05.2015

Я исправляю проблему, изменив настройку ошибок с «строгих» на «игнорировать».

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)

вот подробное объяснение функции подсчета векторов

person ZHENKAI    schedule 30.04.2017