Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:下采样令牌或下采样word2vec模型_Python_List_Word2vec_Downsampling - Fatal编程技术网

Python:下采样令牌或下采样word2vec模型

Python:下采样令牌或下采样word2vec模型,python,list,word2vec,downsampling,Python,List,Word2vec,Downsampling,我需要一些关于下采样问题的帮助。我必须制作一个更大的语料库(665440个句子,19592258个标记)来与一个更小的语料库(15607个句子,927711个标记)相比较,以便在两个可比较的word2vec模型上实现它们。 每个语料库都是一个列表列表,其中每个列表都是一个标记化句子: e、 g.[['the'、'boy'、'eats']['the'、'teacher'、'explains']…] 我希望对最大的一个进行下采样,使其具有与较小的一个相同数量的标记(保持原始数据结构:对句子进行下采样

我需要一些关于下采样问题的帮助。我必须制作一个更大的语料库(665440个句子,19592258个标记)来与一个更小的语料库(15607个句子,927711个标记)相比较,以便在两个可比较的word2vec模型上实现它们。 每个语料库都是一个列表列表,其中每个列表都是一个标记化句子: e、 g.
[['the'、'boy'、'eats']['the'、'teacher'、'explains']…]

我希望对最大的一个进行下采样,使其具有与较小的一个相同数量的标记(保持原始数据结构:对句子进行下采样,直到获得指定数量的标记)。我是一名编程新手,我想到了两种可能的方法,但我不确定如何实现它们: -对列表列表进行下采样 -对经过训练的word2vec模型进行下采样(我在论坛上看到有参数“sample”可以对最频繁的单词进行下采样,但我想得到随机的句子)

你能帮我吗


非常感谢!!:)

让我们明确指出您提到的一些事情:

语料库-A665440个句子,19592258个标记(每个句子2.9个标记)

语料库B15607个句子,927711个标记(每个句子60个标记)

我会马上观察到,语料库的平均大小很小——一个句子——表明它们可能不是像自然语言那样的词的运行,而
word2vec
通常是针对这些词运行的。而且,这种简短的句子可能不会产生这种最典型的
窗口大小的上下文。(无论您选择
window
,窗口都会非常小。请注意,一个句子中只有一个标记,不能进行任何训练,这是不可操作的。)

因此,在过程结束时,语料库A的任何缩放/采样(其句子包含3个标记)都不会像语料库B那样(其更典型的句子包含几十到数百个标记)。他们不会真的相似,除非在一些你选择的单一测量目标

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

import random
corpus_a_subset = random.sample(corpus_a, len(corpus_b))
当然,这个特殊的
语料库a_子集
只会匹配语料库b中的句子数量,但事实上,考虑到语料库a句子的平均大小要短得多,原始单词的数量要小得多,大约47k个标记长

如果您的目标是一个大约927k的标记长子集,以匹配语料库B标记计数,那么您需要大约(927k/3=)309000个句子:

corpus_a_subset = random.sample(corpus_a, 309000)
尽管如此,尽管这应该使
语料库a_子集
语料库b
的原始字数非常匹配,但就独特的标记、标记的相对频率而言,它仍然可能是一个非常不同的语料库,甚至是训练上下文的总数——因为句子较短的上下文往往受到句子结尾的限制,而不是整个
窗口的长度限制。(尽管底线标记计数相似,但训练时间可能会明显不同,尤其是在
窗口很大的情况下。)

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

  • sample
    参数增加了随机跳过频繁出现的单词的频率。在典型的子夫式词频中,常见词在所有可能的不同用法中出现了很多次,因此可以安全地忽略其中许多多余的词。此外,通过允许相对更多地关注较稀有的单词,丢弃许多过度的示例,通常可以提高最终单词向量的总体有用性。特别是在非常大的语料库中,选择一个更具攻击性的(较小的)
    样本值可以丢弃大量语料库,加快训练速度,但仍然可以得到更好的向量

  • 提高
    min\u count
    参数会丢弃更多不太频繁的单词。与任何“数据越多越好”的直觉相反,这通常会提高幸存单词向量的有用性。这是因为只有少数几个用法示例的单词往往不会得到很好的向量——这些示例不会显示所需的多样性和代表性——但如此多的罕见但未充分证明的单词的流行仍然会干扰其他单词的训练

只要还有足够多的更频繁和重要的单词示例,针对大型语料库的
sample
minu count
的积极设置可能会将有效大小减少90%或更多–并且仍然为剩余单词创建高质量的向量


但也要注意:您的两个小体都没有
word2vec
训练时最好的小体大。它从大而多样的细胞中获益匪浅。特别是,与大量的
word2vec
工作相比,您的语料库-B非常小——虽然您可以通过更多的培训时间,使用更小的向量或更小的幸存词汇,在一定程度上“扩展”语料库的影响,但您仍然可能低于
word2vec
最有效的语料库大小。因此,如果可能的话,我会考虑如何扩大语料库B,而不是缩小语料库A。

为什么需要将较大的语料库缩小到类似的大小?(为什么不从每个完整的语料库中建立最好的模型?)你想要丢弃大量数据的理由可能会影响什么样的子抽样方法是合适的。类似地,您是否希望缩小后的第一个语料库在句子数量方面与第二个语料库的大小相同,或者是共同的