如何为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" 的情况。)
问题有两个:
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" 的情况。)