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

pir*_*pir 10 python nlp gensim word2vec

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

dict.txt

you
love
this
code
Run Code Online (Sandbox Code Playgroud)

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

[[0, 1, 2, 3, 6],
 [3, 5, 5, 1, 6],
 [0, 1, 3, 6, 6]]
Run Code Online (Sandbox Code Playgroud)

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

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

Mai*_*Mai 9

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

model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)
Run Code Online (Sandbox Code Playgroud)

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

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

一句话=一行; 单词已经过预处理并被空格分隔.

当它说words already preprocessed,它指的是下套管,词干,禁用词过滤和所有其他文本清理过程.在您的情况下,您不希望5并且6在您的句子列表中,因此您需要将它们过滤掉.

鉴于你已经有了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/