您现在的位置是:首页 > 电脑 > 

基于word2vec的多组词语相似度计算

2025-07-27 21:50:06
基于word2vec的多组词语相似度计算 文章目录 1. 前言2. 到对应词汇id. 算法逻辑.1 多次运行out行不通.2 修改placeholder. 修改余弦相似度变量.4 运行run 4. 实验结果4.1 小批量数据4.2 真实数据 5. 完整代码 1. 前言 之前写过一篇类似的文章,基于预训练词向量的文本相似度计算-word2vec, pa

基于word2vec的多组词语相似度计算

文章目录

  • 1. 前言
  • 2. 到对应词汇id
  • . 算法逻辑
    • .1 多次运行out行不通
    • .2 修改placeholder
    • . 修改余弦相似度变量
    • .4 运行run
  • 4. 实验结果
    • 4.1 小批量数据
    • 4.2 真实数据
  • 5. 完整代码

1. 前言

之前写过一篇类似的文章,基于预训练词向量的文本相似度计算-word2vec, paddle,讲的计算一个词汇和一组词汇的相似度计算。
本文主要讲,多组词语之间的相似度比较。

语料为:

A = [	轿车	, 	宝石	, 	旅游	, 	男孩子	,... ]
B = [	汽车	, 	宝物	, 	游历	, 	小伙子	, ...]

2. 到对应词汇id

def getVocab(path=):# 读取文件并得到dictvocab_dict = {} #unk:0id = 0with open(path, r, encoding=utf-8) as f:for line in f.readlines():word = line.strip()vocab_dict[word] = idid = 1return vocab_dictvocab_dict = getVocab()def getIdByWords(mylist):#根据mylist到对应的idmyid = []for word in mylist:myid.append(vocab_dict.get(word,0))return myidMC0_A = [	轿车	, 	宝石	, 	旅游	, 	男孩子	, 	海岸	, 	庇护所	, 	魔术师	, 	中午	, 	火炉	, 	食物	, 	鸟	, 	鸟	, 	工具	, 	兄弟	, 	起重机	, 	小伙子	,	旅行	, 	和尚	, 	墓地	, 	食物	, 	海岸	, 	森林	, 	岸边	, 	和尚	, 	海岸	, 	小伙子	, 	琴弦	, 	玻璃	, 	中午	, 	公鸡	]
id_a = getIdByWords(MC0_A)
print(id_a)

得到结果:

[8808, 6546, 608, 21590, 5701, 109972, 15229, 11022, 958, 162, 004, 004, 1067, 17, 291, 1017, 4592, 597, 727, 162, 5701, 1524, 1228, 597, 5701, 1017, 24705, 2675, 11022, 2585]

. 算法逻辑

.1 多次运行out行不通

直接按照 基于预训练词向量的文本相似度计算-word2vec, paddle 这篇文章来是不行的,原本想多运行几次out:

out = exe.run(feed={	source_emd_placeholder	:source_data, targets_emd_placeholder:targets_data},fetch_list=[])

只能运行一次,之后就不到out的变量了。

.2 修改placeholder

都改为一个变量就存一个emb向量:

id1_placeholder = fluid.layers.data(name=id1_placeholder, shape=[1], dtype=int64)
id2_placeholder = fluid.layers.data(name=id2_placeholder, shape=[1], dtype=int64)
. 修改余弦相似度变量
#计算余弦相似度
#有多少组要比较,则弄多少组
outs = []
for i in range(len(MC_A)):tmp = fluid._sim(id1_emb, id2_emb)outs.append(tmp)

这样保证每次运行的是不同的out,从而解决.1的问题。

.4 运行run
res = []
i = 0
for a,b in zip(MC_A, MC_B):id1 = np.array([a])id2 = np.array([b])out = exe.run(feed={	id1_placeholder	:id1, id2_placeholder:id2},fetch_list=[outs[i]])# print(out)i = 1res.append(out[0][0][0])
print(res)

应该还有更好的方法,比如直接将多组emb变量存储到一个矩阵中,再用矩阵运算,element-cos,但我没到对应的函数。

4. 实验结果

4.1 小批量数据
filename = work/
...
MC_A = [2, ]
MC_B = [1, 2]
...

4.2 真实数据
#加载word2vec文件
filename = /home/aistudio/data/data18976/word-char1.dim00
...
MC_A = [8808, 6546, 608, 21590, 5701, 109972, 15229, 11022, 958, 162, 004, 004, 1067, 17, 291, 1017, 4592, 597, 727, 162, 5701, 1524, 1228, 597, 5701, 1017, 24705, 2675, 11022, 2585]
MC_B = [916, 14874, 15450, 1017, 10488, 8271, 14564, 2497, 6184, 568, 2585, 7870, 11000, 597, 11000, 17, 8808, 2010, 7400, 2585, 6402, 727, 7400, 704, 1524, 14564, 5410, 15229, 16515, 8097]
...

5. 完整代码

import numpy as np################part1################################
#加载word2vec文件
filename = /home/aistudio/data/data18976/word-char1.dim00
# filename = work/def loadWord2Vec(filename):vocab = []embd = []cnt = 0fr = open(filename, 	r	, encoding=utf-8)line = fr.readline().strip()#print(line) # 00word_dim = int(line.split(	 	)[1])vocab.append(unk)embd.append([0]*word_dim)for line in fr :row = line.strip().split(	 	)vocab.append(row[0]) #把第一个字/词加入vocab中embd.append([np.float2(x) for x in row[1:]]) #把后面一长串加入embd中. 将字符转换成float2print(finish load word2vec.)()return vocab,embdvocab,embd = loadWord2Vec(filename)
vocab_size = len(vocab) #1
embedding_dim = len(embd[0]) #00
embedding = np.asarray(embd) # numpy格式的词向量数据################part2################################
#待计算的词汇id
MC_A = [8808, 6546, 608, 21590, 5701, 109972, 15229, 11022, 958, 162, 004, 004, 1067, 17, 291, 1017, 4592, 597, 727, 162, 5701, 1524, 1228, 597, 5701, 1017, 24705, 2675, 11022, 2585]
MC_B = [916, 14874, 15450, 1017, 10488, 8271, 14564, 2497, 6184, 568, 2585, 7870, 11000, 597, 11000, 17, 8808, 2010, 7400, 2585, 6402, 727, 7400, 704, 1524, 14564, 5410, 15229, 16515, 8097]
# MC_A = [2, ]
# MC_B = [1, 2]################part################################
#定义模型
import paddle.fluid as fluid
id1_placeholder = fluid.layers.data(name=id1_placeholder, shape=[1], dtype=int64)
id2_placeholder = fluid.layers.data(name=id2_placeholder, shape=[1], dtype=int64)#加载用户自定义或预训练的词向量
w_param_attrs = fluid.ParamAttr(name=w_param_attrs,initializer=fluid.initializer.umpyArrayInitializer(embedding),trainable=False)
#分别查询到对应的向量
id1_emb = (input=id1_placeholder, size=(vocab_size, embedding_dim), param_attr=w_param_attrs, dtype=	float2	)
id2_emb = (input=id2_placeholder, size=(vocab_size, embedding_dim), param_attr=w_param_attrs, dtype=	float2	)#计算余弦相似度
#有多少组要比较,则弄多少组
outs = []
for i in range(len(MC_A)):tmp = fluid._sim(id1_emb, id2_emb)outs.append(tmp)
out = fluid._sim(id1_emb, id2_emb)
out2 = fluid._sim(id1_emb, id2_emb)
print(finish build model.)################part4################################
#运行模型
GPU = True
place = fluid.CUDAPlace(0) if GPU else fluid.CPUPlace() # 定义运算场所
exe = fluid.Executor(place) # 创建执行器
exe.run(fluid.default_startup_program()) # 网络参数初始化print(finish init model.)res = []
i = 0
for a,b in zip(MC_A, MC_B):id1 = np.array([a])id2 = np.array([b])out = exe.run(feed={	id1_placeholder	:id1, id2_placeholder:id2},fetch_list=[outs[i]])# print(out)i = 1res.append(out[0][0][0])
print(res)

(不白嫖我们还是好朋友)

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/diannao/880925.html

相关标签:无
上传时间: 2024-04-17 06:53:18
留言与评论(共有 10 条评论)
本站网友 克林霉素磷酸酯注射液
22分钟前 发表
15229
本站网友 大话西游2长安地图
4分钟前 发表
旅游
本站网友 住房公积金贷款计算器
3分钟前 发表
8097] ... 5. 完整代码 import numpy as np################part1################################ #加载word2vec文件 filename = /home/aistudio/data/data18976/word-char1.dim00 # filename = work/def loadWord2Vec(filename)
本站网友 延边美食
9分钟前 发表
704
本站网友 德佑地产官网
6分钟前 发表
004
本站网友 大众搬家公司
2秒前 发表
15229
本站网友 华帝橱柜图片
19分钟前 发表
海岸
本站网友 男士减肥食谱
28分钟前 发表
语料为: A = [ 轿车
本站网友 存量房贷
30分钟前 发表
004