贝叶斯案例3:文本关键词提取、新闻分类(python实现)

文本分析的基本概念:

1、停用词表:

    在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。也即检索中碰到这些词,自动忽略。

    对于一个给定的目的,任何一类的词语都可以被选作停用词。大致可分为两类:

  • 功能词,大量出现,比如语气助词、副词、介词、连接词等,通常自身并无明确的意义,比如英文的(“the”,“a”,“an”,“that”,“those”,“over”,“under”,“above” ),中文词(的,一些,在,哎呦等)

  • 应用十分广泛的词汇量,比如Internet上随处可见的“Web”一词,几乎在每个网站上均会出现,难以帮助缩小搜索范围,同时还会降低搜索的效率

2、关键词提取

    TF-IDF(term frequency–inverse document frequency)词频--反转文件频率,用以评估一个词对于一个文件或者一个语料库中的一个领域文件集的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。计算公式如下:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

  •     词频(term frequency,TF):某一个给定的词语在该文件中出现的次数。计算公式:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)


  • 逆向文件频率(inverse document frequency,IDF):是一个词语普遍重要性的度量。计算公式如下:贝叶斯案例3:文本关键词提取、新闻分类(python实现)

    其中1为了防止分母为0

计算案例;

    假如一篇文件的总词语数是100个,而词语“养殖”出现了3次,那么“养殖”一词在该文件中的词频就是 0.03 (3/100)。一个计算文件频率 (DF) 的方法是测定有多少份文件出现过“养殖”一词,然后除以文件集里包含的文件总数。所以,如果“养殖”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 9.21=( ln(10,000,000 / 1,000) )。最后的TF-IDF的分数为0.28=( 0.03 * 9.21)。

3、相似度与夹角余弦

    相似度度量(Similarity),即计算个体间的相似程度,相似度度量的值越小,说明个体间相似度越小,相似度的值越大说明个体差异越大。

    对于多个不同的文本或者短文本对话消息要来计算他们之间的相似度如何,一个好的做法就是将这些文本中词语,映射到向量空间,形成文本中文字和向量数据的映射关系,通过计算几个或者多个不同的向量的差异的大小,来计算文本的相似度。

    计算相似度可以有很多中方法,比如欧氏距离、切比雪夫距离、相关系数、马氏距离、夹角余弦等,至于各个计算的区别,具体看参考文章, 本文仅介绍夹角余弦。

    https://www.cnblogs.com/heaad/archive/2011/03/08/1977733.html   

  夹角余弦:

  几何中夹角余弦可用来衡量两个向量方向的差异。

   夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。

    当两个向量的方向重合时,夹角为0,夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。

贝叶斯案例3:文本关键词提取、新闻分类(python实现)贝叶斯案例3:文本关键词提取、新闻分类(python实现)

计算公式:

1)对于直角三角形,余弦定理:cos(θ)=a / c

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

2)对于一般三角形的余弦公式计算:


贝叶斯案例3:文本关键词提取、新闻分类(python实现)

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

3)在向量表示的三角形中,二维空间。假设a向量是(x1, y1),b向量是(x2, y2),

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

那么可以将余弦定理改写成下面的形式:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

4)多维空间,设向量 a = (x1,x2,...,xn),b = (y1,y2,...,yn) 。

夹角余弦推广到多维:   

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

4、相似度计算过程及案例:

 1)语调清洗,包括删除停用词、删除重复数据。   

比如,清洗后的句子有两个

句子A:我喜欢看电视,不喜欢看电影

句子B:我不喜欢看电视,也不喜欢看电影

2)分词:

分词结果:

句子A:我/喜欢/看/电视,不/喜欢/看/电影

句子B:我/不/喜欢/看/电视,也/不/喜欢/看/电影

3)形成语料库

案例:我,喜欢,看,电视,电影,不,也

4)统计词频

句子A:我1,喜欢2,看2,电视1,电影1,不1,也0

句子B:我1,喜欢2,看2,电视1,电影1,不2,也1

5)给出词频向量:

句子A:[1,2,2,1,1,1,0]

句子B:[1,2,2,1,1,2,1]

6)计算余弦相似度:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

5、LDA

   TF-IDF这种方法没有考虑到文字背后的语义关联,可能在两个文档共同出现的单词很少甚至没有,但两个文档是相似的。比如:

                “乔布斯离我们而去了。”

                “苹果价格会不会降?”

    两个文档没有共同出现的单词,但是句子是相似的。

     这就需要考虑到文档的语义,而语义挖掘的利器是主题模型,LDA就是其中一种比较有效的模型。

    LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。

LDA生成过程:

对于语料库中的每篇文档,LDA定义了如下生成过程:

  • 对每一篇文档,从主题分布中抽取一个主题;

  • 从上述被抽到的主题所对应的单词分布中抽取一个单词;

  • 重复上述过程直至遍历文档中的每一个单词。

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

LDA的整体流程:

    先定义一些字母的含义:文档集合D,主题(topic)集合T。

  • D中每个文档d看作一个单词序列<w1,w2,...,wn>,wi表示第i个单词,设d有n个单词(词袋wordbag)。

  • ·D中涉及的所有不同单词组成一个大集合VOCABULARY(简称VOC),LDA以文档集合D作为输入,希望训练出的两个结果向量(聚成k个topic,VOC*包含m个词):

  • ·对每个D中的文档d,对应到不同Topic的概率θd<pt1,...,ptk>,其中,pti表示d对应T中第i个topic的概率。pti=nti/n,其中nti表示d中对应第i个topic的词的数目,n是d中所有词的总数。

  • ·对每个T中的topict,生成不同单词的概率φt<pw1,...,pwm>,其中,pwi表示t生成VOC中第i个单词的概率。计算方法同样很直观,pwi=Nwi/N,其中Nwi表示对应到topict的VOC中第i个单词的数目,N表示所有对应到topict的单词总数。

LDA的核心公式如下:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

    p(w|d)=p(w|t)*p(t|d)。

    p(词语|文档)矩阵表示每个文档中每个单词的词频,即出现的概率;p(词语|主题)矩阵表示每个主题中每个单词的出现概率;p(主题|文档)矩阵表示每个文档中每个主题出现的概率。

LDA算法训练过程:

    LDA算法开始时,先随机地给θd和φt赋值(对所有的d和t)。然后上述过程不断重复,最终收敛到的结果就是LDA的输出。详细学习过程:

  • 针对一个特定的文档ds中的第i单词wi,如果令该单词对应的topic为tj,可以把上述公式改写为:

  • pj(wi|ds)=p(wi|tj)*p(tj|ds)

  • 现在我们可以枚举T中的topic,得到所有的pj(wi|ds),其中j取值1~k。然后可以根据这些概率值结果为ds中的第i个单词wi选择一个topic。最简单的想法是取令pj(wi|ds)最大的tj(注意,这个式子里只有j是变量),即argmax[j]pj(wi|ds)

  • 然后,如果ds中的第i个单词wi在这里选择了一个与原先不同的topic,就会对θd和φt有影响了(根据前面提到过的这两个向量的计算公式可以很容易知道)。它们的影响又会反过来影响对上面提到的p(w|d)的计算。对D中所有的d中的所有w进行一次p(w|d)的计算并重新选择topic看作一次迭代。这样进行n次循环迭代之后,就会收敛到LDA所需要的结果了


6、新闻分类案例:

1、原始数据处理、分词、清理停用词:

1)导入数据

贝叶斯案例3:文本关键词提取、新闻分类(python实现)


2)分词

分词使用jieba模块。

jieba功能实现案例如下:

案例1:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

案例2:利用jieba.analyse提取下关键词:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

定义分词功能:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

看数据执行结果:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

3)导入停用词

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

4)定义清除停用词

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

执行案例:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

按词频排序单词

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

2、用gensim进行LDA建模

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

执行案例:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)


3、利用贝叶斯

1)生成训练数据

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

可以看下训练数据的labels值

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

把label标签转为数字格式

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

建模:

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

把文档转为list格式

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

引用贝叶斯(有待验证)

贝叶斯案例3:文本关键词提取、新闻分类(python实现)

gensim的参考网址:

http://radimrehurek.com/gensim/

词云的参考文档:

http://blog.****.net/fontthrone/article/details/72775865