词向量 相似度,基于词向量的相似度匹配
基于单词向量计算文本相似度1 .测试数据:链接:https://潘。Baidu.com/s/1 fxjjcujamawtfsutg2c BWA
抽屉代码:f4vx
2 .实验代码:importmathimportosimportpandas aspdimportnumpyasnp #两个向量的余弦相似度defcos_Similarity(vec_dim,计算向量_1,输入vector_2) : #个向量#两个向量的点积x=0I=0#vec_dim=len(vector_1) #向量维度whileIvec_dim3360x=xvector_1[ 2两个向量的模I=0sq _ 1=0sq _ 2=0而ivec _ dim 3360 sq _ 1=sq _ 1 ve vector]vector _ 2[I]I=i1 result=float(x)/(math。sqrt)sq _ 1)数学。sqrrt 3360 with open(path,encoding=utf8 ) ] row=data[0].split(()0)#嵌入的行数col=data[0].拆分))(1)#嵌入的列数dim=int ) ) col (I=1 .split()word=item[0]embedding=item[1:]embedding=list(map))。嵌入)(item _ list。追加)单词)嵌入。追加)嵌入)I=1 #嵌入。append)item _ list)dimdeffind _ each(path):path _ list=[]files _ dir=OS。list dir)path)for file infiles _ dir 3360 file _ patth file))path _ list。追加(文件路径)路径路径2):#单输入vec _ dim _ 1=get _ embedding s(path _ 1)embeddings _ 2,vec _ dim _ 2=get _ embedding s(path _ 2)#成语向量相似度矩阵if vec _ dim _ 1==vec _ dim _ 23360 matrix=[]forem_1 neer forem _ 2 inem beddings _ 23360 cos _ sim=cos _ similarity(vec _ dim _ 1,em _ 1,em _2) score.aaad输入错误:打印(输入错误:尺寸不同)返回矩阵#卷积层,卷积核敏感区为2*2,参数为、输入词向量矩阵def CNN _ folding(dict _ vec):c=len)dict _ vec[1]#获取输入矩阵的水平长度r=len)字典_向量获取输入矩阵的垂直长度结果=
大蟒构造的二维列表对于范围内的我(r-1):#通过循环实现整个矩阵的运算对于范围(c-1)中的j:re=(dict _ vec[I][j]dict _ vec[I][j 1]dict _ vec[I 1][j]dict _ vec[I 1][j 1])/4 #实现卷积层的运算,这里卷积核默认是[[1,1],[1,1]]结果[i][j]=re返回结果#池化层,采用最大池化方式实现池化,参数表示输入矩阵def CNN _ pooling(dict _ pooling):c=len(dict _ pooling[1])r=len(dict _ pooling)result=[[0 for col in range(c-1)]for row in range(r-1)]# python构造的二维列表对于区间我(r-1):对于区间j(c-1):re=max(dict _ pooling[I][j],dict_pooling[i][j 1],dict_pooling[i 1][j), dict_pooling[i 1][j 1]) #最大池方法实现池化结果[i][j]=re返回结果#实现卷积层和池化层的连接层def pooling _ folding(matrix):RES=[]data _ list=matrix while 1:#交替实现卷积层和池化层c=len(data _ list[0])r=len(data _ list)如果c==1或r==1: #判定池化层跳出循环条件for I in range(len(data _ list)):for j in data _ list[I]:RES . append(j)break pool=CNN _ pooling(data _ list)#实现池化层如果len(pool)==1或len(pool[1])==1: #判定卷积层跳出循环的条件data _ list=pool for I in range(len(data _ list)):for j in data _ list[I]:RES . append(j)break else:fold=CNN _ folding(pool)# 实现卷积层data _ list=fold pool=[[0 for col in range(c-1)]for range(r-1)]fold=[[0 for col in range(c-1)]for row in range(r-1)]return resjd _ path=r d: thesis 0811 JD _ graph graph _ embedding s user _ path=r d: thesis 0811 user _ graph graph _ embedding s JD _ em _ paths=find _ each(JD _ path)#得到目录下的user _ em _ paths=find _ each(user _ path)job _ list=[]sim _ lists=[]for JD _ em _ paths中的JD _ file:sim _ dict={ } JD _ file _ name=OS。 路径。basename(JD _ file)JD _ name=JD _ file _ name。拆分(。)[0] # jd的类型名称用户_ em _路径中用户文件的作业_列表。append(JD _ name):sim _ matrix=get _ sim _ matrix(JD _ file,user_file) #行代表工作的嵌入,列代表用户的嵌入,值为两个把.嵌入的相似度sim _ RES=pooling _ folding(sim _ matrix)#送入卷积、池化层,全连接sim _ score=sum(sim _ RES)/len(sim _ RES)#求和平均用户文件名=操作系统。路径。basename(用户文件)用户名称=用户文件名称。拆分(。)[0] #用户id sim _ dict。更新({用户名:sim_score}) #或。更新(b=2) #每个岗位与各用户的相似度sim _ list=sorted(zip(sim _ dict。values(),sim_dict.keys()),reverse=True) #降序排列sim_list=sim_list[:100] #取前100个sim _列表。append(sim _ list)df=PD .数据帧()df[ JD _ sub _ type ]=job _ listdf[ sim _ users ]=sim _ listsdf。to _ CSV(./data/jd_user_sim_2.csv ,encoding=utf8 ,index=None,header=True) #写入文件,每个岗位与各用户的相似度# df=pd.read_csv(./data/jd_user_sim.csv ,编码=utf8 ,header=0) #读取文件打印(结束)3。说明代码实现的是两个文件夹中,文本把.嵌入两两之间的相似度。测试只提供了两个嵌入,需要更改合适的路径运行。
参考:https://博客。csdn。net/Mr _ carry/article/details/80996454(有核心代码的详解。)