【问题标题】:Inconsistent results when training gensim model with gensim.downloader vs manual loading使用 gensim.downloader 与手动加载训练 gensim 模型时结果不一致
【发布时间】:2023-03-20 13:52:01
【问题描述】:

我试图了解以下示例中出了什么问题。

要按照文档中的描述在“text8”数据集上进行训练,只需执行以下操作:

import gensim.downloader as api
from gensim.models import Word2Vec

dataset = api.load('text8')
model = Word2Vec(dataset)

这样做会产生非常好的嵌入向量,通过评估单词相似度任务来验证。

但是,当手动加载上面使用的相同文本文件时,如

text_path = '~/gensim-data/text8/text'
text = []
with open(text_path) as file:
    for line in file:
        text.extend(line.split())
text = [text]

model = Word2Vec(test)

该模型仍然表示它正在训练与上述 (5) 相同数量的 epoch,但训练速度要快得多,并且生成的向量在相似性任务上的性能非常非常差。

这里发生了什么?我想这可能与“句子”的数量有关,但是 text8 文件似乎只有一行,那么 gensim.downloader 是否将 text8 文件拆分为句子?如果有,多长?

【问题讨论】:

    标签: python gensim word2vec


    【解决方案1】:

    在您的第二个示例中,您创建了一个训练数据集,其中只有一个包含文件全部内容的文本。一个列表中大约有 110 万个单词标记。

    Word2Vec(及其他相关算法)在 gensim 中的内部实现限制,在其优化路径中,每个文本项 10,000 个标记。所有其他标记都将被忽略。

    因此,在您的第二种情况下,您 99% 的数据都被丢弃了。培训看似即时,但实际培训很少。 (仅出现在第 10,000 个标记之后的单词的单词向量根本不会被训练,只有它们的初始随机设置值。)如果您在 INFO 级别启用日志记录,您将看到有关每个标记的更多详细信息过程的步骤,这样的差异可能更容易识别。

    是的,api.load() 变体需要额外的步骤来将单行文件分成 10,000 个令牌块。我相信它为此目的使用了LineSentence 实用程序类,其来源可以在这里查看:

    https://github.com/RaRe-Technologies/gensim/blob/e859c11f6f57bf3c883a718a9ab7067ac0c2d4cf/gensim/models/word2vec.py#L1209

    但是,我建议完全避免使用api.load() 功能。它不只是下载数据;它还下载了一些额外的版本控制之外的 Python 代码,用于为额外的操作准备这些数据。与为 PyPI/etc 打包的官方 gensim 发布代码相比,此类代码更难浏览且审查较少,这也存在安全风险。每个加载目标(按名称,如“text8”)可能会执行不同的操作,从而为您提供不同的对象类型作为返回值。

    直接将您需要的数据文件精确下载到已知的本地路径,并从这些路径自己进行 IO/prep,这样您就知道已应用了哪些步骤,以及您唯一的代码,这会更好地理解。 re running 是官方版本和发布的代码。

    【讨论】:

    • 感谢您的详细解答。通过在每 10000 个单词后向 text8 文件添加换行符,我确实能够重现与 api.dow​​nloader 相同的良好结果。文本语料库中的句子有首选大小吗?传递给模型的窗口大小参数不应该是关于样本大小的唯一重要参数吗?
    • 较长的文本可能会训练得更快一些,但要遵守 10K 令牌的限制,也许应该避免将真正不相关的文本一起运行——这样在源材料中就不是真正的“邻居”不要进入彼此的训练窗口。但是在大型/典型数据中,即使是这种人为重叠的噪声也几乎没有什么区别。 (text8 数据是一堆 Wikipedia 文本不加选择地运行在一起,但即使是那些 10000 个标记的混合文章源块也包含来自大量真正相邻的单词的足够真实的“信号”,以获得有趣的结果。)
    • 好的。我从中得出我可以安全地使用这个特定文本集的 10000 个令牌限制,并更多地关注诸如 window_size 和 min_count 之类的超参数来微调嵌入。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多