2014-12-28 5 views
3

Хотелось бы в числе прочего scikit узнать список, у кого есть списки. Я иду на путь, где у меня есть учебные тексты, я читал их, а затем я получаю что-то вроде этого:Как я могу векторизовать следующий список списков с помощью scikit?

corpus = [["this is spam, 'SPAM'"],["this is ham, 'HAM'"],["this is nothing, 'NOTHING'"]] 

from sklearn.feature_extraction.text import CountVectorizer 
vect = CountVectorizer(analyzer='word') 
vect_representation= vect.fit_transform(corpus) 
print vect_representation.toarray() 

И я получаю следующее:

return lambda x: strip_accents(x.lower()) 
AttributeError: 'list' object has no attribute 'lower' 

Также проблема с этим являются метки в конце каждого документа, как мне обращаться с ними, чтобы сделать правильную классификацию ?.

+0

Просто прочитал ваш пост потому что у меня была аналогичная проблема. Моя ошибка: corpus не должен быть списком списка, это должен быть список строк, например: corpus = ["this is spam", "this ham", ...] – user3813234

ответ

2

Прежде всего, вы должны отделять ярлыки от текстов. Если вы хотите использовать CountVectorizer вы должны преобразовать ваши тексты один за другим:

corpus = [["this is spam, 'SPAM'"],["this is ham, 'HAM'"],["this is nothing, 'NOTHING'"]] 
from sklearn.feature_extraction.text import CountVectorizer 
... split labels from texts 
vect = CountVectorizer(analyzer='word') 
vect_representation= map(vect.fit_transform,corpus) 
... 

В качестве другого варианта можно использовать TfidfVectorizer со списком списков непосредственно.

+0

Так что я должен разделить метки от текст?. Я думал о том, чтобы использовать контролируемый aproach (MNB, SVM, LR) и использовать «corpus» в качестве данных для обучения, если я удаляю метки, как я могу использовать их для обучения классификатора ?. Или это будет решено с помощью 'y', что учебники, которые предоставляют scikit (цель) – tumbleweed

+1

Да, обычно y обозначает список ярлыков в scikit. Таким образом, вам нужно разделить корпус на X и Y. –

+0

Я разделил метки, но когда я делаю следующее:'vect_representation.toarray() 'У меня есть следующее: 'AttributeError:' list 'объект не имеет атрибута' toarray' I хотел бы визуализировать матрицу терминов документа. Один вектор на документ, как это следует понимать? спасибо – tumbleweed

4

Для каждого в будущем это решить мою проблему:

corpus = [["this is spam, 'SPAM'"],["this is ham, 'HAM'"],["this is nothing, 'NOTHING'"]] 

from sklearn.feature_extraction.text import CountVectorizer 
bag_of_words = CountVectorizer(tokenizer=lambda doc: doc, lowercase=False).fit_transform(splited_labels_from_corpus) 

И это выход, когда я использую .toarray() функцию:

[[0 0 1] 
[1 0 0] 
[0 1 0]] 

Спасибо, ребята

+0

Может ли кто-нибудь порекомендовать мне более питонический способ сделать это? Спасибо заранее, ребята. – tumbleweed

+0

вам не нужны два 'CountVectorizers', также почему ваши входные данные всегда так странно смешиваются с ярлыками? – elyase

+0

Извините, первая 'vect' была ошибкой. Я этого не понимал (я просто копирую и вставляю код вопроса). Я отредактирую ответ. У меня есть этот формат, так как я просто изучаю, как использовать scikit для изучения с моим собственным корпусом, и я предполагаю, что у меня есть корпус таким образом, один документ в списке. Спасибо за отзыв – tumbleweed