基于word2vec的多组词语相似度计算
基于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]
. 算法逻辑
直接按照 基于预训练词向量的文本相似度计算-word2vec, paddle 这篇文章来是不行的,原本想多运行几次out:
out = exe.run(feed={ source_emd_placeholder :source_data, targets_emd_placeholder:targets_data},fetch_list=[])
只能运行一次,之后就不到out的变量了。
都改为一个变量就存一个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的问题。
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. 实验结果
filename = work/
...
MC_A = [2, ]
MC_B = [1, 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组装电脑配置单推荐报价格
上传时间: 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 |