python 文本挖掘 TF-IDF 的jieba与sklearn实现

1.何为TF-IDF?

        TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率).

        TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

        总结一句话:一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章。

2.TF-IDF的组成与计算公式

        TF-IDF分为TF(词频)、IDF(逆文件频率)。

        2.1 TF(词频)计算公式:

        2.2 IDF(逆文件频率)计算公式:

        在对数里面语料库中文档总数为一个常数,而包含词条w的文档数是一个变数。当包含某词条w的文档书越多,那么整体对数求出来的值,即IDF值就越小,TF-IDF也就越小。IDF就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。

        2.3 TF-IDF计算公式:

        TF-IDF的值越大,说明该词条在该文章中的重要性越大,因此,TF-IDF可以作为文章关键字的提取。

3.优缺点

        TF-IDF的优点是简单快速,而且容易理解。缺点是有时候用词频来衡量文章中的一个词的重要性不够全面,没有考虑到上下文内容关联,有关主题模型详细查阅LDA相关资料。

4.TF-IDF的python jieba模块的实现

        4.1安装模块

                在dos窗口输入 pip install jieba

        4.2 程序的实现

import jieba.analyse

txt = """有一天,在森林里兔子和乌龟比赛跑步,兔子嘲笑乌龟爬得慢,乌龟说:“总有一天我会赢的。”兔子就轻蔑地说:“那我们现在就开始比赛!”乌龟答应了,兔子大声喊道:“比赛开始!”
兔子飞快地跑着,乌龟拼命地爬着。不一会儿,兔子与乌龟已经离的有很大一段距离了。兔子认为比赛太轻松了,它要先睡一会,并且自以为是地说即使自己睡醒了乌龟也不一定能追上它。而乌龟呢,
它一刻不停地爬行,爬呀爬呀,到兔子那里的时候,它已经累得不行了,但乌龟想如果这时和兔子一样去休息,那比赛就不会赢了,所以乌龟继续地爬呀爬呀。当兔子醒来的时候乌龟已经到达终点了。
此故事告诉大家:不可轻易小视他人。虚心使人进步,骄傲使人落后. 要踏踏实实地做事情,不要半途而废,才会取得成功。"""

jieba.analyse.set_stop_words("停用词.txt")                #添加停用词
jieba.analyse.extract_tags(txt,withWeight=True,topK=7)   #返回TF-IDF权重值

#---------------------------------------返回结果--------------------------------------------
[('乌龟', 1.3521677469550633),
 ('兔子', 1.1015418507227848),
 ('比赛', 0.43249100021012665),
 ('地说', 0.3026523418455696),
 ('使人', 0.3026523418455696),
 ('一刻不停', 0.13803728327088607),
 ('踏踏实实', 0.1324897525)]

         代码中topK参数等于7,说明是选取TF-IDF值前7的词条,说明龟兔赛跑故事的主题词是改七个,但是第四与第五个为“地说”、“使人”说明在分词地时候是不怎么合理地,可以认为把它忽略。

5.TF-IDF sklearn的实现

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
import jieba
import pandas as pd
#设定分词及清理停用词函数
stoplist = list(pd.read_table("停用词.txt",names = ["w"],sep = 'aaa',encoding = "utf-8",engine="python").w)
def m_cut(intxt):
    return [w for w in jieba.lcut(intxt) if w not in stoplist and len(w) > 1]
txt_list = [" ".join(m_cut(txt))]      #要用空格分隔开,才能传入fit_transform中
vectorizer = CountVectorizer()         #创建计算词频的实例
X = vectorizer.fit_transform(txt_list) #将文本中的词语转换为词频稀疏矩阵
transformer = TfidfTransformer()  #创建计算TF-IDF的玩意
tfidf = transformer.fit_transform(X)  #基于词频稀疏矩阵X计算TF-IDF值
word=vectorizer.get_feature_names()  #获取词袋模型中的所有词语
weight=tfidf.toarray()               #将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重  
data_dict = {}
for i in range(len(weight)):     #文本的tf-idf词语权重添加到字典data_dict中
    for j in range(len(word)):  
        data_dict[word[j]] = weight[i,j]
sorted(data_dict.items(),key=lambda x:x[1],reverse=True)[:7]  #按照tfidf值倒叙输出前7个
#---------------------------------------返回结果-----------------------------------------
[('乌龟', 0.6257681363874317),
 ('兔子', 0.5688801239885742),
 ('比赛', 0.2844400619942871),
 ('已经', 0.17066403719657228),
 ('使人', 0.11377602479771486),
 ('地说', 0.11377602479771486),
 ('一会', 0.05688801239885743)]

返回的结果与jieba相类似,出现无用的词,可以人为地把他去除掉。

注意:程序中的停用词可以自行在百度搜索中文停用词进行下载即可。

部分内容转载于:TF-IDF算法计算公式及含义_SEO技术

你可能感兴趣的:(机器学习,python,自然语言处理,tf-idf)