python 文本相似度_python 用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、相似度的计算

使用余弦相似度来计算用户查询和每个网页之间的夹角。夹角越小,越相似。

1 #coding=utf-8

2

3

4 #import warnings

5 #warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')

6 importlogging7 from gensim importcorpora, models, similarities8

9 datapath = 'D:/hellowxc/python/testres0519.txt'

10 querypath = 'D:/hellowxc/python/queryres0519.txt'

11 storepath = 'D:/hellowxc/python/store0519.txt'

12 defsimilarity(datapath, querypath, storepath):13 logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)14

15 classMyCorpus(object):16 def __iter__(self):17 for line inopen(datapath):18 yieldline.split()19

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

24 tfidf =models.TfidfModel(corpus)25

26 corpus_tfidf =tfidf[corpus]27

28 q_file = open(querypath, 'r')29 query =q_file.readline()30 q_file.close()31 vec_bow =dictionary.doc2bow(query.split())32 vec_tfidf =tfidf[vec_bow]33

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

37 similarity =list(sims)38

39 sim_file = open(storepath, 'w')40 for i insimilarity:41 sim_file.write(str(i)+'\n')42 sim_file.close()43 similarity(datapath, querypath, storepath)

贴一下我的test代码。

我的test文件querypath是一个问题,datapath是对这个问题的各种回答,我试图通过文本相似度来分析问题和哪个答案最匹配。。

原博客的测试是querypath是商品描述,datapath是商品的评论,通过文本相似度来分析,商品描述和实际的商品是否差异过大。

贴一下我的测试数据。很小的数据,就是测试一下这个:

注意所有的数据已经经过分词处理,分词怎么处理,可以用python的jieba库分词处理。可以参考http://www.cnblogs.com/weedboy/p/6854324.html

query

1160439-20170521184117119-1882230664.png

data

1160439-20170521184152103-599234217.png

store(也就是结果)

1160439-20170521184217244-1809208529.png

测试结果和问题实际上最应该匹配的对不上。。

总结:

1.gensim 除了提供了tf-idf 算法,好好利用

2.我用jieba分词的忘记删掉停用词了,给结果带来很大影响,jieba库里有函数可以删停用词的

3.问答系统中,关于问题和答案匹配,如果不用有监督的机器学习是不行的。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值