Векторизовать список списков с помощью countvectorizer() и tfidfvectorizer()

Итак, у меня есть следующий список списков, которые токенизированы:

tokenized_list = [['ALL', 'MY', 'CATS', 'IN', 'A', 'ROW'], ['WHEN', 'MY', 
                   'CAT', 'SITS', 'DOWN', ',', 'SHE', 'LOOKS', 'LIKE', 'A', 
                   'FURBY', 'TOY', '!'], ['THE', CAT', 'FROM', 'OUTER', 
                   'SPACE'], ['SUNSHINE', 'LOVES', 'TO', 'SIT', 
                   'LIKE', 'THIS', 'FOR', 'SOME', 'REASON', '.']]

Когда я пытаюсь векторизовать его, используя CountVectorizer() или TfIdfVectorizer()

 from sklearn.feature_extraction.text import CountVectorizer
 vectorizer = CountVectorizer()
 print(vectorizer.fit_transform(tokenized_list).todense()) 
 print(vectorizer.vocabulary_)

Я получаю следующую ошибку:

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

И если я помещу простой список внутрь функции vectorizer.fit_transform(), он будет работать правильно.

Как убрать эту ошибку?


person explorer_x    schedule 10.04.2018    source источник
comment
вы хотите сгладить список.   -  person juanpa.arrivillaga    schedule 10.04.2018
comment
Я просто хочу использовать функцию векторизатора подсчета в процессе построения модели мешка слов в nlp. Что вы имеете в виду под сглаживанием? Извините, новичок в этом.   -  person explorer_x    schedule 10.04.2018
comment
Прочитайте связанный дубликат.   -  person juanpa.arrivillaga    schedule 10.04.2018
comment
Вы можете просто преобразовать внутренний список в строку, используя tokenized_list = [' '.join(inner_list) for inner_list in tokenized_list]   -  person Vivek Kumar    schedule 10.04.2018
comment
Привет Вивек! Спасибо! Я получил желаемый результат.   -  person explorer_x    schedule 10.04.2018
comment
@juanpa.arrivillaga IMO, это не дубликат указанного вопроса. Сглаживание опубликованного списка в том виде, в котором он есть, дает неверный результат. Комментарий @Vivek Kumar решает вопрос, соединяя внутренние списки со строками. Вы бы пересмотрели флаг?   -  person WolfgangK    schedule 10.04.2018


Ответы (1)


tokenized_list — это список списков. Попробуйте повторить список и передать подсписок в качестве аргумента, или вы можете сгладить список.

Пример:

tokenized_list = [['ALL', 'MY', 'CATS', 'IN', 'A', 'ROW'], ['WHEN', 'MY', 
                   'CAT', 'SITS', 'DOWN', ',', 'SHE', 'LOOKS', 'LIKE', 'A', 
                   'FURBY', 'TOY', '!'], ['THE', 'CAT', 'FROM', 'OUTER', 
                   'SPACE'], ['SUNSHINE', 'LOVES', 'TO', 'SIT', 
                   'LIKE', 'THIS', 'FOR', 'SOME', 'REASON', '.']]

from itertools import chain
tokenized_list = list(chain(*tokenized_list))
print(vectorizer.fit_transform(tokenized_list).todense()) 

Вывод:

[[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]
 [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
 [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
 [0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
person Rakesh    schedule 10.04.2018
comment
Это повторно соответствует данным на каждой итерации, что почти наверняка не соответствует желаемому. - person juanpa.arrivillaga; 10.04.2018
comment
Что касается вашего предыдущего ответа - он выдавал ту же ошибку, что и раньше. - person explorer_x; 10.04.2018
comment
Мне нужно получить это для каждого уникального значения, например, в этом корпусе есть 26 уникальных переменных, поэтому я должен получить 26 списков. Не более того. - person explorer_x; 10.04.2018
comment
У вас есть 34 элемента, поэтому вы получаете 34 списка. - person Rakesh; 10.04.2018
comment
@Rakesh Спасибо, я получил то, что хотел, из приведенного выше решения. - person explorer_x; 10.04.2018