基于规则嵌入的论文比对系统——创新实训记录11

6-26 两个规则(关键词)的修改-语义上

创新实训记录11

之前是直接计算两个关键词集合的杰卡德相似度,没有考虑关键词的语义信息,导致overlap的数据非常少,而不同的单词可能表达的语义是相近的,所以需要对这个规则进行修改。

思路

思路:首先进行word embedding,将单词转换为向量。然后定义求两组关键词相似度的函数。假设我们有两个关键词集合,分别是{a1,a2,…,an},{b1,b2,…,bm}(假设n>m),将a1与b1,…,bm分别求余弦相似度,取max,同理,a2,…,an也进行同样的操作,最后得到n个max值,再将这些max值取平均得到一个实数,用它来代表两个关键词集合的相似度。

具体实现

使用python中的word2vec模块训练词向量。
对于全局的关键词,语料库选择keywords.txt

from gensim.models import word2vec
import gensim

# 利用word2vec计算词语相似度?
sentences=word2vec.Text8Corpus(r'D:/大学资料/大三下/项目实训/code+data/ACM数据集/keywords.txt')
model=word2vec.Word2Vec(sentences, size=128,min_count=1)
model.wv.save_word2vec_format("D:/大学资料/大三下/项目实训/code+data/ACM数据集/keyword.txt",binary = False)

对于子空间上的关键词,语料库选择abstracts.txt。因为子空间上的关键词都是在摘要中提取的,所以这些词肯定在abstracts中,并且有了完整的语句,训练效果会比上一个只有关键词的好。

from gensim.models import word2vec
import gensim
sentences=word2vec.Text8Corpus(r'D:/大学资料/大三下/项目实训/code+data/ACM数据集/text.txt')
model=word2vec.Word2Vec(sentences, size=128,min_count=1)
model.wv.save_word2vec_format("D:/大学资料/大三下/项目实训/code+data/ACM数据集/subkey.txt",binary = False)

然后定义求两组关键词相似度的函数。
全局上的关键词:参数是两篇论文的id,输出一个实数代表两篇论文全局关键词的相似度。如果某篇论文没有关键词信息,那么相似度为0.

#获取mdodel
model = gensim.models.KeyedVectors.load_word2vec_format("D:/大学资料/大三下/项目实训/code+data/ACM数据集/keyword.txt", binary=False)
# 定义相似度函数
def getKeySimi(id1,id2):
    simi = 0
    id1 = str(id1)
    id2 = str(id2)
    keywords1 = word_dic[id1]
    keywords2 = word_dic[id2]
    len1 = len(keywords1)
    len2 = len(keywords2)
    max_dis = []
    if len1>len2>0:
        for key1 in keywords1:
            # 每一个关键词与另一组关键词求cosine distance
            dis_list = []
            for key2 in keywords2:
                v1 = model[key1]
                v2 = model[key2]
                s = np.dot(v1, v2) / (norm(v1) * norm(v2))
                dis_list.append(s)
            maxc = max(dis_list)
            max_dis.append(maxc)
        simi = mean(max_dis)
    elif len1>0:
        for key2 in keywords2:
            # 每一个关键词与另一组关键词求cosine distance
            dis_list = []
            for key1 in keywords1:
                v1 = model[key1]
                v2 = model[key2]
                s = np.dot(v1, v2) / (norm(v1) * norm(v2))
                dis_list.append(s)
            maxc = max(dis_list)
            max_dis.append(maxc)
        simi = mean(max_dis)   
    
    return simi

测试一下:
在这里插入图片描述
子空间上的关键词:参数是两篇论文的id和子空间id,输出一个实数代表两篇论文在某子空间上关键词的相似度。如果某篇论文在该子空间上没有关键词,那么相似度为0.

# 定义函数
# 加载model
model = gensim.models.KeyedVectors.load_word2vec_format("D:/大学资料/大三下/项目实训/code+data/ACM数据集/subkey.txt", binary=False)
#用于判断特殊的关键词
vocab_li=model.index2word 
def getSubSimi(id1,id2,subid):
    filename = 'D:/大学资料/大三下/项目实训/个人资料/6-24子空间关键词/pke-master/pke-master/tests/sub'+str(subid)+'_keyword.npy'
    key_dict = np.load(filename, allow_pickle=True).item()
    simi = 0
    if id1 in key_dict.keys()and id2 in key_dict.keys():
        keywords1 = key_dict[id1]-{'-'}
        keywords2 = key_dict[id2]-{'-'}
        len1 = len(keywords1)
        len2 = len(keywords2)
        max_dis = []
        if len1>len2>0:
            for key1 in keywords1:
                # 每一个关键词与另一组关键词求cosine distance
                dis_list = []
                for key2 in keywords2:
                    if key1 in vocab_li and key2 in vocab_li:
                        v1 = model[key1]
                        v2 = model[key2]
                        s = np.dot(v1, v2) / (norm(v1) * norm(v2))
                        dis_list.append(s)
                    maxc = max(dis_list)
                    max_dis.append(maxc)
            simi = mean(max_dis)
        elif len1>0:
            for key2 in keywords2:
                # 每一个关键词与另一组关键词求cosine distance
                dis_list = []
                for key1 in keywords1:
                    v1 = model[key1]
                    v2 = model[key2]
                    s = np.dot(v1, v2) / (norm(v1) * norm(v2))
                    dis_list.append(s)
                maxc = max(dis_list)
                max_dis.append(maxc)
            simi = mean(max_dis)
    return simi 

测试一下:

a = getSubSimi(102,191,0)
print(a)
b = getSubSimi(174,175,0)
print(b)
c= getSubSimi(174,175,1)
print(c)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值