`

词向量加权计算相似度

阅读更多

基于词向量的几种计算文本相似度方法 :

   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

分享到:
评论

相关推荐

    SIF词向量相似度计算的一种方法

    通过使用PCA(主成分分析)或SVD(奇异值分解)对加权平均后的词向量进行微调,可以在一定程度上消除噪声,突出重要特征,从而使相似度计算结果更加准确。尽管从字面上可能识别出少量OCR错误,但这些不影响对文档...

    paddle_nlp_之词或者句子相似度计算.zip

    2. **句子相似度**:对于句子级别的相似度计算,除了使用词向量的平均或加权和之外,还可以利用更高级的方法。例如,**Sent2Vec**模型扩展了词向量的概念,将整个句子编码为一个向量;**BERT**等Transformer架构的...

    易语言向量法计算文本相似度

    源代码会包含这些算法的具体实现细节,以及如何将文本数据转化为向量,然后计算相似度的逻辑。 总的来说,"易语言向量法计算文本相似度"是一个涉及文本预处理、向量化表示和相似度度量的过程。通过理解这些概念和...

    易语言向量法计算文本相似度源码

    在易语言中实现向量法计算文本相似度,我们可以利用词袋模型(Bag-of-Words Model)或者TF-IDF(Term Frequency-Inverse Document Frequency)模型,将文本转化为数值向量,然后通过余弦相似度等方法来评估相似性。...

    Python基于同义词词林,知网,指纹,字词向量,向量空间模型的句子相似度计算项目源代码

    Python基于同义词词林,知网,指纹,字词向量,向量空间模型的句子相似度计算项目源代码 中文句子相似度计算,目前包括word-level和sentence-level两个level的计算方法。前者的思想是通过对句子进行分词,分别计算两...

    易语言源码易语言向量法计算文本相似度源码.rar

    5. **计算相似度**:有了向量表示后,就可以通过余弦相似度、Jaccard相似度或其他距离度量方法来计算两段文本的相似度。余弦相似度是两个向量的夹角余弦值,数值范围在-1到1之间,1表示完全相同,-1表示完全不同。 ...

    IKAnalyzer中文分词计算句子相似度

    TF-IDF加权的词项向量可以用来计算句子间的相似度。 4. **Word Embedding**:如Word2Vec或GloVe等模型,将词项映射到高维向量空间,利用向量间的角度或距离来衡量语义上的相似性。对于句子,可以使用Sentence2Vec等...

    vb实现用wordnet计算词间的相似度

    4. 计算余弦相似度:可以使用WordNet中的词项频率来计算余弦相似度,这是基于两个词向量在高维空间中的角度来衡量相似度。 5. 结合所有相似度:如果你需要更精确的结果,可以结合多种相似度计算方法,取平均值或加权...

    基于词向量的文本相似函数

    加载模型后,可以将输入的文本转换为词向量序列,然后计算两段文本的相似度。常用的相似度计算方法有余弦相似度、欧几里得距离等。余弦相似度通过计算两个向量的夹角余弦值来确定它们之间的相似性,其值范围在-1到1...

    知网语义相似度计算JAVA源码

    4. 相似度计算:根据词向量计算文本之间的相似度。 5. 结果验证:通过实际案例或已知结果进行测试,确保代码的正确性。 这个过程可能涉及到大量的算法和数据结构,因此对JAVA程序员的NLP背景和编程技巧有一定的要求...

    易语言向量法计算文本相似度源码-易语言

    4. **向量表示**:将整个文本表示为词向量的平均或加权和,形成文档向量。 5. **相似度计算**:利用余弦相似度或其他距离度量(如欧氏距离)来比较两个文本向量的相似度。余弦相似度是通过计算两个向量的夹角余弦值...

    word2vec_词向量_

    3. **文档相似度**:将文档转化为词向量平均值或TF-IDF加权后的词向量,可以计算不同文档间的相似度。 4. **推荐系统**:在信息检索和推荐系统中,词向量可以帮助理解用户与项目之间的关联。 5. **机器翻译**:词...

    文本相似度

    通过比较这些词向量的相似性,可以计算文本的相似度。 8. **段落向量(Paragraph Vector)**,如Doc2Vec:这是词嵌入的一种扩展,旨在对整个段落或文档进行向量化,从而更好地捕捉上下文信息。 9. **深度学习方法*...

    知乎中文词向量(共25W个词)

    1. **文本分类**:将文本转化为词向量的平均或加权和,然后输入到分类模型中。 2. **情感分析**:利用词向量捕捉情感词汇的极性,辅助判断整个文本的情感倾向。 3. **语义搜索**:通过计算查询词和文档向量的余弦...

    易语言快速计算文本相似度源码.rar

    余弦相似度则是通过计算两个文本向量在多维空间中的夹角余弦值;Levenshtein距离和编辑距离则是衡量两个字符串转化为对方所需的最少单字符编辑(插入、删除或替换)数量。易语言源码中可能会采用其中的一种或多种...

    问题句子相似度计算.

    4. **词嵌入**(Word Embeddings):如Word2Vec、GloVe等,将单词映射到高维向量空间,句子的相似度可以通过加权平均词向量计算。 5. **TF-IDF**:考虑词频(Term Frequency)和逆文档频率(Inverse Document ...

    人工智能-项目实践-文档向量-从文档中整句读取,将分好词的句子的每一个词转化为词向量.zip

    有多种策略可以生成文档向量,比如平均所有词向量、使用TF-IDF加权的词向量平均、或者使用更复杂的方法如Doc2Vec。Doc2Vec是一种扩展自Word2Vec的模型,它不仅能为单词生成向量,还能为整个文档生成向量,考虑了词序...

    glove.6B.zip

    然后,你可以查询词向量,计算相似度,甚至构建词云图,以可视化词汇之间的关联。 总的来说,GloVe词向量是NLP领域的重要工具,它们在多种任务中都有着广泛的应用。这个压缩包提供了不同维度的预训练词向量,为...

    Python-对四种句子文本相似度计算方法进行实验与比较

    在这种方法中,每个词被表示为一个向量,文本的相似度基于词向量的加权平均。`gensim`库提供了训练和使用Word2Vec模型的功能。 在进行实验比较时,我们需要准备一个合适的语料库,比如包含不同句子的文档集合。对于...

Global site tag (gtag.js) - Google Analytics