本文在github上:https://github.com/Mrxiahelong/Unsupervised-Author-Disambiguation/实现
这里我们使用三张图结构 分别是paper-coauhor-paper,paper-cotitle-paper,paper-covenue-paper,也就是结点类型一种,边类型三种,我们的metapath类型为coauthor-cotitle-coauthor-cotitle.
def positive_sampler(path):
'''
对每一条path建立一个window大小的滑动窗口,
例如 0 1 2 3 4,window大小为2,则返回 pos_u=[0,0,1,1,1.....],pos_v=[1,2,0,2,3....]
'''
pos_u,pos_v=[],[]
for i in range(len(path)):
if len(path)==1:
continue
u=path[i]
v=np.concatenate([path[max(i-window,0):i],path[i+1:i+window+1]],axis=0)
pos_u.extend([u]*len(v))
pos_v.extend(v)
return pos_u,pos_v
def get_negative_ratio(metapath):
'''
对所有结点根据出现频率建立negative_ratio,出现频率越大的越有可能出现在负采样中
返回的ratio 是对每一个结点被负采样的概率
'''
node_frequency=dict()
sentence_count,node_count=0,0
for path in metapath:
for node in path:
node_frequency[node]=node_frequency.get(node,0)+1
node_count+=1