word2vec词汇表中缺少单词

word2vec词汇表中缺少单词,word2vec,Word2vec,我正在使用mikolov的实现在我自己的文本语料库上训练word2vec。虽然我已经将最小计数设置为1,但并非所有语料库中的唯一单词都会得到一个向量。是否有任何参数我可能错过了,这可能是为什么不是所有独特的词都有一个向量?还有什么原因呢 为了测试word2vecs的行为,我编写了以下脚本,提供了一个包含20058个句子和278896个单词的文本文件(所有单词和标点符号都是空格分隔的,每行有一个句子) 导入子流程 def get_w2v_vocab(路径EMB): vocab=set() 将打开的

我正在使用mikolov的实现在我自己的文本语料库上训练word2vec。虽然我已经将最小计数设置为1,但并非所有语料库中的唯一单词都会得到一个向量。是否有任何参数我可能错过了,这可能是为什么不是所有独特的词都有一个向量?还有什么原因呢

为了测试word2vecs的行为,我编写了以下脚本,提供了一个包含20058个句子和278896个单词的文本文件(所有单词和标点符号都是空格分隔的,每行有一个句子)

导入子流程
def get_w2v_vocab(路径EMB):
vocab=set()
将打开的(路径_emb,'r',编码为'utf8')作为f:
下一个(f)
对于f中的行:
word=行。拆分(“”)[0]
加上(单词)
返回vocab-{'}
def列车(路径主体、路径EMB):
子进程调用([“/word2vec”、“-threads”、“-train”、“-path_-corpus、,
“-output”,path_embs,“-min count”,“1”])
def在语料库(路径语料库)中获取唯一的单词:
vocab=[]
将open(path_corpus,'r',encoding='utf8')作为f:
对于f中的行:
vocab.extend(line.strip('\n').split('')
返回集(vocab)
def检查_相等(预期、实际):
如果不是预期的==实际的:
差异=长度(预期-实际)
引发异常('Not equal!Vocab预期:{},Vocab实际:{},Diff:{}'。格式(len(预期),len(实际),Diff))
打印('预期vocab和实际vocab相等')
def main():
path_corpus='test_corpus2.txt'
路径_embs='embeddings.vec'
vocab_expected=在语料库(路径语料库)中获取唯一的单词
列车(路径库、路径EMB)
vocab_实际值=获取vocab(路径emb)
检查是否相等(预期为vocab_,实际为vocab_)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
此脚本提供以下输出:

Starting training using file test_corpus2.txt
Vocab size: 33651
Words in train file: 298954
Alpha: 0.000048  Progress: 99.97%  Words/thread/sec: 388.16k  Traceback (most recent call last):
  File "test_w2v_behaviour.py", line 44, in <module>
    main()
  File "test_w2v_behaviour.py", line 40, in main
    check_equality(vocab_expected, vocab_actual)
  File "test_w2v_behaviour.py", line 29, in check_equality
    raise Exception('Not equal! Vocab expected: {}, Vocab actual: {}, Diff: {}'.format(len(expected), len(actual), diff))
Exception: Not equal! Vocab expected: 42116, Vocab actual: 33650, Diff: 17316

使用文件test\u corpus2.txt开始培训
单张尺寸:33651
列车档案字:298954
Alpha:0.000048进度:99.97%字/线程/秒:388.16k回溯(最近一次调用最后一次):
文件“test_w2v_behavior.py”,第44行,在
main()
文件“test_w2v_behavior.py”,第40行,在main中
检查是否相等(预期为vocab_,实际为vocab_)
文件“test_w2v_behavior.py”,第29行,在check_equality中
引发异常('Not equal!Vocab预期:{},Vocab实际:{},Diff:{}'。格式(len(预期),len(实际),Diff))
例外:不平等!预计为42116,实际为33650,差异为17316

只要您使用的是Python,就可能需要使用
gensim
包中的
Word2Vec
实现。它做到了最初的Mikolov/Google
word2vec.c
所做的一切,甚至更多,而且通常在性能上具有竞争力

特别是,它在UTF-8编码方面不会有任何问题——尽管我不确定Mikolov/Google
word2vec.c
是否正确处理UTF-8。而且,这可能是你的分歧的一个来源

如果您需要弄清您的差异,我建议:

  • 让您的
    get\u unique\u words\u in_corpus()
    也统计/报告其标记化创建的非唯一单词的总数。如果这与
    word2vec.c
    报告的
    298954
    不一样,那么这两个过程显然无法从相同的基线理解源文件中的“单词”

  • 找到一些单词,或者至少一个代表性单词,这些单词是您的令牌计数期望出现在最终模型中的,而不是。检查这些文件是否有任何共同特征,包括文件中的上下文。这可能会揭示为什么这两个数字不同

同样,我怀疑与UTF-8相关的东西,或者可能与
word2vec.c
中的其他实现限制(例如最大字长)相关的东西没有反映在基于Python的字数统计中

您可以使用而不是Word2Vec。FastText能够通过查看子词信息(字符ngrams)嵌入词汇表外的单词。Gensim还有一个FastText实现,非常易于使用:

from gensim.models import FastText as ft

model = ft(sentences=training_data,)

word = 'blablabla' # can be out of vocabulary
embedded_word = model[word] # fetches the word embedding

请参见

谢谢,我的文本文件是utf8编码的,因此可能是编码相关错误。我将尝试gensim实现。
from gensim.models import FastText as ft

model = ft(sentences=training_data,)

word = 'blablabla' # can be out of vocabulary
embedded_word = model[word] # fetches the word embedding