利用python及jieba分词和gensim模块计算文本相似度

转载:https://blog.csdn.net/lunseqing5357/article/details/79917119

由于工作需要,接触自然语言处理,写一些笔记,请大家指教。

功能:

实现把文本库中和输入文本相似的文本输出。

工具:

Spyder,python3.6,codecs,jieba,gensim等模块。(需要自己安装相关模块,我使用的是pip安装)

程序:

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""
import jieba
from gensim import corpora,models,similarities
import codecs
#构建停用词表
#stop_words = 'E:/zss/zss/资料/网站积累的源码/doc2vec_java-master/file/totalstop.txt'
#stopwords = codecs.open(stop_words,'rb').readlines()
#stopwords = [ w.strip() for w in stopwords ]
#stop_flag = ['x', 'c', 'u','d', 'p', 't', 'uj', 'm', 'f', 'r']


#读取训练词库
Train_test = 'E:/zss/zss/资料/网站积累的源码/doc2vec_java-master/file/test.txt'
Traintest = codecs.open(Train_test,'rb').readlines()
Traintest = [w.strip() for w in Traintest]
# 分词完毕得到结果
Traintest_word = []
for word in Traintest:
    words_list = [words for words in jieba.cut(word)]
    Traintest_word.append(words_list)
#去除停用词
#result =[]
#result1 = []
#for word in Traintest_word:
#    if  word not in stopwords:
 #       result = result1.append(word)


#测试用词
doc_test = "这日子过的,真不幸福,还好你过得幸福,我也开心"
doc_test_list = [word for word in jieba.cut(doc_test)]
#TestResult = [] 
#TestResult1 = []
#for word in doc_test_list:
#    if  word not in stopwords:
#        TestResult = TestResult1.append(word)
#用dictionary方法获取词袋
dictionary = corpora.Dictionary(Traintest_word)
#词袋中用数字对所有词进行了编号
dictionary.keys()
#使用doc2bow制作语料库,利用词袋模型中的字典将其映射到向量空间
corpus = [dictionary.doc2bow(doc) for doc in Traintest_word]
#对测试文档也进行制作语料库,利用词袋模型中的字典将其映射到向量空间
doc_test_vec = dictionary.doc2bow(doc_test_list)
#使用TF-IDF模型对语料库建模
tfidf = models.TfidfModel(corpus)
#获文档中,每个词的TF-IDF值 tfidf[corpus]
#对每个目标文档,分析测试文档的相似度
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=len(dictionary.keys()))
sim = index[tfidf[doc_test_vec]]
#根据相似度排序是一个列表  表中每一项是一个元组   元组中前面是原句索引  后面是相似度
SimilaritiesList = sorted(enumerate(sim), key=lambda item: -item[1])
num = 0
while(num<=5):           
    Result_tutple = SimilaritiesList[num]       #获取元组   索引  相似度
    Result_index = Result_tutple[0]             #获取索引
    print(Traintest_word[Result_index])         # 输出分词后数值
    num = num + 1


思路:

首先读取本地用于训练模型得数据库,大概有34万条数据,按行读取并保存。




接着使用jieba分词进行分词处理。

然后获取待测试数据,也使用jieba分词进行分词。

然后就是制作语料库,

并将测试数据与库中每一条数据进行对比,计算相似度。

根据相似度排序,获取前6条数据,并输出。

我的测试文本是“这日子过的,真不幸福,还好你过得幸福,我也开心”,输出结果是:



上面一个结果图没有输出元组数据。

元组中数据就是 该文本在原始文本中的索引和与测试文本的相似度。

效果还不错。就是速度较慢,跑一次得十几分钟,目前想把训练之后的模型保存下来,每次调用。还没实现,欢迎指教


猜你喜欢

转载自blog.csdn.net/m0_37870649/article/details/80899880