相似度使用算法:TF-IDF
相似度使用的包:gensim/jieba
相似度的计算步骤:
1)读取文档
2)对要计算的文档进行分词
3)对文档进行整理成指定格式,方便后续的计算
4)计算出词语的频率
5)【可选】对频率低的词语进行过滤
6)通过语料库(corpus从文本中提取出的语言材料)建立词典
7)加载要对比的另一个文档
8)将要对比的文档通过doc2bow转化为稀疏向量
9)对稀疏向量进行进一步处理,得到新语料库,将新语料库进行处理
10)通过models将新语料库通过TF-IDF模型进行处理,得到TF-IDF
11)通过token2id得到特征数
12)通过similarties得出稀疏矩阵相似度,从而建立索引
13)得到最终相似度结果
相似度计算代码:
#文本相似度计算 from gensim import corpora,models,similarities import jieba from collections import defaultdict #数据类型容器模块 #1)读取文档 doc = 'F:\\anacondadaima\\shujuchuli\\d1.txt' doc2 = 'F:\\anacondadaima\\shujuchuli\\d2.txt' d1 = open(doc,'r',encoding = 'utf-8').read() d2 = open(doc2,'r',encoding = 'utf-8').read() # 2)对要计算的文档进行分词 data = jieba.cut(d1) data2 = jieba.cut(d2) # 3)对文档进行整理成指定格式,方便后续的计算(词语1 词语2 ... 词语n) data11 = "" for item1 in data: data11 += item1 +" " print(item1) data21 = "" for item2 in data2: data21 += item2 +" " print(item2) documents = [data11,data21] #将文本存为列表 #4)计算出词语的频率 texts = [[word for word in document.split()] for document in documents] frequency = defaultdict(int) #初始化字典(构建词典dictionary对象),即使键不存在也能返回一个int值 for text in texts: #token键的频率 for token in text: frequency[token] += 1 #5)过滤频率低的词语(词汇多的情况下使用) texts = [[word for word in text if frequency[token]>3] for text in texts] #6)通过语料库建立词典 dictionary = corpora.Dictionary(texts) dictionary.save('F:\\anacondadaima\\shujuchuli\\wenben1.txt')#保存词典 #7)加载要对比的另一个文档 doc3 = 'F:\\anacondadaima\\shujuchuli\\d3.txt' d3 = open(doc3,'r',encoding = 'utf-8').read() data3 = jieba.cut(d3) data31 = "" for item in data3: data31 += item +" " print(item) new_doc = data31 #8)转化为稀疏向量,9)再进一步处理得到新的语料库 new_vec = dictionary.doc2bow(new_doc.split())#转为稀疏向量 corpus = [dictionary.doc2bow(text) for text in texts]#建立新的语料库(稀疏向量) corpora.MmCorpus.serialize('F:\\anacondadaima\\shujuchuli\\d3.mm',corpus)#保存语料库 #10)通过models将新语料库通过TF-IDF模型进行处理,得到TF-IDF tfidf = models.TfidfModel(corpus) #11)通过token2id得到特征数 featureNum = len(dictionary.token2id.keys()) #12)通过similarties得出稀疏矩阵相似度,从而建立索引 index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features = featureNum) #tfidf通过语料库corpus和特征数feature sim = index[tfidf[new_vec]] #通过索引计算相似性(结果是d3与d1的相似度为0.17(偏小),d3与d1的相似度为0.43(偏大))