如何为Word2Vec动态赋值"size"?

How to dynamically assign the right "size" for Word2Vec?

问题有两个: 1.如何select为size的理想值? 2. 如何动态获取词汇表大小(按我的意图每行)来设置理想的大小?

我的数据如下(示例)——只有一行和一列:

第 1 行

{kfhahf}    
Lfhslnf;
.
.
. 

第 2 行

(stdgff  ksshu, hsihf)
asgasf;
.
.
. 

等等

基于此post: size 参数应小于(或等于?)词汇表大小。所以,我正在尝试按以下方式动态分配大小:

from nltk.tokenize import word_tokenize
from gensim.models import Word2Vec

# I do Word2Vec for each row
For item in dataset:
    Tokenized = word_tokenize(item)
    model = Word2Vec([Tokenized], min_count=1)

我在这里得到了词汇量。所以我创建了第二个模型:

model1 = Word2Vec([Tokenized], min_count=1, size=len(model.wv.vocab))

如我所愿,这会将 size 值设置为当前行的当前词汇值。但这是正确的做法吗?小词汇文本的正确大小是多少?

没有最佳的简单公式size - 这将取决于您的数据和目的。

最佳做法是设计一种稳健的、可自动化的方法来为一组 word-vectors 评分——可能有一些 hand-constructed 类型判断的代表性子集,以及首选结果,你需要。然后,尝试 size(和其他参数)的许多值,直到找到符合您目的的最高分值。

在自然语言建模领域,词汇表至少有 tens-of-thousands 个唯一词,但可能有 hundreds-of-thousands 或数百万个,典型的 size 值通常在100-1000 范围内,但通常在 200-400 范围内。因此,如果您的 task/vocabulary 相似,您可能会开始搜索周围的替代值。

但如果您的数据或词汇量很小,您可能需要尝试较小的值。 (不过,Word2Vec 确实需要大量多样的训练数据才能发挥最佳效果。)

关于你的code-as-shown:

  • 为数据集中的每个 item 计算新的 model 几乎没有任何意义(在每次循环迭代中丢弃之前的 model)。如果你想计算任何一个标记化项目中的唯一标记,你可以使用惯用的 Python,比如 len(set(word_tokenize(item)))。任何感兴趣的 Word2Vec 模型都可能需要在来自 all 项的标记组合语料库上进行训练。

  • 通常情况下,min_count=1 会使模型比较大的值更差(例如 min_count=5 的默认值)。只出现一次的词通常不太好 word-vectors,因为该算法需要多个 subtly-contrasting 示例才能发挥其魔力。但是,trying-and-failing 使 word-vectors 从这样的单例中变得有用往往会占用 training-effort 和 model-state 这可能对其他有足够例子的词更有帮助——所以保留那些不常见的词甚至让 other word-vectors 变得更糟。 (绝对 不是 "retaining every raw word makes the model better" 的情况,尽管几乎总是 "more real diverse data makes the model better" 的情况。)