使用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还有其他好办法,欢迎留言赐教!

你可能感兴趣的:(Python,机器学习与数据挖掘)