使用sklearn實現tfidf特徵計算

最近在做一些文本方面的工作,記錄一下,方便以後查看。

使用sklearn進行tfidf特徵提取主要有兩種方法:

方法一:

#method1
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

tag_list = ['青年 吃貨 唱歌',
            '少年 遊戲 叛逆',
            '少年 吃貨 足球']
countVectorizer = CountVectorizer()#若要過濾停用詞,可在初始化模型時設置
doc_term_matrix = countVectorizer.fit_transform(tag_list)#得到的doc_term_matrix是一個csr的稀疏矩陣
#doc_term_matrix[doc_term_matrix>0]=1 #將出現次數大於0的token置1
#doc_term_matrix.todense()#將稀疏矩陣轉化爲稠密矩陣
vocabulary = countVectorizer.vocabulary_#得到詞彙表

tfidf_transformer = TfidfTransformer()
tfidf_matrix = tfidf_transformer.fit_transform(document_term_matrix)#得到的tfidf同樣是一個csr的稀疏矩陣
後來在翻看sklearn的用戶手冊時,發現了CountVectorizer和TfidfTransformer的結合體,沒錯,就是TfidfVectorizer!針對TfidfVectorizer,官方給出的說明是:Equivalent to CountVectorizer followed by TfidfTransformer.

於是就有了方法二:

#method2
from sklearn.feature_extraction.text import TfidfVectorizer
#若要過濾停用詞,可在初始化模型時設置
tfidfVecorizer = TfidfVectorizer(analyzer=lambda x:x.split(' '))#可自己設置解析方法
tfidf_matrix = tfidfVecorizer.fit_transform(tags_list)
#tfidf_matrix.todense()
term2id_dict = tfidfVecorizer.vocabulary_

同樣的結果,TfidfVectorizer就會簡潔很多。

對tfidf_matrix的處理:
之前自己總是傻傻的直接tfidf_matrix.todense().tolist(),再一行一行取結果,要知道,當數據量很多時,這個矩陣是很大很大很大的,非常佔內存。不過還好自己覺悟的快,後來把代碼改成了tfidf_matrix[i].todense().tolist()[0]

tag_list的獲取:
1、對文本進行分詞,首選jieba分詞器;
2、' '.join(token_list) 對分出來的token連接成字符串,如 '青年 吃貨 唱歌'
3、tag_list.append('青年 吃貨 唱歌')

如果大家對處理tfidf_matrix還有其他好辦法,歡迎留言賜教!

發佈了25 篇原創文章 · 獲贊 14 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章