我使用word2vec (和doc2vec)来获取句子的嵌入,但我想完全忽略词序。我目前正在使用gensim,但可以使用其他软件包,如果必要的。
例如,我的文本如下:
[
['apple', 'banana','carrot','dates', 'elderberry', ..., 'zucchini'],
['aluminium', 'brass','copper', ..., 'zinc'],
...
]我故意希望‘苹果’和‘香蕉’一样接近‘西葫芦’,所以我把窗户的大小设定为一个非常大的数字,比如说1000。我知道这可能会产生两个问题。
问题1:窗口可能会在句子的开头滚动,创建以下训练对:('apple', ('banana')), ('apple', ('banana', 'carrot')), ('apple', ('banana', 'carrot', 'date')),然后它最终到达正确的('apple', ('banana','carrot', ..., 'zucchini'))。这似乎会使“苹果”比“西葫芦”更接近“香蕉”,因为它们含有“苹果”和“香蕉”的数量比含有“苹果”和“西葫芦”的“香蕉”要多得多。
问题2:我听说对的取样与从目标词到上下文词的距离成反比--这也导致了一个问题,使得附近的单词看起来比我想要的更紧密。
有办法解决问题1和问题2吗?我应该使用弓而不是sgns吗?还有其他我应该知道的超参数吗?在这种情况下,删除/忽略顺序的最佳方法是什么?
谢谢
发布于 2020-01-23 06:22:45
我不知道你所说的“问题1”是什么意思--在Word2vec风格的算法的window参数的通常解释中,没有"roll“或”parameter“。这样我就不用担心这个了。
关于“问题2",通过选择一个巨大的window值,这个因素基本上可以忽略不计--例如,这个值比你最大的句子大一百万倍。那么,算法对最近单词和第二最近单词的处理方式上的任何差别都是微不足道的。
(更具体地说,gensim实现-在这方面复制了原来的Google word2vec.c -实现一种基于距离的加权实际上是通过随机动态收缩实际使用的window来实现的。也就是说,对于每个目标词的每次访问,真正使用的有效window是从1到用户指定的window之间的一些随机数。通过在大部分时间有效地使用较小的窗口,更接近的单词具有更大的影响力--只是不需要每次对整个窗口的单词执行其他缩放的成本。但在你的例子中,有一个巨大的window值,它将是非常罕见的有效窗口永远比你的实际句子小。因此,几乎每一次,每个单词都会被包括在内。)
使用SG或CBOW模式时,所有这些考虑都是相同的。
我相信一百万倍--更大的window --将足以满足你的需要,因为如果由于某种原因,另一种方法可以从根本上抵消任何接近的效果,那就是确保你的语料库的个别词序在每次作为训练数据被访问之间被重新洗牌。这就确保了所有单词的接近优势都将均匀混合--尤其是如果每个句子都经过多次训练的话。(在一个足够大的语料库中,也许仅仅对每个句子进行一次洗牌就足够了。)然后,在所有共现词的例子中,即使在小窗口的情况下,同时出现的词也会按正确的比例取样。)
其他贴士:
如果您的培训数据以某种排列顺序开始,将单词/主题组合在一起,那么将它们洗牌成一个随机顺序是有益的。(最好是将各种数据交织在一起,而不是用许多类似的例子来表示。)
当您的数据不是真实的自然语言数据(具有其通常的分布和排序重要性)时,可能值得从通常的缺省值中进一步搜索以找到最佳的元参数。这适用于negative、sample,尤其是ns_exponent。(一篇文章指出,用于推荐系统的训练向量的最优ns_exponent与通常的0.75缺省情况下的自然语言建模有很大不同。)
https://stackoverflow.com/questions/59872029
复制相似问题