大数据及人工智能基础系列3 文本挖掘的TF-IDF计算

转载 2017年08月19日 19:24:44

文章来源:http://blog.csdn.net/eastmount/article/details/50323063


在文本聚类、文本分类或者比较两个文档相似程度过程中,可能会涉及到TF-IDF值的计算。这里主要讲述基于Python的机器学习模块和开源工具:scikit-learn。

        希望文章对你有所帮助,相关文章如下:
        [python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒
        Python简单实现基于VSM的余弦相似度计算
        基于VSM的命名实体识别、歧义消解和指代消解
        [python] 使用Jieba工具中文分词及文本聚类概念
        
目录:
  • 一.Scikit-learn概念
    • 1.概念知识
    • 2.安装软件
  • 二.TF-IDF基础知识
    • 1.TF-IDF
    • 2.举例介绍
  • 三.TF-IDF调用两个方法
    • 1.CountVectorizer
    • 2.TfidfTransformer
    • 3.别人示例

一. Scikit-learn概念

        1.概念知识

        官方网址:http://scikit-learn.org/stable/
        Scikit-learn是一个用于数据挖掘和数据分析的简单且有效的工具,它是基于Python的机器学习模块,基于BSD开源许可证。

        Scikit-learn的基本功能主要被分为六个部分:分类(Classification)、回归(Regression)、聚类(Clustering)、数据降维(Dimensionality reduction)、模型选择(Model selection)、数据预处理(Preprocessing)。
        Scikit-Learn中的机器学习模型非常丰富,包括SVM,决策树,GBDT,KNN等等,可以根据问题的类型选择合适的模型,具体可以参考官网文档,推荐大家从官网中下载资源、模块、文档进行学习。


        Scikit-Learn的安装需要numpy、scipy、matplotlib等模块,windows用户可以到:http://www.lfd.uci.edu/~gohlke/pythonlibs直接下载编译好的安装包以及依赖,也可以到这个网站下载:http://sourceforge.jp/projects/sfnet_scikit-learn/
        参考文章:开源机器学习工具scikit-learn入门 - 轩辕森

        2.安装软件

        Python 2.0我推荐使用"pip install scikit-learn"或"easy_install scikit-learn"全自动安装,再通过"from sklearn import feature_extraction"导入
        安装时如果出现错误"unknown encoding: cp65001",输入"chcp 936"将编码方式由utf-8变为简体中文gbk。



二. TF-IDF基础知识

        参考官方文档:
        gensim中TF-IDF:http://radimrehurek.com/gensim/models/tfidfmodel.html

        1.TF-IDF

        TF-IDF(Term Frequency-InversDocument Frequency)是一种常用于信息处理和数据挖掘的加权技术。该技术采用一种统计方法,根据字词的在文本中出现的次数和在整个语料中出现的文档频率来计算一个字词在整个语料中的重要程度。它的优点是能过滤掉一些常见的却无关紧要本的词语,同时保留影响整个文本的重要字词。计算方法如下面公式所示。

        其中,式中tfidfi,j表示词频tfi,j和倒文本词频idfi的乘积。TF-IDF值越大表示该特征词对这个文本的重要性越大。

        TF(Term Frequency)表示某个关键词在整篇文章中出现的频率。
        IDF(InversDocument Frequency)表示计算倒文本频率。文本频率是指某个关键词在整个语料所有文章中出现的次数。倒文档频率又称为逆文档频率,它是文档频率的倒数,主要用于降低所有文档中一些常见却对文档影响不大的词语的作用。
        下面公式是TF词频的计算公式。

        其中,ni,j为特征词ti在文本dj中出现的次数,是文本dj中所有特征词的个数。计算的结果即为某个特征词的词频。
        下面公式是IDF的计算公式。

        其中,|D|表示语料中文本的总数,表示文本中包含特征词ti的数量。为防止该词语在语料库中不存在,即分母为0,则使用作为分母。

        2.示例

        示例参考仿造阮一峰大神的例子进行简单讲解,推荐大家去阅读:
        TF-IDF与余弦相似性的应用(一):自动提取关键词
        
下面通过一个示例进行讲解TF-IDF权重计算的方法。
        假设现在有一篇文章《贵州的大数据分析》,这篇文章包含了10000个词组,其中“贵州”、“大数据”、“分析”各出现100次,“的”出现500次(假设没有去除停用词),则通过前面TF词频计算公式,可以计算得到三个单词的词频,即:


        现在预料库中共存在
1000篇文章,其中包含“贵州”的共99篇,包含“大数据”的共19篇,包含“分析”的共“59”篇,包含“的”共“899”篇。则它们的IDF计算如下:

        由IDF可以发现,当某个词在语料库中各个文档出现的次数越多,它的IDF值越低,当它在所有文档中都出现时,其IDF计算结果为0,而通常这些出现次数非常多的词或字为“的”、“我”、“吗”等,它对文章的权重计算起不到一定的作用。
        同时计算TF-IDF值如下:

        通过TF-IDF计算,“大数据”在某篇文章中出现频率很高,这就能反应这篇文章的主题就是关于“大数据”方向的。如果只选择一个词,“大数据”就是这篇文章的关键词。所以,可以通过TF-IDF方法统计文章的关键词。同时,如果同时计算“贵州”、“大数据”、“分析”的TF-IDF,将这些词的TF-IDF相加,可以得到整篇文档的值,用于信息检索。
        TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是单纯以词频衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多。而且,这种算法无法体现词的位置信息。

    

三. TF-IDF计算

        Scikit-Learn中TF-IDF权重计算方法主要用到两个类:CountVectorizer和TfidfTransformer。

       1.CountVectorizer

        CountVectorizer类会将文本中的词语转换为词频矩阵,例如矩阵中包含一个元素a[i][j],它表示j词在i类文本下的词频。它通过fit_transform函数计算各个词语出现的次数,通过get_feature_names()可获取词袋中所有文本的关键字,通过toarray()可看到词频矩阵的结果。
        代码如下:

[python] view plain copy
  1. # coding:utf-8  
  2. from sklearn.feature_extraction.text import CountVectorizer  
  3.   
  4. #语料  
  5. corpus = [  
  6.     'This is the first document.',  
  7.     'This is the second second document.',  
  8.     'And the third one.',  
  9.     'Is this the first document?',  
  10. ]  
  11. #将文本中的词语转换为词频矩阵  
  12. vectorizer = CountVectorizer()  
  13. #计算个词语出现的次数  
  14. X = vectorizer.fit_transform(corpus)  
  15. #获取词袋中所有文本关键词  
  16. word = vectorizer.get_feature_names()  
  17. print word  
  18. #查看词频结果  
  19. print X.toarray()  
输出如下所示:
[python] view plain copy
  1. >>>   
  2. [u'and', u'document', u'first', u'is', u'one', u'second', u'the', u'third', u'this']  
  3. [[0 1 1 1 0 0 1 0 1]  
  4.  [0 1 0 1 0 2 1 0 1]  
  5.  [1 0 0 0 1 0 1 1 0]  
  6.  [0 1 1 1 0 0 1 0 1]]  
  7. >>>  

        从结果中可以看到,总共包括9个特征词,即:
        [u'and', u'document', u'first', u'is', u'one', u'second', u'the', u'third', u'this']
        同时在输出每个句子中包含特征词的个数。例如,第一句“This is the first document.”,它对应的词频为[0, 1, 1, 1, 0, 0, 1, 0, 1],假设初始序号从1开始计数,则该词频表示存在第2个位置的单词“document”共1次、第3个位置的单词“first”共1次、第4个位置的单词“is”共1次、第9个位置的单词“this”共1词。所以,每个句子都会得到一个词频向量。

        2.TfidfTransformer

        TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值。具体用法如下:

[python] view plain copy
  1. # coding:utf-8  
  2. from sklearn.feature_extraction.text import CountVectorizer  
  3.   
  4. #语料  
  5. corpus = [  
  6.     'This is the first document.',  
  7.     'This is the second second document.',  
  8.     'And the third one.',  
  9.     'Is this the first document?',  
  10. ]  
  11. #将文本中的词语转换为词频矩阵  
  12. vectorizer = CountVectorizer()  
  13. #计算个词语出现的次数  
  14. X = vectorizer.fit_transform(corpus)  
  15. #获取词袋中所有文本关键词  
  16. word = vectorizer.get_feature_names()  
  17. print word  
  18. #查看词频结果  
  19. print X.toarray()  
  20.   
  21. from sklearn.feature_extraction.text import TfidfTransformer  
  22.   
  23. #类调用  
  24. transformer = TfidfTransformer()  
  25. print transformer  
  26. #将词频矩阵X统计成TF-IDF值  
  27. tfidf = transformer.fit_transform(X)  
  28. #查看数据结构 tfidf[i][j]表示i类文本中的tf-idf权重  
  29. print tfidf.toarray()  
        输出结果入下所示:


        3.别人示例

        如果需要同时进行词频统计并计算TF-IDF值,则使用核心代码:
        vectorizer=CountVectorizer()
        transformer=TfidfTransformer()
        tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))
        下面给出一个liuxuejiang158大神的例子,供大家学习,推荐大家阅读原文:
         python scikit-learn计算tf-idf词语权重 - liuxuejiang

[python] view plain copy
  1. # coding:utf-8  
  2. __author__ = "liuxuejiang"  
  3. import jieba  
  4. import jieba.posseg as pseg  
  5. import os  
  6. import sys  
  7. from sklearn import feature_extraction  
  8. from sklearn.feature_extraction.text import TfidfTransformer  
  9. from sklearn.feature_extraction.text import CountVectorizer  
  10.   
  11. if __name__ == "__main__":  
  12.     corpus=["我 来到 北京 清华大学",#第一类文本切词后的结果,词之间以空格隔开  
  13.         "他 来到 了 网易 杭研 大厦",#第二类文本的切词结果  
  14.         "小明 硕士 毕业 与 中国 科学院",#第三类文本的切词结果  
  15.         "我 爱 北京 天安门"]#第四类文本的切词结果  
  16.     vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频  
  17.     transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值  
  18.     tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵  
  19.     word=vectorizer.get_feature_names()#获取词袋模型中的所有词语  
  20.     weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重  
  21.     for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重  
  22.         print u"-------这里输出第",i,u"类文本的词语tf-idf权重------"  
  23.         for j in range(len(word)):  
  24.             print word[j],weight[i][j]  
        输出如下所示:
[python] view plain copy
  1. -------这里输出第 0 类文本的词语tf-idf权重------           #该类对应的原文本是:"我来到北京清华大学"  
  2. 中国 0.0  
  3. 北京 0.52640543361  
  4. 大厦 0.0  
  5. 天安门 0.0  
  6. 小明 0.0  
  7. 来到 0.52640543361  
  8. 杭研 0.0  
  9. 毕业 0.0  
  10. 清华大学 0.66767854461  
  11. 硕士 0.0  
  12. 科学院 0.0  
  13. 网易 0.0  
  14. -------这里输出第 1 类文本的词语tf-idf权重------           #该类对应的原文本是: "他来到了网易杭研大厦"  
  15. 中国 0.0  
  16. 北京 0.0  
  17. 大厦 0.525472749264  
  18. 天安门 0.0  
  19. 小明 0.0  
  20. 来到 0.414288751166  
  21. 杭研 0.525472749264  
  22. 毕业 0.0  
  23. 清华大学 0.0  
  24. 硕士 0.0  
  25. 科学院 0.0  
  26. 网易 0.525472749264  
  27. -------这里输出第 2 类文本的词语tf-idf权重------           #该类对应的原文本是: "小明硕士毕业于中国科学院“  
  28. 中国 0.4472135955  
  29. 北京 0.0  
  30. 大厦 0.0  
  31. 天安门 0.0  
  32. 小明 0.4472135955  
  33. 来到 0.0  
  34. 杭研 0.0  
  35. 毕业 0.4472135955  
  36. 清华大学 0.0  
  37. 硕士 0.4472135955  
  38. 科学院 0.4472135955  
  39. 网易 0.0  
  40. -------这里输出第 3 类文本的词语tf-idf权重------            #该类对应的原文本是: "我爱北京天安门"  
  41. 中国 0.0  
  42. 北京 0.61913029649  
  43. 大厦 0.0  
  44. 天安门 0.78528827571  
  45. 小明 0.0  
  46. 来到 0.0  
  47. 杭研 0.0  
  48. 毕业 0.0  
  49. 清华大学 0.0  
  50. 硕士 0.0  
  51. 科学院 0.0  
  52. 网易 0.0  


        推荐几篇机器学习和NLP领域的大神博客:
        应用scikit-learn做文本分类 - Rachel-Zhang
        python scikit-learn计算tf-idf词语权重 - liuxuejiang
        用Python开始机器学习(5:文本特征抽取与向量化)(强推)- lsldd
        再谈word2vec - Felven (强推)
        利用word2vec对关键词进行聚类 - Felven (强推)
        Python 对文档内容TFIDF处理
        Python TF-IDF计算100份文档关键词权重 - chenbjin


        最后希望文章对你有所帮助,如果文章中存在不足或错误的地方,还请海涵~还是那句话,挺享受现在的老师生活,不论科研、项目,还是教学,很充实,加油!
        但行好事,莫问前程。
        待随满天李桃,再追学友趣事。
        (By:Eastmount 2016-08-08 下午5点  http://blog.csdn.net/eastmount/ )

python scikit-learn计算tf-idf词语权重

python的scikit-learn包下有计算tf-idf的api,研究了下做个笔记 1 安装scikit-learn包 sudo pip install scikit-learn ...
  • liuxuejiang158
  • liuxuejiang158
  • 2014年06月16日 12:55
  • 31526

[python] 使用scikit-learn工具计算文本TF-IDF值

在文本聚类、文本分类或者比较两个文档相似程度过程中,可能会涉及到TF-IDF值的计算。这里主要讲述基于Python的机器学习模块和开源工具:scikit-learn。文章包括:一.Scikit-lea...
  • Eastmount
  • Eastmount
  • 2016年08月08日 16:46
  • 19543

CountVectorizer、TfidfTransformer、TfidfVectorizer关系

#统计词频信息 ct=CountVectorizer(stop_words='english') print ct.fit_transform(test_x).todense() 输出: [[1 1 ...
  • hutao1101175783
  • hutao1101175783
  • 2017年08月15日 18:15
  • 716

应用scikit-learn做文本分类

文本挖掘的paper没找到统一的benchmark,只好自己跑程序,走过路过的前辈如果知道20newsgroups或者其它好用的公共数据集的分类(最好要所有类分类结果,全部或取部分特征无所谓)麻烦留言...
  • abcjennifer
  • abcjennifer
  • 2014年04月13日 20:53
  • 77849

[JAVA] 文本分段处理,中文

上一篇发布了一个小说,原文是PDF。 为了
  • gopain
  • gopain
  • 2014年11月06日 21:01
  • 1493

自然语言处理系列之TF-IDF算法

TF-IDF算法TF-IDF(词频-逆文档频率)算法是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在...
  • lionel_fengj
  • lionel_fengj
  • 2016年12月16日 23:55
  • 3644

文本型数据的向量化:TF-IDF

1.对于文本型数据的分类处理(或者其他的处理),根据ik和jcseg等分词器先对它们进行分词处理之后,大家都知道,计算机是处理不了汉字的,对于文本型的词我们如何才能让计算机处理呢?我们可以通过TF-I...
  • pan_haufei
  • pan_haufei
  • 2017年05月03日 16:44
  • 615

宝贵数据集——用于数据挖掘、机器学习、文本挖掘

1、气候监测数据集 http://cdiac.ornl.gov/ftp/ndp026b2、几个实用的测试数据集下载的网站 http://www.cs.toronto.edu/~roweis/data...
  • pangjiuzala
  • pangjiuzala
  • 2015年08月09日 18:55
  • 1687

python数据分析与挖掘学习笔记(3)_小说文本数据挖掘part1

这一节主要是对小说文本数据的挖掘项目。 文本挖掘的一个重要的应用是进行站点的个性化推荐。将用户感兴趣的信息推送给对应的用户,可以更好地发挥该信息的价值。比如,我们常常会在浏览网页的时候看到相关的广告是...
  • Ying_Xu
  • Ying_Xu
  • 2017年01月10日 12:52
  • 1709

文本挖掘系统的实现之R语言分词

1、文本挖掘的发展  对于文本挖掘大体可以分为两大类,一种是对单个文本的挖掘,主要是做文本结构析,文本摘要、信息表现,主要是挖掘单个文本中有价值的信息,在内容或结构上,主要应用在文本检索领域或搜索引擎...
  • u011955252
  • u011955252
  • 2016年02月25日 20:43
  • 1070
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大数据及人工智能基础系列3 文本挖掘的TF-IDF计算
举报原因:
原因补充:

(最多只允许输入30个字)