转载: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条数据,并输出。
我的测试文本是“这日子过的,真不幸福,还好你过得幸福,我也开心”,输出结果是:
上面一个结果图没有输出元组数据。
元组中数据就是 该文本在原始文本中的索引和与测试文本的相似度。
效果还不错。就是速度较慢,跑一次得十几分钟,目前想把训练之后的模型保存下来,每次调用。还没实现,欢迎指教