AttributeError: у объекта 'list' нет атрибута 'lower' в TF-IDF - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь применить TF-IDF в столбце Pandas

data

    all_cols
0   who is your hero and why
1   what do you do to relax
2   this is a hero
4   how many hours of sleep do you get a night
5   describe the last time you were relax

Я знаю, чтобы использовать CountVectorizer, мне нужно превратить столбец в список (иэто то, что я пытался сделать).

Чтобы применить TFIDF, я не мог применить список (и я пытался преобразовать его в строку).

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import pandas as pd


df = pd.read_excel('data.xlsx')
col = df['all_cols']
corpus = col.values.tolist()

cv = CountVectorizer()
X = cv.fit_transform(corpus)

document = [' '.join(str(item)) for item in corpus]

tfidf_transformer=TfidfTransformer(smooth_idf=True,use_idf=True)
tfidf_transformer.fit(X)

feature_names=cv.get_feature_names()

tf_idf_vector=tfidf_transformer.transform(cv.transform([document]))

Но у меня все еще есть эта ошибка

AttributeError                            Traceback (most recent call last)
<ipython-input-239-92f296939ea7> in <module>()
     16  
---> 17 tf_idf_vector=tfidf_transformer.transform(cv.transform([documento]))

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

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Вы можете использовать конвейер sklearn, который может упростить это.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.pipeline import Pipeline 

tf_idf = Pipeline([('cv',CountVectorizer()), ('tfidf_transformer',TfidfTransformer(smooth_idf=True,use_idf=True))])


tf_idf_vector  = tf_idf.fit_transform(corpus)
1 голос
/ 24 июня 2019

Я просто догадываюсь, потому что я не использую sklearn, и вы не опубликовали полную трассировку стека, но исключение выглядит так, как будто он ожидает список строк в качестве параметра и вызывает "lower ()" строковых элементов.

Но то, что вы делаете, дает ему список списка со строками:

corpus = [1,2,3]
document = [' '.join(str(item)) for item in corpus]

print (document)
>>> ['1','2','3']
print ([document])
>>> [['1','2','3']]

Могу поспорить, что это будет исправлено, если вы просто позвоните вместо этого:

tf_idf_vector=tfidf_transformer.transform(cv.transform(document))
...