zoukankan      html  css  js  c++  java
  • 转:Python 文本挖掘:使用gensim进行文本相似度计算

    Python使用gensim进行文本相似度计算  

    转于:http://rzcoding.blog.163.com/blog/static/2222810172013101895642665/

     

    在文本处理中,比如商品评论挖掘,有时需要了解每个评论分别和商品的描述之间的相似度,以此衡量评论的客观性。
    评论和商品描述的相似度越高,说明评论的用语比较官方,不带太多感情色彩,比较注重描述商品的属性和特性,角度更客观。
    那么Python 里面有计算文本相似度的程序包吗,恭喜你,不仅有,而且很好很强大。
    这是从52nlp大神的博客里面发现的,其实具体的处理流程和程序和他的基本一致,只要仔细研读他的这几篇博客文章即可。
    (竟然还没提到程序包的名字,退票。。退票。。)
     
    其实题目就讲到了这个包的名字啦:gensim
    真心好用,谁用谁知道。。。
    接下来主要说一下针对商品评论和商品描述之间的相似度,怎么使用gensim来计算。
     
    原理
    1、文本相似度计算的需求始于搜索引擎。
    搜索引擎需要计算“用户查询”和爬下来的众多”网页“之间的相似度,从而把最相似的排在最前返回给用户。
    2、主要使用的算法是tf-idf
    tf:term frequency 词频
    idf:inverse document frequency 倒文档频率
    主要思想是:如果某个词或短语在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
    第一步:把每个网页文本分词,成为词包(bag of words)
    第三步:统计网页(文档)总数M。
    第三步:统计第一个网页词数N,计算第一个网页第一个词在该网页中出现的次数n,再找出该词在所有文档中出现的次数m。则该词的tf-idf 为:n/N * 1/(m/M)  (还有其它的归一化公式,这里是最基本最直观的公式)
    第四步:重复第三步,计算出一个网页所有词的tf-idf 值。
    第五步:重复第四步,计算出所有网页每个词的tf-idf 值。
    3、处理用户查询
    第一步:对用户查询进行分词。
    第二步:根据网页库(文档)的数据,计算用户查询中每个词的tf-idf 值。
    4、相似度的计算
    使用余弦相似度来计算用户查询和每个网页之间的夹角。夹角越小,越相似。
     
    实战
    主要分成三步。
    第一步,计算所有评论的tf-idf 值。
    第二步,使用所有评论的tf-idf 值算出商品描述的tf-idf 值。
    第三步,计算每一个评论和商品描述之间的tf-idf 余弦相似度。
     
    第一步
    ① 商品评论的储存形式(把Excel 中的评论数据分词并去停用词存储在txt 文档中):
    txt 文档。每条评论为一行。分词并去除停用词。效果如下图:
    Python 文本挖掘:使用gensim进行文本相似度计算 - rzcoding - Explore in Data
     
    ② 使用gensim 计算所有评论的tf-idf 值

    # 读取txt 文档中的每条评论并用itertools 的yield 方法存储起来(比起把所有数据存在数组中,使用itertools 的内存效率高,具体原理请google)

    class MyCorpus(object):

    def __iter__(self):
    for line in open(datapath):
    yield line.split()

    from gensim import corpora, models, similarities

    # 以下是把评论通过gensim 转化为tf-idf 形式,程序具体解释参见52nlp的博客或gensim官方文档
    Corp=MyCorpus()
    dictionary = corpora.Dictionary(Corp)
    corpus =[dictionary.doc2bow(text)for text inCorp]#把所有评论转化为词包(bag of words)

    tfidf = models.TfidfModel(corpus)#使用tf-idf 模型得出该评论集的tf-idf 模型

    corpus_tfidf = tfidf[corpus]#此处已经计算得出所有评论的tf-idf 值

    第二步
    ① 整个商品描述只有一行,经过分词和去停用词处理,得到与上面相似的txt 文档。只是它只有一行。
    ② 把商品描述看成是查询,把商品评论看成是网页,即可计算商品描述的tf-idf 值。

    #读取商品描述的txt 文档

    q_file = open(querypath, 'r')
    query = q_file.readline()
    q_file.close()


    vec_bow = dictionary.doc2bow(query.split())#把商品描述转为词包
    vec_tfidf = tfidf[vec_bow]#直接使用上面得出的tf-idf 模型即可得出商品描述的tf-idf 值

    第三步
    ① 计算相似度,然后写入txt 文档中

    index = similarities.MatrixSimilarity(corpus_tfidf)#把所有评论做成索引
    sims = index[vec_tfidf]#利用索引计算每一条评论和商品描述之间的相似度

    similarity = list(sims)#把相似度存储成数组,以便写入txt 文档

    sim_file = open(storepath,'w')
    for i in similarity:
    sim_file.write(str(i)+' ')#写入txt 时不要忘了编码
    sim_file.close()

    ② 写入文档后相似度如图:
    Python 文本挖掘:使用gensim进行文本相似度计算 - rzcoding - Explore in Data
     
    最后总的程序如下:

    #! /usr/bin/env python2.7
    #coding=utf-8

    import logging
    from gensim import corpora, models, similarities

    def similarity(datapath, querypath, storepath):
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

    classMyCorpus(object):
    def __iter__(self):
    for line in open(datapath):
    yield line.split()

    Corp=MyCorpus()
    dictionary = corpora.Dictionary(Corp)
    corpus =[dictionary.doc2bow(text)for text inCorp]

    tfidf = models.TfidfModel(corpus)

    corpus_tfidf = tfidf[corpus]

    q_file = open(querypath,'r')
    query = q_file.readline()
    q_file.close()
    vec_bow = dictionary.doc2bow(query.split())
    vec_tfidf = tfidf[vec_bow]

    index = similarities.MatrixSimilarity(corpus_tfidf)
    sims = index[vec_tfidf]

    similarity = list(sims)

    sim_file = open(storepath,'w')
    for i in similarity:
    sim_file.write(str(i)+' ')
    sim_file.close()

    gensim 包计算文本相似度基本也是这个步骤。而且gensim 除了提供了tf-idf 算法之外,还提供了LDA,LSV等更先进的方法。请各位客官慢慢享用。。。
  • 相关阅读:
    Unity3d vector3.forward和transform.forward的区别!
    UGUI实现摇杆
    UGUI实现拼图游戏
    Unity3d打包发布Android程序
    兼容PC和手机触摸代码
    unity3d中Transform组件变量详解
    运算符重载
    扩展方法
    string.Format格式化输出
    网络编程之Socket的TCP协议实现客户端与客户端之间的通信
  • 原文地址:https://www.cnblogs.com/lifegoesonitself/p/3506886.html
Copyright © 2011-2022 走看看