标签: AGI

  • 为新闻推荐系统预训练词向量和实体向量

    新闻推荐系统近年来发展迅速,其中一个重要的技术突破是深度知识感知网络 (DKN) 的出现。DKN 能够利用知识图谱 (KG) 中的实体信息来增强新闻推荐的准确性。为了训练 DKN 模型,我们需要预先训练词向量和实体向量,本文将介绍如何使用 Word2Vec 和 TransE 模型来完成这一任务。

    用 Word2Vec 训练词向量

    Word2Vec 是一种常用的词向量训练模型,它能够将词语映射到一个高维向量空间中,并学习到词语之间的语义关系。在 DKN 中,我们需要将新闻标题和文本中的词语转换为向量表示,以便模型能够理解文本内容。

    我们可以使用 Gensim 库中的 Word2Vec 模型来训练词向量。Gensim 提供了简单易用的接口,可以方便地加载文本数据并训练模型。

    from gensim.test.utils import common_texts, get_tmpfile
    from gensim.models import Word2Vec
    import time
    from utils.general import *
    import numpy as np
    import pickle
    from utils.task_helper import *

    首先,我们定义一个类 MySentenceCollection 来读取新闻文本数据。该类实现了迭代器接口,可以逐行读取文本文件并将其转换为词语列表。

    class MySentenceCollection:
        def __init__(self, filename):
            self.filename = filename
            self.rd = None
    
        def __iter__(self):
            self.rd = open(self.filename, 'r', encoding='utf-8', newline='\\r\\n')
            return self
    
        def __next__(self):
            line = self.rd.readline()
            if line:
                return list(line.strip('\\r\\n').split(' '))
            else:
                self.rd.close()
                raise StopIteration

    接下来,我们定义一个函数 train_word2vec 来训练 Word2Vec 模型。该函数接受新闻文本文件路径和输出目录作为参数,并保存训练好的模型文件。

    def train_word2vec(Path_sentences, OutFile_dir):     
        OutFile_word2vec = os.path.join(OutFile_dir, r'word2vec.model')
        OutFile_word2vec_txt = os.path.join(OutFile_dir, r'word2vec.txt')
        create_dir(OutFile_dir)
    
        print('start to train word embedding...', end=' ')
        my_sentences = MySentenceCollection(Path_sentences)
        model = Word2Vec(my_sentences, size=32, window=5, min_count=1, workers=8, iter=10) # user more epochs for better accuracy
    
        model.save(OutFile_word2vec)
        model.wv.save_word2vec_format(OutFile_word2vec_txt, binary=False)
        print('\\tdone . ')
    
    Path_sentences = os.path.join(InFile_dir, 'sentence.txt')
    
    t0 = time.time()
    train_word2vec(Path_sentences, OutFile_dir)
    t1 = time.time()
    print('time elapses: {0:.1f}s'.format(t1 - t0))

    用 TransE 训练实体向量

    知识图谱 (KG) 由实体和关系组成,可以用来表示世界上的各种知识。在 DKN 中,我们可以利用 KG 中的实体信息来增强新闻推荐的准确性。为了将 KG 中的实体信息融入到 DKN 模型中,我们需要将实体映射到向量空间中,即训练实体向量。

    TransE 是一种常用的知识图谱嵌入模型,它能够将实体和关系映射到同一个向量空间中,并学习到实体和关系之间的语义关系。我们可以使用开源的 Fast-TransX 库来训练 TransE 模型。

    !bash ./run_transE.sh

    构建上下文向量

    DKN 模型不仅需要考虑实体本身的向量表示,还需要考虑实体的上下文信息。例如,同一个实体在不同的新闻中可能具有不同的含义。为了捕捉这种上下文信息,我们需要构建上下文向量。

    我们可以利用 KG 中的实体关系来构建上下文向量。例如,对于一个实体,我们可以将所有与它相关的实体的向量加权平均,得到该实体的上下文向量。

    ##### build context embedding
    EMBEDDING_LENGTH = 32
    entity_file = os.path.join(OutFile_dir_KG, 'entity2vec.vec') 
    context_file = os.path.join(OutFile_dir_KG, 'context2vec.vec')   
    kg_file = os.path.join(OutFile_dir_KG, 'train2id.txt')   
    gen_context_embedding(entity_file, context_file, kg_file, dim=EMBEDDING_LENGTH)

    加载预训练向量

    最后,我们需要将训练好的词向量和实体向量加载到 DKN 模型中。

    load_np_from_txt(
            os.path.join(OutFile_dir_KG, 'entity2vec.vec'),
            os.path.join(OutFile_dir_DKN, 'entity_embedding.npy'),
        )
    load_np_from_txt(
            os.path.join(OutFile_dir_KG, 'context2vec.vec'),
            os.path.join(OutFile_dir_DKN, 'context_embedding.npy'),
        )
    format_word_embeddings(
        os.path.join(OutFile_dir, 'word2vec.txt'),
        os.path.join(InFile_dir, 'word2idx.pkl'),
        os.path.join(OutFile_dir_DKN, 'word_embedding.npy')
    )

    参考文献

    1. Wang, Hongwei, et al. “DKN: Deep Knowledge-Aware Network for News Recommendation.” Proceedings of the 2018 World Wide Web Conference on World Wide Web. International World Wide Web Conferences Steering Committee, 2018.
    2. Knowledge Graph Embeddings including TransE, TransH, TransR and PTransE. https://github.com/thunlp/KB2E
    3. GloVe: Global Vectors for Word Representation. https://nlp.stanford.edu/projects/glove/
    4. Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. 2013. Distributed representations of words and phrases and their compositionality. In Proceedings of the 26th International Conference on Neural Information Processing Systems – Volume 2 (NIPS’13). Curran Associates Inc., Red Hook, NY, USA, 3111–3119.
    5. Gensim Word2vec embeddings : https://radimrehurek.com/gensim/models/word2vec.html
  • 从 MAG 数据集构建 DKN 模型训练数据

    这篇文章将带你了解如何从 MAG (Microsoft Academic Graph) 数据集构建 DKN (Deep Knowledge-aware Network) 模型的训练数据。DKN 是一种用于推荐系统的深度学习模型,它可以利用知识图谱来提升推荐效果。

    数据准备:论文相关文件

    首先,我们需要准备论文相关文件。在 DKN 中,论文数据格式如下:

    [Newsid] [w1,w2,w3...wk] [e1,e2,e3...ek]

    其中,Newsid 代表论文的 ID,w1,w2,w3...wk 代表论文中每个词的索引,e1,e2,e3...ek 代表论文中每个实体的索引。词和实体是相互对应的。

    例如,一篇论文的标题为:

    One Health approach in the South East Asia region: opportunities and challenges

    那么,标题词的索引可以是:

    101,56,23,14,1,69,256,887,365,32,11,567

    标题实体的索引可以是:

    10,10,0,0,0,45,45,45,0,0,0,0

    前两个实体索引为 10,表示这两个词对应同一个实体。词和实体的索引是从 1 到 n 和 m 进行哈希的,其中 n 和 m 分别代表不同词和实体的数量。

    构建论文特征文件

    1. 词和实体哈希:首先,我们需要对词和实体进行哈希,将每个词和实体映射到一个唯一的索引。
    2. 论文内容表示:为了简化,在本教程中,我们只使用论文标题来表示论文内容。当然,你也可以使用论文摘要和正文来更全面地表示论文内容。
    3. 特征长度固定:每个论文特征的长度应该固定为 k (max_word_size_per_paper)。如果论文中的词数超过 k,我们将截断论文,只保留前 k 个词。如果词数少于 k,我们将用 0 填充到 k 个词。

    构建知识图谱文件

    接下来,我们需要构建知识图谱文件。知识图谱由三元组组成,每个三元组表示一个事实:

    head, tail, relation

    例如,一个三元组可以表示:

    "COVID-19", "Respiratory disease", "is_a"

    表示 COVID-19 是一种呼吸道疾病。

    构建用户相关文件

    接下来,我们需要准备用户相关文件。我们的第一个任务是用户到论文的推荐。对于每个用户,我们收集他/她引用的所有论文,并按时间顺序排列。然后,推荐任务可以被描述为:给定用户的引用历史,预测他/她将来会引用哪些论文。

    构建 DKN 训练数据文件

    DKN 模型需要以下几个文件作为输入:

    • 训练/验证/测试文件:每个文件中的每一行代表一个实例。Impressionid 用于评估一个印象会话内的性能,因此它只在评估时使用,在训练数据中可以设置为 0。格式如下:
    [label] [userid] [CandidateNews]%[impressionid]

    例如:

    1 train_U1 N1%0
    • 用户历史文件:每个文件中的每一行代表一个用户的引用历史。你需要在配置文件中设置 his_size 参数,该参数表示我们使用的用户点击历史的最大数量。如果用户的点击历史超过 his_size,我们将自动保留最后 his_size 个用户的点击历史。如果用户的点击历史少于 his_size,我们将自动用 0 填充到 his_size 个。格式如下:
    [Userid] [newsid1,newsid2...]

    例如:

    train_U1 N1,N2

    DKN 将推荐任务视为一个二元分类问题。我们根据项目的流行度对负样本进行采样。

    构建 item-to-item 推荐数据集

    我们的第二个推荐场景是关于 item-to-item 推荐。给定一篇论文,我们可以推荐一系列相关的论文供用户引用。

    这里我们使用监督学习方法来训练这个模型。每个实例是一个 的元组。Label = 1 表示这对论文高度相关;否则 label 将为 0。

    正样本的构建方式如下:

    1. 论文 A 和 B 在它们的引用列表中有很多重叠;
    2. 论文 A 和 B 被许多其他论文共同引用;
    3. 论文 A 和 B 由同一个作者(第一作者)在 12 个月内发表。

    总结

    本文介绍了如何从 MAG 数据集构建 DKN 模型的训练数据。通过对论文、知识图谱和用户行为数据的处理,我们可以生成 DKN 模型所需的训练数据,并进一步进行模型训练和评估。

    参考文献

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网
Page Stats: PV: 2262 | UV: 1222
Last updated: 2025-06-24 15:31:44
沪ICP备2024052574号-1