python - 从 word2vec 过滤词嵌入
问题描述
我在这里下载了谷歌的预训练词嵌入作为二进制文件 (GoogleNews-vectors-negative300.bin.gz)。我希望能够根据一些词汇过滤嵌入。
我首先尝试将 bin 文件加载为 KeyedVector 对象,然后创建一个字典,将其词汇表与另一个词汇表一起用作过滤器。然而,这需要很长时间。
# X is the vocabulary we are interested in
embeddings = KeyedVectors.load_word2vec_format('GoogleNews-vectors-
negative300.bin.gz', binary=True)
embeddings_filtered = dict((k, embeddings[k]) for k in X if k in list(embeddings.wv.vocab.keys()))
运行需要很长时间。我不确定这是否是最有效的解决方案。我应该先在 load_word2vec_format
步骤中过滤掉它吗?
解决方案
您dict
不会拥有KeyedVectors
对象的所有功能,也不会紧凑地存储。KeyedVectors 将所有向量存储在一个大的连续原生 2D 数组中,其中 dict 指示每个单词向量的行。您的第二个字典,每个单词都有一个单独的向量,将涉及更多开销。(此外,由于您从中返回的向量embeddings[k]
将是完整向量的“视图”——因此您的子集实际上可能会间接保留较大的数组,即使您尝试丢弃KeyedVectors
.)
由于您可能只想要原始向量的一个子集的一个原因可能是原始集合太大,dict
因此占用尽可能多或更多内存的 a 可能并不理想。
您应该考虑两种选择:
load_word2vec_format()
包括一个可选limit
参数,该参数仅从提供的文件加载前 N 个单词。由于此类文件通常从最频繁到最不频繁的单词进行排序,而不太常用的单词的用处和向量质量都低得多,因此通常只使用前 100 万、500,000 或 100,000 个等条目以节省大量内存和速度。您可以尝试在负载上进行过滤。您需要调整加载代码来执行此操作。
load_word2vec_format()
幸运的是,您可以在本地 gensim 安装中查看完整的源代码(只有几十行),或者在项目源代码托管处在线查看:
你会编写你自己的这个例程版本,跳过不感兴趣的单词。(它可能需要对文件进行两次传递,一次计算感兴趣的单词,然后第二次实际分配正确大小的内存数组并进行真正的读取。)
推荐阅读
- java - 如何以编程方式将 TextView 与 ImageView 的中心对齐?
- excel - 在 Excel 中平均动态范围
- python - 无法弄清楚为什么五边形被错误地绘制并且不像其他形状那样向右移动
- pandas - TypeError to_gbq() 得到了一个意外的关键字参数“位置”
- c++ - 在模板类中实例化嵌套模板函数
- r - 使用列表值拆分列并收集到 r
- bash - 使用大括号扩展在命令行上移动文件
- python-3.x - 如果在第一组中找不到,如何遍历第二组数据?
- node.js - 在 React Native 中存储密钥的最安全方式是什么
- laravel - Vue:在它自己的 Github 仓库中有前端?