6-26 两个规则(关键词)的修改-语义上
之前是直接计算两个关键词集合的杰卡德相似度,没有考虑关键词的语义信息,导致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)