如何转换数据并计算TFIDF值?

时间:2018-11-19 08:20:17

标签: python-3.x scikit-learn nlp tf-idf

我的数据格式是: 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 :(得分:3)

您正在使用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 in CountVectorizer,您仍无法获得正确的结果:

  

token_pattern :‘(?u)\ b \ w \ w + \ b’

     

string正则表达式,表示什么构成一个   “令牌”,仅在分析器=='word'时使用。默认正则表达式选择    2个或更多字母数字字符的标记(标点符号完全是   被忽略,并始终被视为令牌分隔符)

为了使其能够将您的数字视为单词,您需要对其进行更改,以使其可以通过以下操作将单个字母作为单词来接受:

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

然后它应该可以工作。但是现在您的数字变成了字符串