python数据分析-文本相似度分析

由于本文设计较多知识点,在编写代码之前需要搞清楚这些知识点的含义。

1。知识点解释

  • Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,支持流式训练,并提供了诸如相似度计算,信息检索等一些常用任务的API接口。
    gensim 以“文集”——文本文档的集合——作为输入,并生成一个“向量”来表征该文集的文本内容,从而实现语义挖掘。
  • TF-IDF.对于提取一篇文章的关键词,如果某个词很重要,它应该在这篇文章中多次出现。于是,我们进行”词频”(Term Frequency,缩写为TF)统计。现次数最多的词是—-“的”、”是”、”在”—-这一类最常用的词。它们叫做”停用词”(stop words),表示对找到结果毫无帮助、必须过滤掉的词。而对于我们需要的关键词,例如对于上篇博文中的《丰乳肥臀》,出现最多的前十个词中包括如:上官,女人,一个,地说,母亲。显然对于关键词:一个,地说,对反应文章的特性并没有其余几个好,这时,就是在词频的基础上,要对每个词分配一个”重要性”权重。最常见的词(”的”、”是”、”在”)给予最小的权重,较常见的词(”一个”)给予较小的权重,较少见的词(”上官”、”女人”)给予较大的权重。这个权重叫做”逆文档频率”(Inverse Document Frequency,缩写为IDF),它的大小与一个词的常见程度成反比。知道了”词频”(TF)和”逆文档频率”(IDF)以后,将这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。python数据分析-文本相似度分析_第1张图片python数据分析-文本相似度分析_第2张图片+1为了防止分母出现0。了解了TF-IDF之后,又出现了新的词:语料库。参考一
  • 语料库(corpus)。理论上语料越大越好 ,百度百科的解释:⒈语料库中存放的是在语言的实际使用中真实出现过的语言材料,因此例句库通常不应算作语料库;⒉语料库是承载语言知识的基础资源,但并不等于语言知识;⒊真实语料需要经过加工(分析和处理),才能成为有用的资源。
  • 余弦相似性。简单的说,对于要要计算相似度的两个句子,步骤:分词-计算词频-将词频写成向量形式-计算向量相似程度(向量夹角)。python数据分析-文本相似度分析_第3张图片
    计算方式如下:
    python数据分析-文本相似度分析_第4张图片
    python数据分析-文本相似度分析_第5张图片
    假定a向量是[x1, y1],b向量是[x2, y2],那么可以将余弦定理改写成下面的形式。
    python数据分析-文本相似度分析_第6张图片
    余弦的这种计算方法对n维向量也成立。假定A和B是两个n维向量,A是 [A1, A2, …, An] ,B是 [B1, B2, …, Bn] ,则A与B的夹角θ的余弦等于:
    python数据分析-文本相似度分析_第7张图片
    余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫”余弦相似性”。

    参考

    所以,对于要计算的两篇文章的相似度:
    (1)使用TF-IDF算法,找出两篇文章的关键词;
    (2)每篇文章各取出若干个关键词(比如20个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使用相对词频);
    (3)生成两篇文章各自的词频向量;
    (4)计算两个向量的余弦相似度,值越大就表示越相似。

2。代码

#!/user/bin/env python
#-*- coding:utf-8 -*-
#author:M10
import jieba
from gensim import corpora,models,similarities
from collections import defaultdict
doc1 = '/Users/wangxingfan/Desktop/doc1.txt'
doc2 = '/Users/wangxingfan/Desktop/doc2.txt'
d1 = open(doc1).read()
d2 = open(doc2).read()
data1 = jieba.cut(d1)
data2 = jieba.cut(d2)
list1 = []
list2 = []
list = []
for i in data1:
    list1.append(i)
for i in data2:
    list2.append(i)
list = [list1,list2]
frequency = defaultdict(int)#如果键不存在则返回N/A,而不是报错,获取分词后词的个数
for i in list:
    for j in i:
        frequency[j] +=1
#创建词典
dictionary = corpora.Dictionary(list)
#词典保存到本地
dictionary.save('/Users/wangxingfan/Desktop/dic1.txt')
doc3 = '/Users/wangxingfan/Desktop/doc3.txt'
d3 = open(doc3).read()
data3 = jieba.cut(d3)
data31 = []
for i in data3:
    data31.append(i)
new_doc = data31
#稀疏向量.dictionary.doc2bow(doc)是把文档doc变成一个稀疏向量,[(0, 1), (1, 1)],表明id为0,1的词汇出现了1次,至于其他词汇,没有出现。
new_vec = dictionary.doc2bow(new_doc)
#获取语料库
corpus = [dictionary.doc2bow(i) for i in list]
tfidf = models.TfidfModel(corpus)
#特征数
featureNUM = len(dictionary.token2id.keys())
#通过TfIdf对整个语料库进行转换并将其编入索引,以准备相似性查询
index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featureNUM)
#计算向量相似度
sim = index[tfidf[new_vec]]
print(sim)

输出结果[ 0. 0.7104941]
参考:
gensim教程
gensim:相似性查询
如何计算两个文档的相似度(二)

你可能感兴趣的:(数据分析)