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 文档。每条评论为一行。分词并去除停用词。效果如下图:
 
② 使用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)+'\n')#写入txt 时不要忘了编码
sim_file.close()

② 写入文档后相似度如图:
最后总的程序如下:

#! /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)+'\n')
sim_file.close()

gensim 包计算文本相似度基本也是这个步骤。而且gensim 除了提供了tf-idf 算法之外,还提供了LDA,LSV等更先进的方法。请各位客官慢慢享用。。。

转:Python 文本挖掘:使用gensim进行文本相似度计算的更多相关文章

  1. python 用gensim进行文本相似度分析

    http://blog.csdn.net/chencheng126/article/details/50070021 参考于这个博主的博文. 原理 1.文本相似度计算的需求始于搜索引擎. 搜索引擎需要 ...

  2. python 文本相似度计算

    参考:python文本相似度计算 原始语料格式:一个文件,一篇文章. #!/usr/bin/env python # -*- coding: UTF-8 -*- import jieba from g ...

  3. 4. 文本相似度计算-CNN-DSSM算法

    1. 文本相似度计算-文本向量化 2. 文本相似度计算-距离的度量 3. 文本相似度计算-DSSM算法 4. 文本相似度计算-CNN-DSSM算法 1. 前言 之前介绍了DSSM算法,它主要是用了DN ...

  4. 3. 文本相似度计算-DSSM算法

    1. 文本相似度计算-文本向量化 2. 文本相似度计算-距离的度量 3. 文本相似度计算-DSSM算法 4. 文本相似度计算-CNN-DSSM算法 1. 前言 最近在学习文本相似度的计算,前面两篇文章 ...

  5. 【Pyhton 数据分析】通过gensim进行文本相似度分析

    环境描述 Python环境:Python 3.6.1 系统版本:windows7 64bit 文件描述 一共有三个文件,分别是:file_01.txt.file_02.txt.file_03.txt ...

  6. word2vec词向量训练及中文文本类似度计算

    本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...

  7. Finding Similar Items 文本相似度计算的算法——机器学习、词向量空间cosine、NLTK、diff、Levenshtein距离

    http://infolab.stanford.edu/~ullman/mmds/ch3.pdf 汇总于此 还有这本书 http://www-nlp.stanford.edu/IR-book/ 里面有 ...

  8. 【NLP】Python实例:基于文本相似度对申报项目进行查重设计

    Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...

  9. NLP点滴——文本相似度

    [TOC] 前言 在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性.而有了文本之间相似性的度 ...

随机推荐

  1. 1、maven打包 install package deploy区别

    maven package:打包到本项目,一般是在项目target目录下.如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错. maven install:打 ...

  2. 逆向某停车app(原创)

    最近一直在做python开发的事情,信息安全方面做得很少,也是"蛋蛋"的忧伤呀.今天有朋友请我帮忙,将一个app里的文字和图标替换一下,花了一下午和一晚上的时间搞了一下,主要是图标 ...

  3. Linux TCP/IP调优参数 /proc/sys/net/目录

    所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数,后面是它们的含义: /proc/sys/net/core/rmem_default " ...

  4. 3.5星|《算法霸权》:AI、算法、大数据在美国的阴暗面

    算法霸权 作者在华尔街对冲基金德绍集团担任过金融工程师,后来去银行做过风险分析,再后来去做旅游网站的用户分析.后来辞职专门揭露美国社会生活背后的各种算法的阴暗面. 书中提到的算法的技术缺陷,我归纳为两 ...

  5. CentOS7使用阿里源安装最新版Docker

    卸载已经安装的Docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker ...

  6. PHP性能优化 -理论篇

    什么情况下,遇到了PHP性能问题?    1 PHP语法使用的不恰当    2 使用PHP语言做不了它不擅长做的事    3 用php语言连接的服务不给力    4 PHP自身的短板    5 我也不 ...

  7. 技本功丨请带上纸笔刷着看:解读MySQL执行计划的type列和extra列

    本萌最近被一则新闻深受鼓舞,西工大硬核“女学神”白雨桐,获6所世界顶级大学博士录取 货真价值的才貌双全,别人家的孩子 高考失利与心仪的专业失之交臂,选择了软件工程这门自己完全不懂的专业.即便全部归零, ...

  8. 基于C#的机器学习--机器学习的基本知识

    机器学习的基本知识 ,…用n个观测值测量.但我们不再对Y的预测感兴趣,因为我们不再有Y了,我们唯一感兴趣的是在已有的特征上发现数据模式: ​ 在前面的图中,我们可以看到这样的数据本身更适合于非线性方法 ...

  9. 搭建Git工作环境

    为什么要做版本控制? 在平时的工作中,经常会遇到写文档的事情,而写文档基本都不会一蹴而就,总是会修修改改很多次,而版本控制能够记录每次修改的版本,能够进行回溯.有很多版本控制工具,但是作为一个程序员, ...

  10. 撤销 git merge

    由于太多人问怎么撤销 merge 了,于是 git 官方出了这份教程,表示在 git 现有的思想体系下怎么达到撤销 merge 的目标. 方法一,reset 到 merge 前的版本,然后再重做接下来 ...