PathSim:异质信息图中基于元路径的top-k相似搜索
标签(空格分隔): 图模型
本文研究异质信息网络同一类型的顶点上的相似搜索。此外,考虑网络中不同链接路径,可以推导出不同的语义相似度。这里介绍一种基于元路径的相似度。元路径是定义在不同类型顶点之间的一系列关系序列组成的一条路径。
异质信息网络
异质信息图(Heterogeneous information networks)是一个涉及多个类型的顶点对象,多个类型边(链接)的逻辑网络,例如,文献网络、社交网络。
信息网络(Information Network):一个信息网络定义为一个有向图
不同于传统网络的定义,明确的区分表示对象的顶点的类型和表示链接关系的边的类型。注意,如果类型
给定一个复杂的异质信息图,需要找到它的元层次描述以便于更好的理解。因此,提出
元路径相似度量框架
在一个异质信息图中,两个顶点对象可能通过不同的路径被连接。例如,两个作者之间的链接可能通过“作者-报纸-作者”的路径,“作者-报纸-发表场合-报纸-作者”的路径等等。不同的元路径代表不同的语义。
metapath:元路径是一个定义在图的网络模式
如果关系
通常定义一个元路径相似度框架,顶点对象
元路径的语义
以电影推荐系统为例,其中包含了用户(U)、小组、电影、导演、演员、类型6种顶点类型。其中用户可以通过元路径“用户-电影-用户(UMU)”相连,也可以通过元路径“用户-电影-导演-电影-用户(UMDMU)”相连。不同的元路径代表了不同的语义,元路径UMU代表用户观看了相同的电影,而元路径UMDMU代表观看了同一个导演执导的电影。基于元路径UMU观看了想通电影的用户更相似,基于元路径UMDMU观看了相同导演执导的电影的用户更相似。
PathSim
相似度量方法
往返元路径形式
其中,
给定一个元路径
下表展示了一个简单的网络中的作者和发表场合之间的邻接矩阵
- | SIGMOD | VLDB | ICDE | KDD |
---|---|---|---|---|
Mike | 2 | 1 | 0 | 0 |
Jim | 50 | 20 | 0 | 0 |
Mary | 2 | 0 | 1 | 0 |
Bob | 2 | 1 | 0 | 0 |
Ann | 0 | 0 | 1 | 1 |
计算Mike与其他作者的
对以上
baseline python3实现
# -*- encoding: utf-8 -*-
import pandas as pd
import numpy as np
class DBLPnetwork_PathSim:
def __init__(self, author, paper, venue, edge1, edge2):
# self.__file_to_dataframe(author, paper, venue)
self._read_edge1(edge1)
self._read_edge2(edge2)
self._build_path_APV()
self._build_AA_diagonal_APVPA()
def _read_edge1(self, edge1):
self.edge1 = pd.read_csv(edge1, header=0, index_col=0)
def _read_edge2(self, edge2):
self.edge2 = pd.read_csv(edge2, header=0, index_col=0)
def _build_path_APV(self):
m1 = self.edge1
m2 = self.edge2.sort_index(ascending=False)
m2_rowname = [x for x in m2.index]
m1 = m1.ix[:, m2_rowname]
mp = pd.DataFrame(np.dot(m1.values, m2.values), index=m1.index, columns=m2.columns)
self.mp = mp
# def __file_to_dataframe(self, author, paper, venue):
# self.author_vertices = self._read_author(author)
# self.paper_vertices = self._read_paper(paper)
# self.venue_vertices = self._read_venue(venue)
#
# def _read_author(self, author):
# self.author_vertices = pd.read_csv(author)
#
# def _read_paper(self, paper):
# self.paper_vertices = pd.read_csv(paper)
#
# def _read_venue(self, venue):
# self.venue_vertices = pd.read_csv(venue)
def _find_candidate_set_A(self, an_author):
''' 找到与目标向量不正交的的向量,作为候选集,这是baseline算法的优化核心 '''
yk = [y for y in self.mp.columns if self.mp.loc[an_author, y] != 0]
candidate_set_A = []
for y in yk:
for x in self.mp.index:
if self.mp.T.loc[y, x] != 0:
candidate_set_A.append(x)
else:
pass
candidate_set_A = list(set(candidate_set_A))
candidate_set_A.remove(an_author)
return candidate_set_A
def _build_AA_diagonal_APVPA(self):
authors = [x for x in self.mp.index]
diagals = np.diagonal(np.dot(self.mp.values, self.mp.values.T))
self.AA_dict_APVPA = dict(zip(authors, diagals))
return self.AA_dict_APVPA
def calcu_pathsim_value(self, an_author, other_author):
fenzi = 2 * np.dot(self.mp.loc[an_author, :], self.mp.T.loc[:, other_author])
fenmu = self.AA_dict_APVPA[an_author] + self.AA_dict_APVPA[other_author]
val = fenzi/fenmu
return round(val, 2)
def find_top_10_similar_authors_APVPA(self, an_author):
candidate_set_A = self._find_candidate_set_A(an_author)
similar_authors = [(x, self.calcu_pathsim_value(an_author, x)) for x in candidate_set_A]
sorted_list = sorted(similar_authors, key=lambda x: x[1], reverse=True)[:10]
print(sorted_list)
return sorted_list
def main():
dblp = DBLPnetwork_PathSim("author.csv", "paper.csv", "venue.csv", "edge1.csv", "edge2.csv")
print("============Top 10 using APVPA for Mike=================")
ADlist_APVPA = dblp.find_top_10_similar_authors_APVPA("Mike")
for author, val in ADlist_APVPA:
print(author)