代码地址:https://github.com/RUCAIBox/WSDM2022-C2CRS
论文地址:https://arxiv.org/abs/2201.02732
(一)CoarseFineKGModel模型结构与功能
CoarseFineKGModel
是一个基于 PyTorch 的神经网络模型,用于学习知识图谱中的用户表示和实体表示。它通过两个主要的模块来实现:
- 知识图谱(KG)编码器:用于学习知识图谱中实体的嵌入表示。
- 对比学习(Contrastive Learning)投影:用于将知识图谱嵌入映射到用户嵌入空间,以便进行后续的对比学习或其他任务。
主要方法与逻辑
1. 初始化方法 (__init__
和 _build_model
)
__init__
:- 接收一个配置对象
config
,其中包含了模型的各种参数(如实体数量、嵌入维度、关系数量等)。 - 调用
_build_model
方法来构建模型的各个组件。
- 接收一个配置对象
_build_model
:- 调用
_build_kg_layer
、_build_kg_cl_project_head
和_build_ekg_cl_project_head
方法,分别构建知识图谱编码层、知识图谱对比学习投影头和实体级知识图谱对比学习投影头。
- 调用
2. 知识图谱编码层 (_build_kg_layer
和 _get_kg_user_rep
)
_build_kg_layer
:- 构建了知识图谱编码器
kg_encoder
,使用了RGCNConv
(Relational Graph Convolutional Network)来处理多关系图数据。 - 添加了一个自注意力层
kg_attn
,用于聚合用户相关的实体嵌入。 - 添加了一个全连接层
kg_user_rep_dense
,用于将知识图谱嵌入映射到用户嵌入空间。
- 构建了知识图谱编码器
_get_kg_user_rep
:- 使用
kg_encoder
对知识图谱进行编码,生成所有实体的嵌入表示kg_embedding
。 - 调用
_encode_user
方法,根据用户上下文中的实体列表,从知识图谱嵌入中提取对应的实体嵌入。使用自注意力层kg_attn
对实体嵌入进行聚合,生成用户表示。如果某个用户上下文中的实体列表为空,则返回一个零向量。最终,生成用户表示user_rep
。 - 返回知识图谱用户表示和实体嵌入表示。
- 使用
3. 去重逻辑 (get_duplicate_removal_ids
)
get_duplicate_removal_ids
:- 用于去除上下文中重复的实体 ID 和对应的对话 ID。
- 通过一个集合
dr_ekg_ids_set
来记录已经出现过的实体 ID,确保每个实体只被处理一次。 - 返回去重后的实体 ID 列表和对应的对话 ID 列表。
4. 实体表示生成 ( _get_project_entity_kg_reps
和_get_entity_kg_reps
)
_get_project_entity_kg_reps
:- 调用
_get_entity_kg_reps
获取实体嵌入,然后通过投影头_project_entity_kg_reps
将其映射到用户嵌入空间。
- 调用
_get_entity_kg_reps
:- 根据给定的实体 ID 列表,从知识图谱嵌入中提取对应的实体嵌入。
- 如果实体 ID 列表为空,则返回一个零向量。
5. 对比学习投影
_build_kg_cl_project_head
和_build_ekg_cl_project_head
:- 构建了两个投影头,分别用于知识图谱用户表示和实体表示的对比学习。
- 每个投影头包含两个全连接层(
fc1
和fc2
),用于将原始嵌入映射到目标嵌入空间。
_project_kg_user_rep
和_project_entity_kg_reps
:- 这两个方法分别对用户表示和实体表示进行投影,通过两个全连接层和 ReLU 激活函数,将嵌入映射到用户嵌入空间。
主要方法的输出
get_kg_rep
:- 输入:包含上下文实体的批量数据。
- 输出:
- 知识图谱用户表示
kg_user_rep
。 - 知识图谱实体嵌入表示
kg_embedding
。
- 知识图谱用户表示
get_project_kg_rep
:- 输入:包含上下文实体、实体 ID 和对话 ID 的批量数据。
- 输出:
- 投影后的知识图谱用户表示
project_kg_user_rep
。 - 去重后的实体 ID 列表
duplicate_removal_ekg_ids
。 - 去重后的对话 ID 列表
duplicate_removal_ekg_conv_ids
。 - 投影后的知识图谱实体表示
project_entity_kg_reps
。
- 投影后的知识图谱用户表示
(二)CoarseFineContextModel模型结构与功能
CoarseFineContextModel
主要用于处理文本上下文信息,特别是与用户表示学习和上下文嵌入相关的任务。它通过多个模块来实现对上下文的编码、用户表示的生成以及对比学习的投影。它通过以下模块实现:
- 上下文编码器:使用 Transformer 编码器对文本上下文进行编码。
- 对比学习投影头:将上下文嵌入映射到用户嵌入空间,用于对比学习。
- 自注意力机制:用于聚合上下文中的重要信息。
- 实体级上下文投影头:针对实体相关的上下文文本生成嵌入。
主要方法与逻辑
1. 初始化方法 (__init__
和 _build_model
)
__init__
:- 接收一个配置对象
config
和一个预训练的词嵌入token_embedding
。 - 调用
_build_model
方法构建模型的各个组件。
- 接收一个配置对象
_build_model
:- 调用
_build_context_transformer_layer
、_build_context_cl_project_head
、_build_atten
和_build_ect_cl_project_head
方法,分别构建上下文编码层、上下文对比学习投影头、自注意力模块和实体级上下文对比学习投影头。
- 调用
2. 上下文编码层 (_build_context_transformer_layer
和 _get_context_user_rep
)
_build_context_transformer_layer
:- 构建了一个 Transformer 编码器
context_encoder
,用于对文本上下文进行编码。 - 添加了一个全连接层
context_user_rep_dense
,用于将上下文嵌入映射到用户嵌入空间。
- 构建了一个 Transformer 编码器
_get_context_user_rep
:- 使用
_get_hidden_state_context_transformer
方法获取上下文的隐藏状态。 - 使用自注意力模块
ContextHiddenStateAttenFunc
对上下文隐藏状态进行聚合,生成用户表示。 - 返回上下文用户表示和上下文隐藏状态。
- 使用
3. 对比学习投影头
_build_context_cl_project_head
和_build_ect_cl_project_head
:- 构建了两个投影头,分别用于上下文用户表示和实体级上下文表示的对比学习。
- 每个投影头包含两个全连接层(
fc1
和fc2
),用于将原始嵌入映射到目标嵌入空间。
_project_context_user_rep
和_project_entity_context_text_reps
:- 这两个方法分别对上下文用户表示和实体级上下文表示进行投影,通过两个全连接层和 ReLU 激活函数,将嵌入映射到用户嵌入空间。
4. 自注意力机制 (_build_atten
)
_build_atten
:- 构建了一个自注意力机制
ContextHiddenStateAttenFunc
,用于聚合上下文中的重要信息。
- 构建了一个自注意力机制
_get_hidden_state_context_transformer
:- 使用 Transformer 编码器对上下文进行编码,获取隐藏状态。
- 提取隐藏状态的第一个 token(通常为
[CLS]
)作为上下文的表示。
5. 实体级上下文表示生成
_get_project_entity_context_text_reps
:- 输入:上下文隐藏状态和实体掩码。
- 输出:投影后的实体级上下文表示。
_get_entity_context_text_reps
:- 根据实体掩码,从上下文隐藏状态中提取与实体相关的部分。
- 对每个实体的上下文表示进行加权求和,生成实体级上下文表示。
_project_entity_context_text_reps
:- 使用实体级上下文投影头对实体级上下文表示进行投影,映射到用户嵌入空间。
主要方法的输出
get_project_context_rep
:- 输入:包含上下文、上下文掩码、上下文填充掩码、实体掩码和实体 ID 的批量数据。
- 输出:
- 投影后的上下文用户表示
project_context_user_rep
。 - 投影后的实体级上下文表示
project_entity_context_text_reps
。
- 投影后的上下文用户表示
(三)CoarseFineDistReviewModel模型结构与功能
CoarseFineDistReviewModel
主要用于处理评论(review)数据,生成用户表示和评论表示。它通过多个模块来实现对评论的编码、用户表示的生成以及对比学习的投影。它通过以下模块实现:
- 评论编码器:使用 Transformer 编码器对评论文本进行编码。
- 对比学习投影头:将评论嵌入映射到用户嵌入空间,用于对比学习。
- 自注意力模块:用于聚合评论中的重要信息。
- 分布式评论表示聚合模块:用于聚合多个评论的表示,生成用户表示。
主要方法与逻辑
1. 初始化方法 (__init__
和 _build_model
)
__init__
:- 接收一个配置对象
config
和一个预训练的词嵌入token_embedding
。 - 调用
_build_model
方法构建模型的各个组件。
- 接收一个配置对象
_build_model
:- 调用
_build_review_transformer_layer
、_build_review_cl_project_head
、_build_atten
、_build_distReviewRepAtten
和_build_entity_review_cl_project_head
方法,分别构建评论编码层、评论对比学习投影头、自注意力模块、分布式评论表示聚合模块和实体级评论对比学习投影头。
- 调用
2. 评论编码层 (_build_review_transformer_layer
和 _get_review_user_rep
)
_build_review_transformer_layer
:- 构建了一个 Transformer 编码器
review_encoder
,用于对评论文本进行编码。 - 添加了一个全连接层
review_user_rep_dense
,用于将评论嵌入映射到用户嵌入空间。
- 构建了一个 Transformer 编码器
_get_review_user_rep
:- 使用
_get_hidden_state_review_transformer
方法获取评论的隐藏状态。 - 使用自注意力模块
ReviewHiddenStateAttenFunc
对评论隐藏状态进行聚合,生成评论表示。 - 使用分布式评论表示聚合模块
distReviewRepAtten
对多个评论的表示进行聚合,生成用户表示。 - 返回评论用户表示、评论表示和评论隐藏状态。
- 使用
3. 对比学习投影头
_build_review_cl_project_head
和_build_entity_review_cl_project_head
:- 构建了两个投影头,分别用于评论用户表示和实体级评论表示的对比学习。
- 每个投影头包含两个全连接层(
fc1
和fc2
),用于将原始嵌入映射到目标嵌入空间。
_project_review_user_rep
和_project_review_rep
:- 这两个方法分别对评论用户表示和实体级评论表示进行投影,通过两个全连接层和 ReLU 激活函数,将嵌入映射到用户嵌入空间。
4. 自注意力模块 (_build_atten
)
_build_atten
:- 构建了一个自注意力模块
ReviewHiddenStateAttenFunc
,用于聚合评论中的重要信息。
- 构建了一个自注意力模块
_get_hidden_state_review_transformer
:- 使用 Transformer 编码器对评论进行编码,获取隐藏状态。
- 提取隐藏状态的第一个 token(通常为
[CLS]
)作为评论的表示。
5. 分布式评论表示聚合模块 (_build_distReviewRepAtten
和 encode_review_user_rep
)
_build_distReviewRepAtten
:- 构建了一个自注意力模块
distReviewRepAtten
,用于聚合多个评论的表示。
- 构建了一个自注意力模块
encode_review_user_rep
:- 根据每个用户的评论数量,将所有评论的表示聚合为一个用户表示。
- 使用
distReviewRepAtten
对每个用户的评论表示进行聚合。
6. 处理评论样本表示 (get_review_sample_reps
)
- 整理评论数据:
- 将每个用户的所有评论表示和嵌入整理成统一的格式。
- 确保每个用户的数据形状一致,即使某些用户评论数量不足,也会通过填充(padding)补齐。
- 生成两个掩码:
review_pad_mask
:标记哪些评论是真实的,哪些是填充的。review_token_padding_mask
:标记每条评论中哪些位置是真实的,哪些是填充的。
- 返回整理后的数据:
- 返回整理后的评论表示、掩码和嵌入表示,以便后续响应生成模型可以使用这些数据。
主要方法的输出
get_review_user_rep_and_review_rep
:- 输入:包含评论数据、评论掩码、评论填充掩码和每个用户的评论数量的批量数据。
- 输出:
- 评论用户表示。
- 评论的表示。
- 评论的隐藏状态。
get_project_review_rep
:- 输入:包含评论数据、评论掩码、评论填充掩码和每个用户的评论数量的批量数据。
- 输出:
- 投影后的评论用户表示。
- 投影后的实体级评论表示。
(四)CoarseFineDRUserModel模型结构与功能
CoarseFineDRUserModel
,它是一个组合模型,综合了知识图谱(KG)、上下文(Context)和评论(Review)三个模块的信息来生成用户表示:
- 知识图谱模块(
CoarseFineKGModel
):处理知识图谱数据,生成用户表示和实体表示。 - 上下文模块(
CoarseFineContextModel
):处理文本上下文信息,生成用户表示和实体相关的上下文表示。 - 评论模块(
CoarseFineDistReviewModel
):处理评论数据,生成用户表示和实体级评论表示。
主要方法与逻辑
1. 初始化方法 (__init__
和 _build_model
)
__init__
:- 接收一个配置对象
config
和一个预训练的词嵌入token_embedding
。 - 调用
_build_model
方法构建模型的各个组件。
- 接收一个配置对象
_build_model
:- 初始化三个子模块:
kGModel
:知识图谱模块,用于处理知识图谱数据。contextModel
:上下文模块,用于处理文本上下文信息。reviewModel
:评论模块,用于处理评论数据。
- 初始化三个子模块:
2. 获取投影后的用户表示 (get_project_user_rep
)
调用三个子模块的方法,分别获取知识图谱、上下文和评论模块生成的用户表示和实体表示。
- 调用知识图谱模块:
self.kGModel.get_project_kg_rep(batch, mode)
:- 获取知识图谱模块生成的用户表示
project_kg_user_rep
。 - 获取去重后的实体 ID 列表
duplicate_removal_ekg_ids
和对应的对话 ID 列表duplicate_removal_ekg_conv_ids
。 - 获取投影后的实体表示
project_entity_kg_reps
。
- 调用上下文模块:
self.contextModel.get_project_context_rep(batch, mode)
:- 获取上下文模块生成的用户表示
project_context_user_rep
。 - 获取投影后的实体级上下文表示
project_entity_context_text_reps
。
- 调用评论模块:
self.reviewModel.get_project_review_rep(batch, mode)
:- 获取评论模块生成的用户表示
project_review_user_rep
。 - 获取投影后的实体级评论表示
proj_entities_review_rep
。
- 输出:
- 投影后的知识图谱用户表示
project_kg_user_rep
。 - 投影后的上下文用户表示
project_context_user_rep
。 - 投影后的评论用户表示
project_review_user_rep
。 - 投影后的知识图谱实体表示
project_entity_kg_reps
。 - 投影后的上下文实体表示
project_entity_context_text_reps
。 - 投影后的评论实体表示
proj_entities_review_rep
。 - 去重后的实体 ID 列表
duplicate_removal_ekg_ids
。 - 去重后的对话 ID 列表
duplicate_removal_ekg_conv_ids
。
- 投影后的知识图谱用户表示
3. 获取用户表示 (get_user_rep
和 get_kg_user_rep
)
get_user_rep
:- 调用
get_kg_user_rep
方法,获取知识图谱模块生成的用户表示和实体嵌入,用于后续的推荐任务。
- 调用
get_kg_user_rep
:- 调用知识图谱模块的
get_kg_rep
方法,获取用户表示和实体嵌入。 - 返回用户表示和实体嵌入。
- 调用知识图谱模块的