Gensim word2vec关于预定义的字典和单词索引数据

时间:2016-03-01 11:20:22

标签: python nlp gensim word2vec

我需要使用gensim在推文上训练word2vec表示。与我在gensim上看到的大多数教程和代码不同,我的数据不是原始数据,但已经过预处理。我在包含65k字的文本文档中有一个字典(包括"未知"令牌和EOL令牌),并且推文被保存为带有索引的numpy矩阵到这个字典中。下面是一个简单的数据格式示例:

dict.txt

you
love
this
code

推文(5个未知,6个是EOL)

[[0, 1, 2, 3, 6],
 [3, 5, 5, 1, 6],
 [0, 1, 3, 6, 6]]

我不确定如何处理索引表示。一种简单的方法就是将索引列表转换为字符串列表(即[0,1,2,3,6] - > [' 0',' 1' ,当我把它读入word2vec模型时,' 2',' 3',' 6'])。然而,这必然是低效的,因为gensim然后将尝试查找用于例如的内部索引。 ' 2'

如何使用gensim以高效的方式加载此数据并创建word2vec表示?

2 个答案:

答案 0 :(得分:9)

Word2Vec中初始化gensim模型的常规方法是[1]

model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)

问题是,sentences是什么? sentences应该是单词/标记的迭代的迭代器。它就像你拥有的numpy矩阵,但每行可以有不同的长度。

如果您查看gensim.models.word2vec.LineSentence的文档,它会为您提供一种将文本文件直接加载为句子的方法。作为提示,根据文档,需要

  

一句话=一行;单词已经被空格预处理和分隔。

当它显示words already preprocessed时,它指的是低层,词干,禁用词过滤和所有其他文本清理过程。在您的情况下,您不希望56出现在您的句子列表中,因此您需要将其过滤掉。

鉴于您已经拥有numpy矩阵,假设每一行都是一个句子,最好将其转换为二维数组并过滤掉所有56。生成的2d数组可以直接用作sentences参数来初始化模型。唯一的问题是,当你想在训练后查询模型时,你需要输入索引而不是标记。

现在有一个问题是模型是否直接采用整数。在Python版本中,它不会检查类型,只是传递唯一的令牌。在这种情况下,您的独特指数将正常工作。但是大多数时候你会想要使用C-Extended例程来训练你的模型,这是一个很大的优点,因为它可以提供70倍的性能。 [2]我想在这种情况下,C代码可以检查字符串类型,这意味着存储了一个字符串到索引的映射。

这效率低吗?我想不是,因为你拥有的字符串是数字,它们通常比它们所代表的真实代码短得多(假设它们是来自0的紧凑索引)。因此,模型的尺寸会更小,这样可以节省一些最终模型序列化和反序列化的工作量。您基本上已经将输入标记编码为较短的字符串格式,并将其与word2vec训练分开,而word2vec模型则不需要知道此编码在训练之前发生。

我的哲学是try the simplest way first。我只是向模型抛出一个整数的示例测试输入,看看会出现什么问题。希望它有所帮助。

[1] https://radimrehurek.com/gensim/models/word2vec.html

[2] http://rare-technologies.com/word2vec-in-python-part-two-optimizing/

答案 1 :(得分:1)

我有同样的问题。甚至通过

转换为字符串数组
>>> arr_str = np.char.mod('%d', arr)
运行Word2Vec时

导致异常:

>>> model = Word2Vec(arr_str)
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()

我的解决方案是将整数数组写为文本,然后将word2vec与LineSentence一起使用。

import numpy as np
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence

np.savetxt('train_data.txt', arr, delimiter=" ", fmt="%s") 
sentences = LineSentence('train_data.txt')
model = Word2Vec(sentences)