Как преобразовать данные и рассчитать значение TFIDF? - PullRequest
0 голосов
/ 19 ноября 2018

Мой формат данных: datas = {[1,2,4,6,7],[2,3],[5,6,8,3,5],[2],[93,23,4,5,11,3,5,2],...} Каждый элемент в данных является предложением, а каждое число - словом. Я хочу получить значение TFIDF для каждого числа.Как это сделать с помощью sklearn или другими способами?

Мой код:

from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import CountVectorizer  
datas = {[1,2,4,6,7],[2,3],[5,6,8,3,5],[2],[93,23,4,5,11,3,5,2]}
vectorizer=CountVectorizer()

transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(datas))  
print(tfidf)

Мой код не работает. Ошибка:

Traceback (most recent call last):   File
"C:/Users/zhuowei/Desktop/OpenNE-master/OpenNE-
master/src/openne/buildTree.py", line 103, in <module>
    X = vectorizer.fit_transform(datas)   File
"C:\Users\zhuowei\Anaconda3\lib\site-
packages\sklearn\feature_extraction\text.py", line 869, in fit_transform
    self.fixed_vocabulary_)   File "C:\Users\zhuowei\Anaconda3\lib\site-
packages\sklearn\feature_extraction\text.py", line 792, in _count_vocab
    for feature in analyze(doc):   File 
"C:\Users\zhuowei\Anaconda3\lib\site-
packages\sklearn\feature_extraction\text.py", line 266, in <lambda>
    tokenize(preprocess(self.decode(doc))), stop_words)   File 
"C:\Users\zhuowei\Anaconda3\lib\site-
packages\sklearn\feature_extraction\text.py", line 232, in <lambda>
    return lambda x: strip_accents(x.lower()) 
AttributeError: 'int' object has no attribute 'lower'

1 Ответ

0 голосов
/ 19 ноября 2018

Вы используете CountVectorizer, для которого требуется итерация строк.Что-то вроде:

datas = ['First sentence', 
         'Second sentence', ...
          ...
         'Yet another sentence']

Но ваши данные - это список списков, поэтому возникает ошибка.Вам нужно сделать внутренние списки в виде строк для работы CountVectorizer.Вы можете сделать это:

datas = [' '.join(map(str, x)) for x in datas]

Это приведет к datas следующим образом:

['1 2 4 6 7', '2 3', '5 6 8 3 5', '2', '93 23 4 5 11 3 5 2']

Теперь эта форма может быть использована CountVectorizer.Но даже тогда вы не получите правильных результатов из-за значения по умолчанию token_pattern в CountVectorizer :

token_pattern : '(? U) \ b\ w \ w + \ b '

string Регулярное выражение, обозначающее, что представляет собой «токен», используется только если анализатор == «слово».По умолчанию регулярные выражения выбирают токены из 2 или более буквенно-цифровых символов (знаки препинания полностью игнорируются и всегда рассматриваются как разделитель токенов)

Для того, чтобы считать ваши числа словамивам нужно изменить его, чтобы он мог принимать отдельные буквы в виде слов, выполнив следующее:

vectorizer = CountVectorizer(token_pattern=r"(?u)\b\w+\b")

Тогда это должно сработать.Но теперь ваши цифры превращаются в строки

...