用于网络嵌入的Word2Vec忽略语料库(walks)中的单词(节点)

2024-05-16 09:09:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图运行word2vec(Skipgram)到一组行走中,以训练网络嵌入模型,在我的图中,我有169343个节点,即;Word2vec上下文中的word,对于每个节点,我运行长度为80的随机游走。因此,我有(169343,80)次步行,即;Word2vec中的句子。在运行SkipGram 3个时代后,我只得到28015个向量,而不是169343个。这是我的网络嵌入代码

def run_skipgram(walk_path):

    walks = np.load(walk_path).tolist()

    skipgram = Word2Vec(sentences=walks, vector_size=128, negative=5, window=8, sg=1, workers=6, epochs=3)
    
    keys = list(map(int, skipgram.wv.index_to_key))
    keys.sort()

    vectors = [skipgram.wv[key] for key in keys]

    return np.array(vectors)

Tags: pathkey模型网络节点npword2veckeys
1条回答
网友
1楼 · 发布于 2024-05-16 09:09:35

您确定您的walks语料库是您所期望的,以及GensimWord2Vec所期望的吗

例如,len(walks)等于169343吗?len(walks[0])等于80吗?walks[0]是80个字符串标记的列表吗

另请注意:默认情况下Word2Vec使用min_count=5,因此在训练期间,任何出现次数少于5次的标记都将被忽略。在大多数情况下,这个最小值——或者更高的值!——这是有意义的,因为在通常的自然语言训练数据中只有1个或几个使用示例的标记不能获得好的词向量(但总体而言,可以作为稀释噪声,使其他向量恶化)

根据图形的不同,每个节点的一次行走可能无法确保节点在所有行走中至少出现5次。所以你可以试试min_count=1

但最好从每个起点进行5次行走,或者进行足够的行走以确保所有节点至少出现5次169,343 * 80 * 5仍然只有67737200个训练单词,可管理的词汇量为169343个。(如果将整个训练集扩展为一个列表时出现问题,您可以制作一个iterable,根据需要一个接一个地生成行走,而不是全部提前。)

或者,每个起始节点5次行走,但每次行走仅20步,这样可以保持语料库的大小不变,但保证每个节点至少出现5次

甚至:自适应地继续添加行走,直到确定每个节点都有足够的表示次数。例如,选择一个随机节点,进行漫游,记录到目前为止每个节点的外观;不断增加每个节点的 您还可以尝试使用自适应语料库,不断添加walks,直到每个节点的表示次数最少

可以想象,对于一些远程节点,这可能需要相当长的时间才能发生在它们身上,因此另一种改进可能是:进行一些初始行走,然后统计每个节点的访问次数,&;当最不频繁的节点低于目标min_count时,从它开始另一次行走-确保至少再进行一次访问

这可能有助于对连接较少的区域进行过采样,这可能是好的,也可能是坏的。值得注意的是,对于自然语言文本,Word2Vec{}参数非常有助于丢弃某些过度呈现的单词,防止它们冗余地垄断训练时间,确保频率较低的单词也能获得良好的表征。(这是一个参数,有时会带来双重打击,即减少训练时间获得更好的结果!)确保您的步行时间花在连接较少的区域可能会提供类似的优势,特别是如果您对向量的下游使用与访问较少区域的向量同样感兴趣

相关问题 更多 >