基于词向量的几种计算文本相似度方法 :
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
相关推荐
通过使用PCA(主成分分析)或SVD(奇异值分解)对加权平均后的词向量进行微调,可以在一定程度上消除噪声,突出重要特征,从而使相似度计算结果更加准确。尽管从字面上可能识别出少量OCR错误,但这些不影响对文档...
2. **句子相似度**:对于句子级别的相似度计算,除了使用词向量的平均或加权和之外,还可以利用更高级的方法。例如,**Sent2Vec**模型扩展了词向量的概念,将整个句子编码为一个向量;**BERT**等Transformer架构的...
源代码会包含这些算法的具体实现细节,以及如何将文本数据转化为向量,然后计算相似度的逻辑。 总的来说,"易语言向量法计算文本相似度"是一个涉及文本预处理、向量化表示和相似度度量的过程。通过理解这些概念和...
在易语言中实现向量法计算文本相似度,我们可以利用词袋模型(Bag-of-Words Model)或者TF-IDF(Term Frequency-Inverse Document Frequency)模型,将文本转化为数值向量,然后通过余弦相似度等方法来评估相似性。...
Python基于同义词词林,知网,指纹,字词向量,向量空间模型的句子相似度计算项目源代码 中文句子相似度计算,目前包括word-level和sentence-level两个level的计算方法。前者的思想是通过对句子进行分词,分别计算两...
5. **计算相似度**:有了向量表示后,就可以通过余弦相似度、Jaccard相似度或其他距离度量方法来计算两段文本的相似度。余弦相似度是两个向量的夹角余弦值,数值范围在-1到1之间,1表示完全相同,-1表示完全不同。 ...
TF-IDF加权的词项向量可以用来计算句子间的相似度。 4. **Word Embedding**:如Word2Vec或GloVe等模型,将词项映射到高维向量空间,利用向量间的角度或距离来衡量语义上的相似性。对于句子,可以使用Sentence2Vec等...
4. 计算余弦相似度:可以使用WordNet中的词项频率来计算余弦相似度,这是基于两个词向量在高维空间中的角度来衡量相似度。 5. 结合所有相似度:如果你需要更精确的结果,可以结合多种相似度计算方法,取平均值或加权...
加载模型后,可以将输入的文本转换为词向量序列,然后计算两段文本的相似度。常用的相似度计算方法有余弦相似度、欧几里得距离等。余弦相似度通过计算两个向量的夹角余弦值来确定它们之间的相似性,其值范围在-1到1...
4. 相似度计算:根据词向量计算文本之间的相似度。 5. 结果验证:通过实际案例或已知结果进行测试,确保代码的正确性。 这个过程可能涉及到大量的算法和数据结构,因此对JAVA程序员的NLP背景和编程技巧有一定的要求...
4. **向量表示**:将整个文本表示为词向量的平均或加权和,形成文档向量。 5. **相似度计算**:利用余弦相似度或其他距离度量(如欧氏距离)来比较两个文本向量的相似度。余弦相似度是通过计算两个向量的夹角余弦值...
3. **文档相似度**:将文档转化为词向量平均值或TF-IDF加权后的词向量,可以计算不同文档间的相似度。 4. **推荐系统**:在信息检索和推荐系统中,词向量可以帮助理解用户与项目之间的关联。 5. **机器翻译**:词...
通过比较这些词向量的相似性,可以计算文本的相似度。 8. **段落向量(Paragraph Vector)**,如Doc2Vec:这是词嵌入的一种扩展,旨在对整个段落或文档进行向量化,从而更好地捕捉上下文信息。 9. **深度学习方法*...
1. **文本分类**:将文本转化为词向量的平均或加权和,然后输入到分类模型中。 2. **情感分析**:利用词向量捕捉情感词汇的极性,辅助判断整个文本的情感倾向。 3. **语义搜索**:通过计算查询词和文档向量的余弦...
余弦相似度则是通过计算两个文本向量在多维空间中的夹角余弦值;Levenshtein距离和编辑距离则是衡量两个字符串转化为对方所需的最少单字符编辑(插入、删除或替换)数量。易语言源码中可能会采用其中的一种或多种...
4. **词嵌入**(Word Embeddings):如Word2Vec、GloVe等,将单词映射到高维向量空间,句子的相似度可以通过加权平均词向量计算。 5. **TF-IDF**:考虑词频(Term Frequency)和逆文档频率(Inverse Document ...
有多种策略可以生成文档向量,比如平均所有词向量、使用TF-IDF加权的词向量平均、或者使用更复杂的方法如Doc2Vec。Doc2Vec是一种扩展自Word2Vec的模型,它不仅能为单词生成向量,还能为整个文档生成向量,考虑了词序...
然后,你可以查询词向量,计算相似度,甚至构建词云图,以可视化词汇之间的关联。 总的来说,GloVe词向量是NLP领域的重要工具,它们在多种任务中都有着广泛的应用。这个压缩包提供了不同维度的预训练词向量,为...
在这种方法中,每个词被表示为一个向量,文本的相似度基于词向量的加权平均。`gensim`库提供了训练和使用Word2Vec模型的功能。 在进行实验比较时,我们需要准备一个合适的语料库,比如包含不同句子的文档集合。对于...