【问题标题】:Python: downsampling tokens or downsampling word2vec modelPython:下采样令牌或下采样 word2vec 模型
【发布时间】:2020-01-23 12:12:57
【问题描述】:

我需要一些关于下采样问题的帮助。我必须制作一个更大的语料库(6 654 940 个句子,19 592 258 个标记)与一个较小的语料库(15 607 个句子,927 711 个标记)相媲美,才能在 2 个可比较的 word2vec 模型上实现它们。 每个语料库是一个列表列表,其中每个列表都是一个标记化的句子: 例如[['the', 'boy', 'eats']['the', 'teacher', 'explains']...]

我想对最大的进行下采样,使其具有与较小的相同数量的标记(保持原始数据结构:对句子进行下采样,直到获得所需的标记数量)。我是编程的初学者,我想到了两种可能的方法,但我不确定如何实现它们: - 对列表列表进行下采样 - 对训练好的word2vec模型进行下采样(我在论坛上看到有参数“sample”可以对最常用的词进行下采样但我想得到随机句子)

你能帮帮我吗?

非常感谢!! :)

【问题讨论】:

  • 为什么需要将较大的语料库缩小到相似的大小? (为什么不从每个完整的语料库中制作最好的模型?)您想要丢弃大量数据的原因可能会影响哪些子采样方法是合适的。同样,您是否希望缩小的第一语料库与第二语料库在句子数、原始训练词数或实际训练词数(在消除稀有词之后)方面的大小相同,或最终学习词汇量的计数? (每个方法都会略有不同,效果也略有不同。)
  • 我想训练 2 个模型,一个带有完整语料库,另一个带有第一个语料库,其大小将减少到与第二个语料库相同(我将在一个项目中讨论结果我的硕士课程)。在第二种情况下,我希望第一个语料库具有与我的第二个语料库相同数量的原始训练单词,但仍保持我的标记句子列表结构。有意义吗?
  • 谢谢,但是为什么使语料库大小匹配的过程被认为很重要?与使用尽可能多的数据并适应您的资源/时间限制的通常最佳方法相比,它将提供什么好处? (我会在正式答案中提出一些关于如何做你真正要求的想法的想法,但我并不真正知道它们可能不合适/最佳的原因。)
  • 非常感谢!我认为有必要将我想要比较的所有语料库都制作成相同的大小。我是一个非常初学者????

标签: python list word2vec downsampling


【解决方案1】:

让我们给你明确提到的一些事情贴上标签:

corpus-A 6 654 940 个句子,19 592 258 个标记(每句 2.9 个标记)

语料库-B 15 607 个句子,927 711 个标记(每句 60 个标记)

我会立即观察到,corpus-A 句子的微小平均大小表明它们可能不是 word2vec 所针对的那种自然语言的连续词通常运行。而且,这样的剪辑句子可能不会产生这种训练最典型的window 大小的上下文。 (无论您选择window,窗口都会非常小。请注意,不能从带有单个标记的句子中进行任何训练——这是一个无操作。)

因此,corpus-A 的任何缩放/采样(其句子大约有 3 个标记)在过程结束时不会像 corpus- B(其更典型的句子有几十个到可能几百个标记)。它们不会真正相似,除非在您选择定位的某些单一测量中。

如果事实上你有足够的内存来完全在 RAM 中对 corpus-A 进行操作,那么选择 15607 个句子的随机子集——以匹配 corpus-B 的句子数 em>,使用标准 Python 函数非常简单:

import random
corpus_a_subset = random.sample(corpus_a, len(corpus_b))

当然,这个特定的corpus_a_subset 只会匹配 corpus_b 中的句子数,但实际上在原始单词中要小得多——大约 47k 标记长——考虑到 corpus-A 的平均大小要短得多 句。

如果您的目标是大约 927k-token-long 子集来匹配 corpus-B 令牌计数,您需要大约 (927k / 3 =) 309000 个句子:

corpus_a_subset = random.sample(corpus_a, 309000)

尽管如此,虽然这应该使 corpus_a_subsetcorpus_b 的原始字数非常匹配,但就唯一标记、标记的相对频率甚至训练上下文的总数而言,它仍然可能是一个非常不同的语料库– 因为具有较短句子的上下文更经常受到句子结尾的限制,而不是完整的window-length。 (尽管底线令牌计数相似,但训练时间可能会明显不同,尤其是当您的 window 很大时。)

如果您的主要兴趣只是能够像使用较小的语料库一样快速地在 corpus-A 子集上进行训练,那么除了丢弃其中的许多句子来精简它之外,还有其他方法:

  • sample 参数增加了高频词被随机跳过的频率。在典型的 Zipfian 词频中,常用词在所有可能的不同用法中出现了很多次,因此可以安全地忽略其中的许多冗余词。此外,通过允许相对更多地关注稀有词,丢弃许多这些过多的例子,通常会提高最终词向量的整体有用性。尤其是在非常大的语料库中,选择更积极(更小)的sample 值会丢弃大量语料库,加快训练速度,但仍会产生更好的向量。

  • 提高min_count 参数会丢弃更多不常见的单词。与“更多数据总是更好”的任何直觉相反,这通常提高幸存单词向量的有用性。这是因为只有几个用法示例的单词往往不会得到很好的向量——那些少数例子不会显示出所需的多样性和代表性——但是如此多这样罕见但没有充分展示的单词的流行仍然会干扰训练换句话说。

只要仍然有足够多的更频繁和重要单词的示例,samplemin_count 的激进设置针对大型语料库,可能会将有效大小减少 90% 或更多——并且仍然会创建剩余单词的高质量向量。

但还要注意:你的两个语料库都没有适合word2vec 训练的那么大。它从大型、多样化的语料库中受益匪浅。尤其是您的 corpus-B 与许多 word2vec 工作相比是很小的 - 虽然您可以通过更多的训练 epoch 和使用更小的向量或更小的生存词汇在一定程度上“拉伸”语料库的影响,您仍然可能低于 word2vec 效果最好的语料库大小。因此,如果可能的话,我会寻找方法来扩大corpus-B,而不是缩小corpus-A

【讨论】:

  • 非常感谢!!这是一个非常清楚的解释:)
猜你喜欢
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
相关资源
最近更新 更多