2017-02-22 46 views
2

Есть хороший introduction on how to use sklearn for text analytics.Как использовать формат пользовательских текстовых данных для CountVectorizer()?

Но в верхнем учебнике они используют набор данных sklearn с их объектом «связки», который не указан подробно, поэтому я изо всех сил стараюсь поместить мои данные в желаемую форму, чтобы использовать методы sklearn на ней. Я хотел бы использовать CountVectorizer() на моих текстовых данных для дальнейшей обработки, но вызов CountVectorizer.fit_transform (my_string_array) всегда выдает ошибку:

AttributeError: 'list' object has no attribute 'lower'

Я пытался до сих пор инициализирует следующие типы Numpy массива и загрузил свою строку в них, но ни один из них не работал:

  1. np.chararray (форма)
  2. np.empty (форма, DTYPE = ул/объект)

ответ

0

Упрощенный пример:

from sklearn.feature_extraction.text import CountVectorizer 

docs = ['This is the first document', 'This is the second document'] 
count_vect = CountVectorizer() 
X_train_counts = count_vect.fit_transform(docs) 

docs должен быть набор строк, то есть список, NumPy массив и т.д.

Если текст уже лексемы, то вам нужно сказать CountVectorizer, что Безразлично» т нужно разбить строку:

from sklearn.feature_extraction.text import CountVectorizer 

docs = [['This', 'is', 'the', 'first', 'document'], 
     ['This', 'is', 'the', 'second', 'document']] 
count_vect = CountVectorizer(tokenizer=lambda text: text) 
X_train_counts = count_vect.fit_transform(docs) 
+0

проблема в том, что мои данные представляют собой массив массивов строк, т.е. [['string1', 'string2', ....], ['string1', 'string2', ....], ....] – ben0it8

+0

@ ben0it8, Хорошо, почему ваши данные 2D вместо 1D (сборник документов)? Вы уже подписали документы? – elyase

+0

Да, каждый элемент в моем массиве соответствует строкам одного документа. – ben0it8

0

CountVectorizer требует последовательности или список строк для обработки в mentioned here:

input : string {‘filename’, ‘file’, ‘content’}

If ‘filename’, the sequence passed as an argument to fit is expected to be a list of filenames that need reading to fetch the raw content to analyze.

If ‘file’, the sequence items must have a ‘read’ method (file-like object) that is called to fetch the bytes in memory.

Otherwise the input is expected to be the sequence strings or bytes items are expected to be analyzed directly.

Предоставляющий [['string1', 'string2', ....], ['string1', 'string2', ....]. Внешний - массив, так что требование завершено.

Затем CountVectorizer() выполняет итерацию элементов списка, который вы указали.

Ожидает: object of type string и вызывает lower() (чтобы сделать строчные строчки). Он получает: ['string1', 'string2', ....], который является списком, и, очевидно, не имеет метода lower(). Отсюда и ошибка.

Решение: На мой взгляд, это не изменит результаты, если вместо списка списка строк, только один список используется, который передается CountVectorizer().

МКЭ внутренний список строк (в списке документов вы используете) одну строку, выполнив:

data = [" ".join(x) for x in data]

где data это ваши строковые данные со списком списка строк.

Предполагая, что ваши данные:

data = [['yo', 'dude'],['how','are', 'you']] 
data = [" ".join(x) for x in data] 

Выход:

['yo dude', 'how are you'] 

Это может быть в настоящее время переданы CountVectorizer без ошибок.