word2vec window 句子边界的大小
word2vec window size at sentence boundaries
我正在使用 word2vec(和 doc2vec)来获取句子的嵌入,但我想完全忽略词序。
我目前正在使用gensim,但如果需要可以使用其他包。
例如,我的文本如下所示:
[
['apple', 'banana','carrot','dates', 'elderberry', ..., 'zucchini'],
['aluminium', 'brass','copper', ..., 'zinc'],
...
]
我有意希望 'apple' 被视为接近 'zucchini',因为它接近 'banana',所以我将 window 大小设置为一个非常大的数字,说 1000。
我知道这可能会引起 2 个问题。
问题一:
window 可能 roll 在句子的开头创建以下训练对:
('apple', ('banana')), ('apple', ('banana', 'carrot')), ('apple', ('banana', 'carrot', 'date'))
在它最终到达正确的 ('apple', ('banana','carrot', ..., 'zucchini'))
之前。
这似乎会使 'apple' 比 'zucchini' 更接近 'banana',
因为它们包含 'apple' 和 'banana' 的对比包含 'apple' 和 'zucchini'.
的对多得多
问题二:
我听说配对的采样与目标词到上下文词的距离成反比——这也会导致一个问题,使附近的词看起来比我希望的更紧密。
有解决问题 1 和 2 的方法吗?
我应该使用 cbow 而不是 sgns 吗?还有其他我应该注意的超参数吗?
在这种情况下,处理 removing/ignoring 订单的最佳方法是什么?
谢谢
我不确定你所说的 "Problem 1" 是什么意思 - 在 word2vec 风格算法的 window
参数的通常解释中没有 "roll" 或 "wraparound"。所以我不会担心这个。
关于 "Problem 2",通过选择一个巨大的 window
值,这个因素基本上可以忽略不计——例如,一个比你最大的句子大一百万倍的值。然后,算法如何处理最近词和第二最近词的任何差异都微乎其微。
(更具体地说,在这方面复制原始 Google word2vec.c
的 gensim 实现方式实现了一种基于距离的加权实际上是通过实际的随机动态收缩window
使用。也就是说,对于每个目标词训练期间的每次访问,真正使用的有效 window
是从 1 到用户指定的 window
的一些随机数。通过有效地使用更小的windows 很多时候,越近的词影响越大——只是没有每次都对整个 window 的词执行其他缩放的成本。但在你的情况下,有一个巨大的 window
值,effective-window 比您的实际句子小的情况非常罕见。因此几乎每次都会平等地包含每个单词。)
所有这些注意事项在使用 SG 或 CBOW 模式时都是一样的。
我相信大一百万倍 window
就足以满足您的需求,因为如果由于某种原因不能满足您的需求,另一种基本上消除任何邻近效应的方法可能是确保您的每次将语料库的项目作为训练数据访问时,它们的各个词序都会重新洗牌。这确保了任何邻近度优势将均匀地混合在所有单词中——尤其是如果每个句子都经过多次训练。 (在一个足够大的语料库中,也许每个句子只洗一次 1 次就足够了。然后,在所有共现词的例子中,词的共现将以正确的比例采样,即使 windows.)
其他提示:
如果您的训练数据以某种排列顺序开始并将 words/topics 聚集在一起,则将它们随机排列可能会有所帮助。 (如果各种数据是交错的,而不是在许多类似示例的运行中呈现,那就更好了。)
当您的数据不是真正的自然语言数据(具有通常的分布和排序重要性)时,从通常的默认值进一步搜索以找到最佳元参数可能是值得的。这适用于 negative
、sample
,尤其是 ns_exponent
。 (一篇论文建议推荐系统训练向量的最佳 ns_exponent
与自然语言建模的通常默认值 0.75 大不相同。)
我正在使用 word2vec(和 doc2vec)来获取句子的嵌入,但我想完全忽略词序。 我目前正在使用gensim,但如果需要可以使用其他包。
例如,我的文本如下所示:
[
['apple', 'banana','carrot','dates', 'elderberry', ..., 'zucchini'],
['aluminium', 'brass','copper', ..., 'zinc'],
...
]
我有意希望 'apple' 被视为接近 'zucchini',因为它接近 'banana',所以我将 window 大小设置为一个非常大的数字,说 1000。 我知道这可能会引起 2 个问题。
问题一:
window 可能 roll 在句子的开头创建以下训练对:
('apple', ('banana')), ('apple', ('banana', 'carrot')), ('apple', ('banana', 'carrot', 'date'))
在它最终到达正确的 ('apple', ('banana','carrot', ..., 'zucchini'))
之前。
这似乎会使 'apple' 比 'zucchini' 更接近 'banana',
因为它们包含 'apple' 和 'banana' 的对比包含 'apple' 和 'zucchini'.
问题二: 我听说配对的采样与目标词到上下文词的距离成反比——这也会导致一个问题,使附近的词看起来比我希望的更紧密。
有解决问题 1 和 2 的方法吗? 我应该使用 cbow 而不是 sgns 吗?还有其他我应该注意的超参数吗? 在这种情况下,处理 removing/ignoring 订单的最佳方法是什么?
谢谢
我不确定你所说的 "Problem 1" 是什么意思 - 在 word2vec 风格算法的 window
参数的通常解释中没有 "roll" 或 "wraparound"。所以我不会担心这个。
关于 "Problem 2",通过选择一个巨大的 window
值,这个因素基本上可以忽略不计——例如,一个比你最大的句子大一百万倍的值。然后,算法如何处理最近词和第二最近词的任何差异都微乎其微。
(更具体地说,在这方面复制原始 Google word2vec.c
的 gensim 实现方式实现了一种基于距离的加权实际上是通过实际的随机动态收缩window
使用。也就是说,对于每个目标词训练期间的每次访问,真正使用的有效 window
是从 1 到用户指定的 window
的一些随机数。通过有效地使用更小的windows 很多时候,越近的词影响越大——只是没有每次都对整个 window 的词执行其他缩放的成本。但在你的情况下,有一个巨大的 window
值,effective-window 比您的实际句子小的情况非常罕见。因此几乎每次都会平等地包含每个单词。)
所有这些注意事项在使用 SG 或 CBOW 模式时都是一样的。
我相信大一百万倍 window
就足以满足您的需求,因为如果由于某种原因不能满足您的需求,另一种基本上消除任何邻近效应的方法可能是确保您的每次将语料库的项目作为训练数据访问时,它们的各个词序都会重新洗牌。这确保了任何邻近度优势将均匀地混合在所有单词中——尤其是如果每个句子都经过多次训练。 (在一个足够大的语料库中,也许每个句子只洗一次 1 次就足够了。然后,在所有共现词的例子中,词的共现将以正确的比例采样,即使 windows.)
其他提示:
如果您的训练数据以某种排列顺序开始并将 words/topics 聚集在一起,则将它们随机排列可能会有所帮助。 (如果各种数据是交错的,而不是在许多类似示例的运行中呈现,那就更好了。)
当您的数据不是真正的自然语言数据(具有通常的分布和排序重要性)时,从通常的默认值进一步搜索以找到最佳元参数可能是值得的。这适用于 negative
、sample
,尤其是 ns_exponent
。 (一篇论文建议推荐系统训练向量的最佳 ns_exponent
与自然语言建模的通常默认值 0.75 大不相同。)