题目给出的代码
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)