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表示?
初始化Word2Vec模型的常规方法gensim是[1]
model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)
Run Code Online (Sandbox Code Playgroud)
问题是,是什么sentences?sentences应该是单词/标记的迭代的迭代器.它就像你拥有的numpy矩阵,但每行可以有不同的长度.
如果您查看文档gensim.models.word2vec.LineSentence,它会为您提供一种将文本文件直接加载为句子的方法.作为一个提示,根据文档,它需要
一句话=一行; 单词已经过预处理并被空格分隔.
当它说words already preprocessed,它指的是下套管,词干,禁用词过滤和所有其他文本清理过程.在您的情况下,您不希望5并且6在您的句子列表中,因此您需要将它们过滤掉.
鉴于你已经有了numpy矩阵,假设每一行都是一个句子,那么最好将它转换为二维数组并过滤掉所有5和6.生成的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/
| 归档时间: |
|
| 查看次数: |
2574 次 |
| 最近记录: |