Rob*_*bin 4 python nlp cpu-word gensim word2vec
我在一百万个摘要数据集(20亿字)上使用word2vec.为了找到大多数类似的文档,我使用了这个gensim.similarities.WmdSimilarity类.在尝试使用时检索最佳匹配时wmd_similarity_index[query],计算会花费大部分时间来构建字典.这是一段日志:
2017-08-25 09:45:39,441 : INFO : built Dictionary(127 unique tokens: ['empirical', 'model', 'estimating', 'vertical', 'concentration']...) from 2 documents (total 175 corpus positions)
2017-08-25 09:45:39,445 : INFO : adding document #0 to Dictionary(0 unique tokens: [])
Run Code Online (Sandbox Code Playgroud)
这部分是什么?它依赖于查询吗?有没有办法一次性完成这些计算?
编辑:我的代码中的培训和评分阶段:
培训并保存到磁盘:
w2v_size = 300
word2vec = gensim.models.Word2Vec(texts, size=w2v_size, window=9, min_count=5, workers=1, sg=1, hs=1, iter=20) # sg=1 means skip gram is used
word2vec.save(utils.paths.PATH_DATA_GENSIM_WORD2VEC)
corpus_w2v_wmd_index = gensim.similarities.WmdSimilarity(texts, word2vec.wv)
corpus_w2v_wmd_index.save(utils.paths.PATH_DATA_GENSIM_CORPUS_WORD2VEC_WMD_INDEX)
Run Code Online (Sandbox Code Playgroud)
载入和评分:
w2v = gensim.models.Word2Vec.load(utils.paths.PATH_DATA_GENSIM_WORD2VEC)
words = [t for t in proc_text if t in w2v.wv]
corpus_w2v_wmd_index = gensim.similarities.docsim.Similarity.load(utils.paths.PATH_DATA_GENSIM_CORPUS_WORD2VEC_WMD_INDEX)
scores_w2v = np.array(corpus_w2v_wmd_index[words])
Run Code Online (Sandbox Code Playgroud)
"Word Mover的距离"计算相对昂贵 - 对于每个成对文档比较,它搜索语义位置的最佳"移位",并且移位本身取决于每个比较文档的所有单词之间的成对简单距离.
也就是说,它涉及比两个高维向量之间的简单余弦距离更多的计算,并且它涉及更多计算,两个文档的时间越长.
从texts语料库中可以预先计算的内容不多,直到查询的单词已知.(每个成对计算取决于查询的单词,以及它们与每个语料库文档的单词的简单距离.)
也就是说,gensim WmdSimilarity类还没有做一些优化.
最初的大规模杀伤性武器论文描述了一种更快的计算方法,可以帮助消除不可能出现在前N个最类似WMD的结果中的语料库文本.从理论上讲,gensim WmdSimilarity也可以实现这种优化,并提供更快的结果,初始化至少在WmdSimilarity与num_best参数.(没有它,每个查询都会返回所有WMD相似性得分,因此这种优化无济于事.)
此外,现在WmdSimilarity该类只是将KeyedVectors.wmdistance(doc1, doc2)每个查询到语料库 - 文档对调用为原始文本.因此,每次重新计算从所有doc1单词到doc2单词的成对简单距离,即使许多对在语料库中重复.(也就是说,如果'apple'在查询中并且'orange'在每个语料库doc中,它仍将重复计算'apple'-to'orange'距离.)
因此,一些临时值的缓存可能有助于提高性能.例如,在所有语料库文档中查询1000个单词和100,000个单词的词汇表时,((1000 * 100,000) / 2)可以使用200MB预先计算5000万个成对词距,然后由所有后续WMD计算共享.要添加此优化,需要对WmdSimilarity.get_similarities()和进行协同重构KeyedVectors.wmdistance().
最后,Word2Vec/Doc2Vec应用程序不一定需要停止词或删除词或从中受益.但是,由于WMD计算的费用随着文档和词汇量的增加而增加,任何缩小有效文档大小的内容都可以帮助提高性能.因此,在大型文档集上使用WMD时,可能需要考虑各种丢弃低价值单词或合并相似单词的方法.
| 归档时间: |
|
| 查看次数: |
2793 次 |
| 最近记录: |