[0001]
本专利涉及将知识图谱的路径信息和结点的内容信息进行融合,从而提高推荐算法准确率和召回率的方法,属于知识图谱和推荐系统相关技术领域。
背景技术:[0002]
近年来,随着网络信息技术的不断发展,人们可以方便的从各种渠道获取到丰富的信息。但与此同时,人们也面临着信息过载的问题,很难从海量的数据中准确快速的找到自己想要的信息。在这种情况下,个性化推荐算法应运而生。个性化推荐可以利用高效的互联网工具,为人们提供准确的服务,从而帮助用户从海量的信息中个性化的提取有用的信息,以此来满足用户的需求。推荐系统可以在用户无明确需求的情况下,根据用户的历史行为数据,挖掘其中的规律,从而为每个用户个性化的提供其感兴趣的信息。在用户使用的同时,推荐系统还可以及时的记录下每个用户的行为数据,从而为后续的推荐提供数据来源。
[0003]
推荐系统的核心当属推荐算法,目前推荐算法的研究有很多种,其中协同过滤推荐算法是目前学术界研究最广泛的模型,被广大研究者所应用。该算法主要是针对已有的用户和物品信息,对当前用户最有可能感兴趣的物品来进行预测。主要可分为基于邻居的算法和基于模型的算法两大类。基于邻居的算法主要是根据与目标预测用户相似的其他用户偏好来进行推荐,通过计算不同用户及物品之间的相似度进行推荐的一种方法。而基于模型的算法则是将用户-物品评分矩阵转化为不同的模型,通过模型的建立和调优来进行预测。但该算法在推荐的过程中会受到可解释性、稀疏性、冷启动等诸多制约因素的影响,因此在推荐算法的研究过程中,缓解传统协同过滤推荐算法中的各个问题成为目前研究的重点。
[0004]
伴随着推荐系统的发展,大多数研究者开始致力于研究通过混合多种推荐算法来解决推荐的可解释性、数据稀疏以及冷启动等问题。目前机器学习和深度学习的蓬勃发展也为推荐系统提供了优化思路,同时基于知识图谱的推荐也逐渐被研究者所关注。
[0005]
基于知识图谱的推荐算法主要是以现有的推荐模型为基础,将知识图谱中关于物品、用户等实体的结构化知识加入到推荐模型当中,通过引入额外的知识来改善早期推荐模型中的数据稀疏问题。目前多是利用知识图谱表示学习来获取知识图谱中推荐物品的相关信息,并对该向量进行降维处理,得到知识的低维稠密矩阵,最终完成推荐。但缺点在于无法确定在不同场景下数据和关系的规模,并且未能解决算法的可解释性和冷启动等问题。因此,在基于知识图谱的推荐算法的性能优化上还值得进一步的探讨和研究。
技术实现要素:[0006]
本发明旨在提供一种利用用户-物品评分矩阵构建知识图谱,从而根据知识图谱结点的连接性得到每位用户的路径偏好信息,并融合各结点的内容信息来进行推荐的一种方法。
[0007]
与现有技术的区别在于:1.模型方面:现有技术多是单纯利用知识图谱元路径提
取将结点信息进行叠加或单纯利用知识图谱表示技术来将结点信息嵌入到向量中,没有将知识图谱的元路径与知识的具体结点信息相结合来进行推荐预测。2.可解释性方面:现有模型多是利用模型来提升预测的准确性,深度学习模型的缺陷是针对数据进行学习,但无法对模型预测结果进行解释,很难在可解释性上做分析。该模型针对各用户的不同类型偏好进行学习,从而弥补了模型可解释性的问题,使推荐结果的可解性增强。3.冷启动方面:现有技术针对模型的准确率和冷启动问题多是采用模型的dropout来随机丢弃部分结点特征,从而提高模型的鲁棒性,本模型将对模型的修改与多部分结点的属性信息相结合,共同解决冷启动问题,效果得到提升。
[0008]
该方法主要是基于传统协同过滤推荐中的矩阵分解算法,在其在实际应用当中存在的可解释性差、用户和物品的冷启动问题来进行研究。通过引入知识图谱的概念,首先将每个用户和物品包括其存在的各种属性信息进行预编码处理,并转化成低维向量的形式。其次利用用户和物品的评分信息,将每个用户和物品均作为一个结点存储在知识图谱当中。以图的形式来构建专业领域的知识图谱,通过图的遍历来提取到每个用户对于物品的路径偏好信息,并将每条路径所经过的各结点向量进行融合,将融合后的向量信息输入到循环神经网络模型当中。最后将模型训练结果与各结点属性信息融合,利用交叉熵损失函数来进行模型训练,调节模型参数,以达到最优效果。从而解决算法中存在的可解释性和冷启动问题,为用户提供更精准的推荐。
[0009]
本发明采用如下技术方案及实现步骤:
[0010]
(1)选定专业领域数据集,确定该领域元数据的关系和种类。
[0011]
(2)对数据集中不同类型数据进行预处理,得到标准化数据。该算法整体流程如图1所示。将原始用户评分数据集以8:2的比例生成训练数据集和测试数据集,每个数据以用户-物品数对的形式存储。后将生成的训练集再按20:1的比例生成负样本训练集。其中负样本训练集包含用户对某一物品不感兴趣的数据,每个数据同样以用户-物品数对的形式存储。然后将每个物品属性数据集中出现的各属性存放于字典当中,利用字典来记录每个物品属性的id值。同理再利用字典来记录每个用户属性的id值。最后将物品属性id和用户属性id分别写入对应的文件中,生成物品属性id文件和用户属性id文件。
[0012]
(3)对物品属性id文件和用户属性id文件中出现的各属性结点进行预编码,从而生成物品属性预编码文件和用户属性预编码文件,预编码向量维度设置为10。
[0013]
(4)利用训练数据集、负样本训练集、物品属性id文件、用户属性id文件,来以图的形式构建知识图谱。读取训练数据集中出现的结点,将读取到的用户-物品数对存储于列表当中。同理读取负样本训练集中出现的结点,将读取到的用户-物品数对存储于列表当中。构建一有向图。对出现的不同类型结点,在其id编号前添加相应字母,用于对不同类型的结点进行区分。将训练数据集中出现的每个结点数对,添加到有向图中,并用边对其进行相连。分别读取不同属性文件中的结点和属性,以此添加到有向图中。并用边对结点及其所对应的属性相连。对于每个用户-物品数对来说,其最大路径参数m可在[1,5]之间设定,该处设定最大路径参数为5。每条路径最大结点个数n可在[2,10]之间设定,该处设定每条路径最大结点个数为4。读取有向图,利用nx.all_simple_paths来分别提取出正向结点路径信息和负向结点路径信息,存储于正向路径文件和负向路径文件中。
[0014]
(5)构建循环神经网络gru,利用循环神经网络对用户的多种偏好进行学习,对来
自知识图谱中的偏好路径结点信息进行编码处理,并将编码后的数据添加一层注意力机制,从而保证获取到较远结点信息,防止信息丢失影响预测准确率。将经过注意力机制后的各条路径编码信息送入池化层,利用池化层来区分各条路径的重要程度,从而使最终预测结果更加准确。
[0015]
(6)为解决算法的冷启动问题,引入结点属性信息的概念。对于每个用户或物品结点来说,其各自的属性结点在知识图谱中呈发散状。因此根据构建好的知识图谱,获取到相应用户和物品的属性信息,进行特征融合。将融合后的用户属性编码于物品属性编码相乘,得到用户属性-物品属性向量,并与步骤五中模型预测结果以7:3的比例进行加和。
[0016]
(7)将步骤六中的预测结果统一经过sigmod激活函数,得到每个分向量的预测概率,每个分向量的结果在[0,1]之间。
[0017]
(8)将经过激活函数后的向量输入到交叉熵损失函数nn.bceloss()中,进行模型训练。
[0018]
(9)对于训练好的用户和物品特征向量,利用np.dot对两个向量相乘,得到预测评分。将评分从大到小进行排列,得出候选项目序列,此项目序列长度设为20。依次对训练集中每位用户出现的项目在候选序列中进行匹配,若读取到的项目出现在候选序列中,则命中数加1,最终用命中数/训练集用户-评分总数,得出模型的精确率。并用命中数/测试集用户-评分总数,得出模型的召回率。
附图说明
[0019]
图1为基于知识图谱的推荐算法流程图
[0020]
图2为基于知识图谱的多路径融合循环神经网络模型图
[0021]
图3为循环神经网络gru内部结构模型图
[0022]
图4为加入结点属性信息的多路径融合循环神经网络模型图
具体实施方式
[0023]
以下结合附图实例对本发明作进一步详细描述。
[0024]
本发明提供了一种基于知识图谱的推荐算法性能优化的方法,该方法包括以下步骤:
[0025]
步骤一:选定专业领域数据集,此处选定目前推荐算法研究领域较为常用的数据集:movielens-1m数据集。该数据集包含了756684条匿名的评分数据,共涉及6040个用户以及3382个电影。数据集详细信息如下表所示:
[0026][0027]
提取到数据集中用户-物品评分信息、用户的id号和属性信息以及物品的id号和属性信息。生成相应的用户-物品评分文件、用户-属性信息文件以及物品-属性信息文件。
[0028]
步骤二:将采集到的数据分成用户评分数据集、物品属性数据集、用户属性数据集。其中物品属性数据集包含类型、导演、演员属性。用户属性数据集包含性别、年龄、职业属性。将采集到的数据按不同类型进行分类,预处理后得到标准化数据。数据预处理具体步骤如下:
[0029]
(1)将用户-物品评分文件按8:2的比例生成训练数据集和测试数据集,每个数据以用户-物品数对的形式存储。并将生成的训练数据集再按20:1的比例生成负样本训练集。负样本训练集包含用户对某一物品不感兴趣的数据,每个数据同样以用户-物品数对的形式存储。
[0030]
(2)读取用户-属性信息文件,将读取到的每个数据属性置于一个字典当中。
[0031]
(3)针对每个属性赋予其唯一的id值,并将用户-属性信息转化为相应的用户id-属性id的形式。生成新的用户-属性id文件。
[0032]
(4)同理,将物品-属性信息文件转化为相应的物品-属性id文件。
[0033]
步骤三:对预处理后的数据进行预编码。预编码的结点包含:用户结点、物品结点、用户各属性结点以及物品各属性结点。设置预编码向量维度为10,分别生成各类结点的预编码文件。
[0034]
步骤四:根据训练数据集、负样本训练集、物品-属性id文件、用户-属性id文件构建专业领域知识图谱,从而根据生成的知识图谱提取出正向路径信息和负向路径信息。知识图谱具体构建步骤如下:
[0035]
(1)初始化一个数据列表,用于存放读取到的用户-物品数对。
[0036]
(2)读取训练数据集中出现的结点,将读取到的用户-物品数对存储于列表当中。
同理读取负样本训练集中出现的结点,将读取到的用户-物品数对存储于列表当中。
[0037]
(3)构建一有向图digraph。将训练数据集中出现的每个用户结点前添加字母
‘
u’、物品结点前添加字母
‘
i’用以区分不同类型的结点,利用digraph.add_node添加到有向图中,并利用digraph.add_edge将边进行相连。
[0038]
(4)读取物品属性id文件,将读取到的每个属性结点前分别添加字母
‘
g’、
‘
d’、
‘
a’用以区分不同属性。同样利用digraph.add_node将其添加到有向图中,并利用digraph.add_edge边将物品和不同属性进行相连。同理,读取用户属性id文件,将读取到的每个属性结点前分别添加字母
‘
g’、
‘
a’、
‘
o’用以区分不同属性。将其添加到有向图中,并用边将用户和不同属性进行相连。
[0039]
(5)设置最大路径参数m为5,最大路径参数m可在[1,5]之间设定。并设置每条路径最大结点个数为4,每条路径最大结点个数可在[2,10]之间设定。读取有向图digraph,利用nx.all_simple_paths()来分别提取出正向结点路径信息和负向结点路径信息,存储于正向路径文件和负向路径文件中,作为后续模型的输入。
[0040]
步骤五:构建循环神经网络gru模型。算法模型图如图2所示,模型的具体构建方法如下:
[0041]
(1)预处理层:对于步骤四中构建的知识图谱,其中(u
i
,v
j
)表示一个实体对,其中u代表用户集合,v代表物品集合。i代表某个用户i,j代表某个物品j。若存在用户i对物品j产生过交互,则利用不同长度的路径来连接该实体对。即存在p(u
i
,v
j
)=p{p1,p2,...,p
m
},m的值代表用户-物品数对个数,m值在[1,5]之间,m值过大可能会造成引入过多节点,导致预测结果准确率下降。因此,此处设置m的值为5。另外,知识图谱kg由三元组(h,r,t)组成,其中h∈e,r∈r,t∈e,分别表示一个知识三元组的头实体、关系和尾实体。e和r分别是知识图谱中的实体集和关系集。因此,可以将每个用户的交互行为表示成三元组(u
i
,interact,v
j
)的形式。其中interact表示用户u
i
和项目v
j
之间产生过交互。对于其中的任意一条路径存在其中e0=u
i
、e
n
=v
j
,p
m
代表用户-物品数对的第m条偏好路径,n表示经过的结点个数。r1、r2...rn表示连接偏好路径相对应的各个关系。其中所经过的e1、e2表示经过的物品属性结点。每条路径有其不同的语义表示。将生成的各条路径送入嵌入层,进行编码。
[0042]
(2)嵌入层:利用pytorch进行模型搭建。对于每个用户来说,用户-物品评分数对个数m的最大值为5,由于存在数对个数不足5的情况,因此数对个数用m来表示。每个数对经过的结点个数n为4。则对于每个用户-物品数对来说,存在m
×
4的预编码向量。获取到有向图中的所有结点个数为6149,并设置预编码层输入向量维度为10。将某个用户-物品数对所经过的m条路径逐一进行编码,每条路径预编码向量大小为4
×
10,预编码向量经过一层nn.embedding(num_embeddings=6149,embedding_dim=10),并将预编码向量利用nn.parmeter()转化为模型可修改参数,进行向量编码。编码后每个结点e
i
存在相对应的嵌入向量e
i
={e
i1
,e
i2
,e
i3
....e
ir
},r表示嵌入向量的维数,此处设置r的值为10。经过编码,对于每个用户-物品数对输出大小为4
×
10的嵌入向量,利用nn.view转化成大小为4
×1×
10的向量。
[0043]
(3)隐藏层:将编码后的4
×1×
10向量输入到nn.gru(input_size=10,hidden_size=16,num_layers=1,dropout=0.5)网络中进行训练,生成4
×1×
16的输出向量和1
×1×
16的隐藏向量。其中循环神经网络gru内部结构如图3所示。gru涉及到两个门控单元,分别为z
t
更新门和r
t
重置门。其具体公式如下:
[0044]
z
t
=σ(w
z
·
[h
t-1
,x
t
])
ꢀꢀꢀ
(1)
[0045]
r
t
=σ(w
r
·
[h
t-1
,x
t
])
ꢀꢀꢀ
(2)
[0046][0047][0048]
其中w
z
、w
r
、w分别为更新门权重、重置门权重和候选集权重,其值根据模型训练结果动态调整。h
t-1
、h
t
分别为上一时刻gru的输出值、当前候选集以及当前时刻的gru输出值。x
t
为当前时刻网络的输入值。σ代表sigmoid激活函数。[]表示两个向量相连,*表示矩阵的乘积,tanh()为双曲正切激活函数,使用的目的是为了克服模型梯度消失的问题。
[0049]
利用permute将输出向量的第一维度和第二维度进行交换,生成1
×4×
16的输出向量。考虑到较远路径结点信息无法全面获取的情况,因此引入注意力机制。首先将隐藏向量利用nn.view转换成大小为1
×
16
×
1的隐藏向量,然后利用torch.bmm对大小为1
×4×
16的输出向量和大小为1
×
16
×
1的隐藏向量相乘,得到大小为1
×4×
1的注意力层向量,并去掉向量的第三维度,得到1
×
4的注意力层向量。将注意力层向量经过f.softmax,得到每个分向量的概率值,生成1
×
4的注意力层向量。利用unsqueeze给注意力层向量添加第三维度,生成1
×4×
1的注意力层向量。再利用torch.bmm对大小为1
×4×
16的输出向量和大小为1
×4×
1的注意力层向量相乘,得到大小为1
×
16
×
1的注意力层输出向量,并利用squeeze去掉向量第三维度,生成大小为1
×
16的注意力层输出向量。利用unsqueeze给注意力层输出向量添加第一维度,得到大小为1
×1×
16的注意力层输出向量。将经过的m条用户-物品评分路径的注意力层输出向量利用torch.cat按列进行向量拼接,得到1
×
m
×
16的输出向量。
[0050]
(4)预测层:将输出向量通过平均池化层nn.adaptiveavgpool2d((1,16)),区分m条路径的重要程度,使模型对不同语义赋予不同的重要性权值。其具体公式如下:
[0051]
h[ij]=avg(hm[ij])
ꢀꢀꢀ
(5)
[0052]
其中m表示用户-项目数对的第m条路径,范围为1≤m≤5。h
m
[ij]表示每个(u
i
,v
j
)数对的各条路径表示,h[ij]表示经过平均池化层后,各路径表示的平均值。经过平均池化层后得到大小为1
×
16的向量。最后,在平均池化层后加入一层全连接层nn.linear(in_features=16,out_features=10,bias=true),对向量进行降维,其公式如下:
[0053]
o
ij
=f(h
[ij]
)=σ(w
f
·
h
[ij]
+b
f
)
ꢀꢀꢀ
(6)
[0054]
其中f(h
[ij]
)为以h[ij]作为自变量的全连接层函数,w
f
为全连接层系数,b
f
为全连接层偏置,其值根据模型训练结果动态调整。σ为sigmoid激活函数,,o
ij
为最终的预测向量。将经过平均池化层后的向量与全连接层系数相乘,加上全连接层偏置,最终得到大小为1
×
10的模型训练预测向量。
[0055]
步骤六:引入结点属性信息的概念。算法模型图如图4所示。获取到步骤五嵌入层中已编码后的用户向量、用户各属性向量、项目向量、项目各属性向量。对于每个用户和物品均包含有3个属性,因此将嵌入向量与原始用户和物品向量利用np.vstack按行逐一进行
叠加,生成4
×
10包含有属性信息的向量,再利用np.mean取各属性特征的平均值,分别得到1
×
10的用户属性融合向量及物品属性融合向量。将用户向量和物品向量利用np.multiply,对应分向量进行相乘,得到1
×
10的用户-物品属性向量。将该部分向量结果与步骤五中的模型训练预测向量结果以7:3的比例相加,得到融合预测向量。最后使用sigmod激活函数,输出10个特征各自的概率值。得到大小为1
×
10的最终预测向量。
[0056]
步骤七:利用bceloss()交叉熵损失函数对模型进行训练。在训练时设置epoch值为10,学习率为0.2。交叉熵损失函数具体公式如下:
[0057][0058]
其中i代表某个用户i,n代表用户总数。o
ij
表示(u
i
,v
j
)数对的最终预测向量,t
ij
表示(u
i
,v
j
)数对的目标向量,若(u
i
,v
j
)数对存在于正向路径信息文件中,则t
ij
为1。否则,t
ij
为0。log()为对数函数。loss(o,t)为以o
ij
作为输入向量,t
ij
作为目标向量的损失函数值。
[0059]
步骤八:对于训练好的用户和物品特征向量,利用np.dot对两个向量相乘,得到预测评分。将评分从大到小进行排列,得出候选项目序列,此项目序列长度设为20。依次对训练集中每位用户出现的项目在候选序列中进行匹配,若读取到的项目出现在候选序列中,则命中数加1,最终用命中数/训练集用户-评分总数,得出模型的精确率precision。并用命中数/测试集用户-评分总数,得出模型的召回率recall。其具体公式如下:
[0060][0061][0062]
其中r(u)表示根据用户u在训练集上的偏好行为得出的推荐列表,t(u)表示用户u在测试集上的推荐列表。经过实验对比,该模型比传统gru模型预测准确度提升2.3%,比传统矩阵分解算法模型预测准确度提升5.1%。