基于词向量的几种计算文本相似度方法 :
1)使用词向量求平均计算相似度
2)词向量tfidf加权求平均计算相似度
3)词向量加权-PCA计算相似度
from gensim import matutils from gensim.models import Word2Vec import pickle import scipy import numpy as np from gensim import corpora, models import numpy as np from sklearn.decomposition import PCA from typing import List #==============词向量求平均=================== def sentenceByWordVectAvg(sentenceList,model,embeddingSize): sentenceSet = [] for sentence in sentenceList: # 将所有词向量的woed2vec向量相加到句向量 sentenceVector = np.zeros(embeddingSize) # 计算每个词向量的权重,并将词向量加到句向量 for word in sentence: sentenceVector = np.add(sentenceVector, model[word]) sentenceVector = np.divide(sentenceVector,len(sentence)) # 存储句向量 sentenceSet.append(sentenceVector) return sentenceSet # ===============word2vec词向量+tfidf================== def sentenceByW2VTfidf(corpus_tfidf, token2id, sentenceList, model, embeddingSize): sentenceSet = [] for i in range(len(sentenceList)): # 将所有词向量的woed2vec向量相加到句向量 sentenceVector = np.zeros(embeddingSize) # 计算每个词向量的权重,并将词向量加到句向量 sentence = sentenceList[i] sentence_tfidf = corpus_tfidf[i] dict_tfidf = list_dict(sentence_tfidf) for word in sentence: tifidf_weigth = dict_tfidf.get(str(token2id[word])) sentenceVector = np.add(sentenceVector, tifidf_weigth * model[word]) sentenceVector = np.divide(sentenceVector, len(sentence)) # 存储句向量 sentenceSet.append(sentenceVector) return sentenceSet def list_dict(list_data): list_data=list(map(lambda x:{str(x[0]):x[1]},list_data)) dict_data = {} for i in list_data: key, = i value, = i.values() dict_data[key] = value return dict_data # ===============sentence2vec:词向量加权-PCA================== class Word: def __init__(self, text, vector): self.text = text self.vector = vector # a sentence, a list of words class Sentence: def __init__(self, word_list): self.word_list = word_list # return the length of a sentence def len(self) -> int: return len(self.word_list) # convert a list of sentence with word2vec items into a set of sentence vectors def sentence2vec(wdfs,token2id,sentenceList: List[Sentence], embeddingSize: int, charLen:int,a: float=1e-3): sentenceSet = [] for sentence in sentenceList: sentenceVector = np.zeros(embeddingSize) for word in sentence.word_list: p=wdfs[token2id[word.text]]/charLen a = a / (a + p) sentenceVector = np.add(sentenceVector, np.multiply(a, word.vector)) sentenceVector = np.divide(sentenceVector, sentence.len()) sentenceSet.append(sentenceVector) # caculate the PCA of sentenceSet pca = PCA(n_components=embeddingSize) pca.fit(np.array(sentenceSet)) u = pca.components_[0] u = np.multiply(u, np.transpose(u)) # occurs if we have less sentences than embeddings_size if len(u) < embeddingSize: for i in range(embeddingSize - len(u)): u = np.append(u, [0]) # remove the projections of the average vectors on their first principal component # (“common component removal”). sentenceVectors = [] for sentenceVector in sentenceSet: sentenceVectors.append(np.subtract(sentenceVector, np.multiply(u, sentenceVector))) return sentenceVectors # 获取训练数据 def gettrainData(): question_path = r'./shuxueTest/shuxueTrainData.pkl' longtextdata1 = pickle.load(open(question_path, 'rb')) longtextdata1=longtextdata1['question_text'] traind=longtextdata1[:5000] traindata=list(map(lambda x:x.split(' '),traind)) return traindata def saveIndex(sentence_vecs): corpus_len = len(sentence_vecs) print(corpus_len) index = np.empty(shape=(corpus_len, 200), dtype=np.float32) for docno, vector in enumerate(sentence_vecs): if isinstance(vector, np.ndarray): pass elif scipy.sparse.issparse(vector): vector = vector.toarray().flatten() else: vector = matutils.unitvec(matutils.sparse2full(vector, 200)) index[docno] = vector return index # 计算矩阵与向量余弦相识度 def cosine_Matrix(_matrixA, vecB): _matrixA_matrixB = np.dot(_matrixA, vecB.T).T _matrixA_norm = np.sqrt(np.multiply(_matrixA,_matrixA).sum(axis=1)) vecB_norm = np.linalg.norm(vecB) return np.divide(_matrixA_matrixB, _matrixA_norm * vecB_norm.transpose()) def trainWordVectAvg(): traindata=gettrainData() dictionary = corpora.Dictionary(traindata) ##得到词典 token2id = dictionary.token2id charLen = dictionary.num_pos corpus = [dictionary.doc2bow(text) for text in traindata] ##统计每篇文章中每个词出现的次数:[(词编号id,次数number)] print('dictionary prepared!') tfidf = models.TfidfModel(corpus=corpus, dictionary=dictionary) wdfs = tfidf.dfs corpus_tfidf = tfidf[corpus] model = Word2Vec(traindata, size=200, window=5, min_count=1, workers=4) # 词向量求平均得到句向量 sentence_vecs = sentenceByWordVectAvg(traindata, model, 200) # 词向量tfidf加权得到句向量 sentence_vecs = sentenceByW2VTfidf(corpus_tfidf, token2id, traindata, model, 200) #sentence2vec:词向量加权-PCA Sentence_list = [] for td in traindata: vecs = [] for s in td: w = Word(s, model[s]) vecs.append(w) sentence = Sentence(vecs) Sentence_list.append(sentence) sentence_vecs = sentence2vec(wdfs, token2id, Sentence_list, 200, charLen) query = sentence_vecs[0] print(query) index=saveIndex(sentence_vecs) query = sentence_vecs[0] # 计算相似度 cosresult = cosine_Matrix(index, query) cosresult = cosresult.tolist() sort_cosresult = sorted(cosresult) print(sort_cosresult) for i in sort_cosresult[-8:-1]: idx = cosresult.index(i) print(i, '===', traindata[idx]) print(traindata[0])
3)参考:https://blog.csdn.net/walker_hao/article/details/78974781
相关推荐
针对现有相似度算法存在查全率和查准率不高的问题,...以三对不同类型的心理咨询案例为例对综合加权相似度算法进行了验证,并与传统的基于最近距离的相似度计算方法进行对比,结果表明综合加权相似度计算方法更加精确。
针对传统的相似度计算方法只考虑文本结构特征或者语义信息导致文本相似度计算质量较低等问题,结合短文本特征稀疏的特性,提出一种多重检验加权融合短文本相似度计算方法。该方法使用编辑距离、考虑词频的语义信息及...
基于加权结构相似度的图像融合质量评价论文
关于相似度的算法 用于反抄袭软件的算法研究
针对现有相似度算法存在查全率和查准率不高的问题,...以三对不同类型的心理咨询案例为例对综合加权相似度算法进行了验证,并与传统的基于最近距离的相似度计算方法进行对比,结果表明综合加权相似度计算方法更加精确。
基于向量加权平均值的高效优化算法附Matlab代码.zip
来自华南理工大学的论文。文中提出了一种基于图像块分类的加权平均结构相似度的图像质量评价方法。仅供研究
1.版本:matlab2014/2019a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 ...
综合考虑案例的各个属性,分别采用不同的属性相似度计算方法,根据各个属性的重要程度加权,计算出案例的相似度。以三对不同类型的心理咨询案例为例对综合加权相似度算法进行了验证;并与传统的基于最近距离的相似度...
通过加权求和,得到64个数值,这些数值便是图像的“指纹”,将两组图像的指纹映射到64维空间,得到两组64维空间向量,通过空间夹角余弦公式得到两组图像的余弦值,将余弦值加一后除二,得到的小数乘100便是相似度。...
在对比传统词频相似度模型的基础上,提出并实现了一种基于加权语义相似度模型的自动问答系统。首先,利用语义树中词语间的距离和语义树的高度来计算词语间的语义相似度,然后利用词语间的语义相似度和词语的权重...
针对现有网页信息抽取方法普遍存在人工耗时大、抽取准确率低等问题,提出了一种基于加权频繁子树相似度的网页评论信息抽取方法WTS。首先通过视觉特征对网页进行剪枝处理;然后,通过深度加权的相似度度量方法抽取...
针对传统视频编码中编码率失真模型的不足,考虑等矩形全向视频的特征,提出一种基于球形加权结构相似度(WS-SSIM)的全向视频编码率失真优化方法。通过考虑投影平面内部结构相似度的失真情况,以及球面失真与投影...
该方法用一组频繁变化结构组成的文档向量模型代表一个XML文档,将频繁变化结构在簇中的出现比例作为权值,使用加权余弦相似度对XML文档进行聚类。经过实验分析,根据XML文档历史变化过程中的频繁变化结构能较好地将XML...
局部加权法利用MATLAB实现,自己写的
给出了一种基于属性熵和加权余弦相似度的离群数据挖掘算法LEAWCD.该算法首先根据局部属性熵分析每个对象在其k.邻域内的局部离群属性,并依据各离群属性的属性偏离度自动设置属性权向量;其次使用对高维数据有效的...
1.版本:matlab2014/2019a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 ...
在文本分类中,基于Word2Vec词向量的文本表示忽略了词语区分文本的能力,设计了一种用TF-IDF加权词向量的卷积神经网络(CNN)文本分类方法.新闻文本分类,一般只考虑正文,忽略标题的重要性,改进了TF-IDF计算方法,...
基于证据相似度的加权证据合成法,刘准钆,程咏梅,为解决DS规则无法直接处理高冲突证据遇到的问题,提出了基于证据相似度的加权证据合成法。将证据用向量表示,以向量方向相似度表�
:H0wNet知识库的义原网状结构的存在,使针对义项间的关系运算成为可能。针对传统词语相似度计算存在 的偏差.提出了相应的改进算法,使词语相似度计算更加准确、合理。