TF-IDF вызывает AttributeError: объект 'int' не имеет атрибута 'lower', даже если в данных отсутствуют целые числа - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь выполнить преобразование TF-IDF для набора данных, используя sklearn s TfidfVectorizer.

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

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-212-ded21402d527> in <module>
----> 1 noise_tf = tfidf.fit(noise_data)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in fit(self, raw_documents, y)
   1629         """
   1630         self._check_params()
-> 1631         X = super().fit_transform(raw_documents)
   1632         self._tfidf.fit(X)
   1633         return self

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in fit_transform(self, raw_documents, y)
   1056 
   1057         vocabulary, X = self._count_vocab(raw_documents,
-> 1058                                           self.fixed_vocabulary_)
   1059 
   1060         if self.binary:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in _count_vocab(self, raw_documents, fixed_vocab)
    968         for doc in raw_documents:
    969             feature_counter = {}
--> 970             for feature in analyze(doc):
    971                 try:
    972                     feature_idx = vocabulary[feature]

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in <lambda>(doc)
    350                                                tokenize)
    351             return lambda doc: self._word_ngrams(
--> 352                 tokenize(preprocess(self.decode(doc))), stop_words)
    353 
    354         else:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in <lambda>(x)
    254 
    255         if self.lowercase:
--> 256             return lambda x: strip_accents(x.lower())
    257         else:
    258             return strip_accents

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

Iубедился, что данные не содержат int s:

>> noise_data.apply(lambda x: isinstance(x, int)).sum()
0

Тогда я просто:

tfidf = TfidfVectorizer(min_df = 5)
noise_tf = tfidf.fit(noise_data)

и получил вышеупомянутую ошибку.

Я ожидаю, что этот код будет работать нормально, поскольку в данных нет int.

Есть идеи, что может быть причиной TfidfVectorizer повышения этой ошибки?

Спасибо!

1 Ответ

0 голосов
/ 24 октября 2019

Я нашел ответ на этот вопрос, но поскольку я не нашел похожую тему в StackOverflow, я решил оставить этот вопрос здесь для других.

Похоже, что имена столбцов также учитываютсясчет по TfidfVectorizer.

Я проверил все типы имен столбцов и там было int с. Я привел все имена столбцов к string, и это решило проблему.

Я не уверен, почему TfidfVectorizer пытается применить .lower() к именам столбцов, но, очевидно, это так. Если у кого-то здесь есть идея, какова цель этого - я хотел бы услышать это.

...