python word2vector计算相似度,word2vec 句子相似度
目录1。前言2。找到相应的词汇id3。算法逻辑3.1多次用完不起作用3.2修改占位符3.3修改余弦相似度变量3.4运行run 4。实验结果4.1小批量数据4.2真实数据5。完全码
1.介绍
我之前写过一篇类似的文章,基于预训练词向量的文本相似度计算——word 2 vec,paddle,讲的是计算一个词和一组词的相似度。
本文主要谈的是词组间的相似度比较。
文集是:
A=[汽车,宝石,旅游,男孩,]B=[汽车,珍宝,旅游,男孩,] 2.查找对应的词汇ID DEF get vocabulary(path= vocabulary . txt ):#读取文件并获取dict vocabulary _ dict={ } # unk :0 ID=0 with open(path, r ,encoding= utf-8 )as f:for line in f . Read lines():word=line . strip()vocab _ dict[word]=ID=1 return vocab _ dictvocab _ dict=getVocab()DEF IDBYWORDS(mylist):#在my list中查找word对应的ID MyID=[] 0)) Return MyID MC30 _ a=[car , gem , travel , Boys , Coast , Shelter , Magician , Noon , Fire , Food , Birds , Tools , Brothers , Crane , Boys , Travel , pgdddm ,墓地字符串, glass , Noon ]id _ a=getidbywords(MC30 _ a)print(id _ a)得到结果:
[8808, 6546, 608, 21590, 5701, 109972, 15229, 11022, 39583, 1362, 3004, 3004, 1067, 1733, 23391, 10317, 4592, 5973, 7327, 1362, 5701, 1524, 12328, 573, 5701, 10317, 24705, 2675, 11022, 25853] 3.算法逻辑3.1多次运行out不起作用。直接根据基于预先训练好的词向量——word 2 vec,paddle的文本相似度来计算。这篇文章不好。我最初几次想跑出去:
Out=exe . run(feed={ source _ EMD _ placeholder :source _ data, targets _ EMD _ placeholder :targets _ data },fetch _ list=[out.name])只能运行一次,然后就找不到out的变量了。
3.2将占位符更改为变量并保存emb向量:
id1 _ placeholder=fluid . layers . data(name= id1 _ placeholder ,shape=[1],dtype= int 64 )id2 _ placeholder=fluid . layers . data(name= id2 _ placeholder ,Shape=[1],dtype=int64) 3.3修改余弦相似度变量#计算余弦相似度#获取范围内I的尽可能多的输出集=[](len(MC _ a)):tmp=fluid . layers . cos _ sim(id1 _ emb,id2 _ id2)
3.4 Run run res=[] I=0for 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=1 RES . append(out[0][0][0])print(RES)应该有更好的方法,比如直接存储多套emb
4.实验结果4.1小批量数据文件名= work/test300d.txt .MCA=[2,3]MCB=[1,2].
4.2真实数据#加载word2vec文件filename=/home/aistudio/data/data 18976/word-char 1 . dim 300 .MC _ A=[8808,6546,608,21590,5701,109972,15229,] 39583,1362,3004,3004,1067,1733,23391,10317,4592,5973,7327,1362,5701,1524,12328,5977.
5.完整代码将数组导入为第一部分加载word2vec文件filename=/home/ai studio/data/data 18976/word-char 1。dim 300 # filename=工作/测试300d。txt def加载字2 vec(文件名):vocab=[] embd=[] cnt=0 fr=open(文件名, r ,编码=utf-8) line=fr.readline().strip()# print(line)# 3 300 word _ dim=int(line。split()[1])vocab。追加( unk )embd。为fr:row=line中的行追加([0]* word _ dim)。strip().拆分()词汇。追加(第[0]行)#把第一个字/词加入词汇量中embd。追加([NP。第[1:]])行中x的浮点32(x)#把后面一长串加入支架引流中。将字符转换成float32打印(完成加载word2vec .)fr.close()返回vocab,embdvocab,embd=加载字2 vec(文件名)vocab _ size=len(vocab)# 1 3 embedding _ dim=len(embd[0])# 300 embedding=NP。as数组(embd)# numpy格式的词向量数据###############第二部分############待计算的词汇idMC _ A=[8808 6546 608 21590 5701 109972 15229 11022 39583 1362 3004 3004 1067 1733 23391 10317 4592 5973 7327 1362 5701 1524 1233定义模型将桨.流体导入为流体1 _ placeholder=流体。层次。data(name= id1 _ placeholder ,shape=[1],dtype= int 64 )id2 _ placeholder=fluid。层次。data(name= id2 _ placeholder ,shape=[1],dtype=int64)#加载用户自定义或预训练的词向量w_param_attrs=流体ParamAttr( name=w_param_attrs ,初始值设定项=fluid。初始化器。numpyarrayinitializer(嵌入),可训练=假)#分别查询找到对应的向量id1 _ emb=流体。嵌入(input=id1 _ placeholder,size=(vocab_size,embedding_dim),param_attr=w_param_attrs,dtype= float 32 )id2 _ emb=fluid。嵌入(input=id2 _ placeholder,size=(vocab_size,embedding_dim),param_attr=w_param_attrs,dtype=float32)#计算余弦相似度#有多少组要比较,则弄多少组outs=[]for I in range(len(MC _ A)):tmp=fluid。层次。cos _ sim(id1 _ emb,id2 _ emb)输出。append(tmp)out=流体。层次。cos _ sim(id1 _ emb,id2 _ emb)out 2=流体。层次。cos _ sim(id1 _ emb,id2_emb)print(完成构建模型。)################第四部分############运行模型GPU=Trueplace=fluid .CUDAPlace(0)如果GPU else流体.CPUPlace() #定义运算场所exe=流体。执行人(地点)#创建执行器exe。运行(流体。default _ startup _程序())#网络参数初始化打印(完成初始化模型. res=[]i=0for 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=1 RES . append(out[0][0][0])print(RES)(不白嫖我们还是殷勤的八宝粥)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。