蓝桥杯Word2Vec计算文本相似度学习笔记

题目给出的代码

import jieba
import numpy as np
from gensim.models import Word2Vec
from sklearn.metrics.pairwise import cosine_similarity

w2v_file_path = "word2vec_model.bin"
W2V_MODEL= Word2Vec.load(w2v_file_path)
W2V_SIZE = 100

def get_w2v(word):
    #TODO

def get_sentence_vector(sentence):
    #TODO

def get_similarity(array1, array2):
    array1_2d = np.reshape(array1, (1, -1))
    array2_2d = np.reshape(array2, (1, -1))
    similarity = cosine_similarity(array1_2d, array2_2d)[0][0]
    return similarity

def main():
    # 测试两个句子
    sentence1 = '我不喜欢看新闻。'
    sentence2 = '我觉得新闻不好看。'
    sentence_split1 = jieba.lcut(sentence1)
    sentence_split2 = jieba.lcut(sentence2)
    # 获取句子的句向量
    sentence1_vector = get_sentence_vector(sentence_split1)
    sentence2_vector = get_sentence_vector(sentence_split2)
    # 计算句子的相似度
    similarity = get_similarity(sentence1_vector, sentence2_vector)
    print(similarity) 

if __name__ == '__main__':
    main()

必要知识点 

jieba.lcut(字符串)

1.jieba是python中的中文分词第三方库,可以将中文的文本通过分词获得单个词语,返回类型为列表类型。

2.jieba分词共有三种模式:精确模式、全模式、搜索引擎模式。

(1)精确模式语法:jieba.lcut(字符串,cut_all=False),默认时为cut_all=False,表示为精确模型。精确模式是把文章词语精确的分开,并且不存在冗余词语,切分后词语总词数与文章总词数相同。

jieba.lcut("你是一只可爱的小猪")
# ['你', '是', '一只', '可爱', '的', '小猪']

Word2Vec介绍

简单来说,Word2Vec 并不是一个具体的神经网络模型,而是一个由很多生成词向量的模型(算法)组成的词向量生成框架,或者词向量生成工具。它的原理大致就是通过背后的CBow和skip-gram模型进行相应的计算,然后得出词向量。Word2Vec来源于python第三方库gensim。

模型常用API

model = Word2Vec.load("word2vec_model.bin")
model.wv.most_similar("电影")   找最相似的词
model.wv.get_vector("电影")     获取词向量,返回值一个numpy.ndarray 类型的词向量
model.wv["电影"]                   获取词向量

model.wv.index_to_key           模型词汇表,字符串列表

不常用的: 

model.wv  输出 KeyedVectors<vector_size=100, 43537 keys>

 答案

函数 get_w2v

  • 功能:调用训练好的词向量模型,获取词的词向量。
  • 参数:
    • word :string,一个词。
  • 返回值:
    • word_vector:如果输入词在模型词汇表中,则返回一个 numpy.ndarray 类型的词向量,如果不在,则返回 None。
def get_w2v(word):
    if word in W2V_MODEL.wv:
        return W2V_MODEL.wv[word]
    else:
        return None

函数 get_sentence_vector

  • 功能:获取句子的向量表示,具体方法为:
    • 遍历句子中的每一个词,调用 get_w2v 函数,获取词向量表示。
    • 计算所有词向量的平均值作为句子的向量表示。如果一个句子中所有词向量均为 None,则返回一个形状为 (100,) 的全零向量。
  • 参数:
    • sentence:list,一个经分词处理后的句子。
  • 返回值:
    • sentence_vector:numpy.ndarray,句向量。如果句子中的词语没有对应的词向量,则返回一个全零向量。
def get_sentence_vector(sentence):
    vec_ls = [get_w2v(word) for word in sentence]
    vectors = [vec for vec in vec_ls if vec is not None]
    if len(vectors) == 0:
        sentence_vector = np.zeros(W2V_SIZE)
        return sentence_vector
    else:
        return np.mean(vectors, axis=0)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值