- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 100 万个摘要数据集(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: [])
这部分是什么?它取决于查询吗?有没有办法一次性完成这些计算?
编辑我代码中的训练和评分阶段:
训练并保存到磁盘:
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)
加载和评分:
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])
最佳答案
“Word Mover's Distance”计算相对昂贵——对于每个成对文档比较,它会搜索语义位置的最佳“移动”,并且该移动本身取决于每个比较的所有单词之间的成对简单距离文档。
也就是说,它涉及的计算量远远超过两个高维向量之间的简单余弦距离,并且两个文档越长,涉及的计算量就越大。
在知道查询词之前,texts
语料库中没有多少可以预先计算的。 (每个成对计算都取决于查询的单词,以及它们与每个语料库文档单词的简单距离。)
也就是说,gensim WmdSimilarity
类还没有进行一些优化。
最初的 WMD 论文描述了一种更快的计算,可以帮助消除不可能出现在前 N 个与 WMD 最相似的结果中的语料库文本。理论上,gensim WmdSimilarity
也可以实现此优化,并提供更快的结果,至少在使用 num_best
参数初始化 WmdSimilarity
时是这样。 (如果没有它,每个查询都会返回所有 WMD 相似性分数,因此这种优化将无济于事。)
此外,目前 WmdSimilarity
类只是为每个查询到语料库文档对调用 KeyedVectors.wmdistance(doc1, doc2)
,作为原始文本。因此,每次都会重新计算从所有 doc1
单词到 doc2
单词的成对简单距离,即使许多对在整个语料库中重复。 (也就是说,如果'apple'在查询中并且'orange'在每个语料库文档中,它仍然会重复计算'apple'到'orange'的距离。)
因此,对临时值进行一些缓存可能有助于提高性能。例如,对于 1000 个单词的查询,以及所有语料库文档中 100,000 个单词的词汇,((1000 * 100,000)/2)
5000 万个成对单词距离可以预先计算一次,使用200MB,然后由所有后续的 WMD 计算共享。要添加此优化,需要对 WmdSimilarity.get_similarities()
和 KeyedVectors.wmdistance()
进行协作重构。
最后,Word2Vec/Doc2Vec 应用程序不一定需要停用词删除或词干提取或从中受益。但由于 WMD 计算的开销随着文档和词汇量的增加而增加,任何缩小有效文档大小的方法都有助于提高性能。因此,在大型文档集上使用 WMD 时,丢弃低值(value)词或合并相似词的各种方法可能值得考虑。
关于python - Gensim word2vec WMD 相似度字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45876711/
假设我有一个组织 ID 向量 let orgs = vec![1, 3, 14, 12]; 然后我调用 .iter()在 each 上获取每个组织的事件,其中函数 get_events_for()返回
这个问题已经有答案了: What are Rust's exact auto-dereferencing rules? (4 个回答) 已关闭 3 年前。 我很困惑为什么这个函数 get适用于 Vec
let a = vec![ vec![1, 2], vec![3, 4], vec![5, 6] ]; 怎么才能聚成一个Vec包含在所有 Vec 中的所有值s 在 a ? 最佳答案 您可以使用 fla
我在HashMap, Vec>中有数据,我想将该数据作为字节缓冲区(单个Vec)写入文件,然后从文件中读取回去并重建HashMap结构。 是否有建立像这样的平坦化和恢复 map 的算法?我可以将元数据
我正在寻找一种“使用rust ”的方式来将 Vec 累积到 Vec 中,以便将每个内部 Vec 的第一个元素加在一起,将每个 Vec 的每个第二个元素加在一起,等等......,并将结果收集到 Vec
我正在寻找一种“使用rust ”的方式来将 Vec 累积到 Vec 中,以便将每个内部 Vec 的第一个元素加在一起,将每个 Vec 的每个第二个元素加在一起,等等......,并将结果收集到 Vec
我正在尝试使用 selection_sort 创建一个已排序的向量,同时保留原始未排序的向量: fn main() { let vector_1: Vec = vec![15, 23, 4,
在 https://doc.rust-lang.org/std/vec/struct.Vec.html#method.iter , 我只能在页面左侧的索引侧边栏中找到iter。但是,找不到 iter_
我正在尝试从 Vec> 创建一个集合向量 ( Vec> ) .这是我目前的进展: use std::collections::BTreeSet; fn main() { // The data
我错过了向量向量初始化的一些东西。在第一种方法中,我尝试了这段代码: let mut landFirst: Vec> = Vec::with_capacity(width); for v in lan
我想设计一个类似于示例 here 的函数除了我的情况,iproduct 的参数数量在编译时是未知的。正如 here 所解释的那样,这在 python 中很容易完成。 . 我已经尝试使用 itertoo
我有一个我不明白的问题: fn cipher_with(key: &[u8], data: &[u8]) -> Vec { let data_len = 16; let mut dat
我刚开始学习 Rust,我偶然发现了这个愚蠢的问题: error: mismatched types: expected `&[u8]` but found `&collections::vec::V
这个问题在这里已经有了答案: How to filter a vector of custom structs? (1 个回答) 关闭 4 年前。 我有一个接受 &Vec 的函数(其中 Word 是
试图创建一个 HashMap 的数据库结构向量。每个Vec包含 Box . use std::collections::HashMap; trait Model { fn id(&self)
我正在编写一个使用 Vec> 的库类型以按列优先顺序存储数据(每个内部 Vec 代表一列)。用户可以创建 Vec>具有任何行和列长度,但所有列都被限制为相同的长度。 有时我需要高效地遍历 Vec>按行
在 GLSL 中我不明白什么是“in”和“out”变量,这是什么意思?这是我从教程中复制的代码示例。 // Shader sources const GLchar* vertexSource =
例如 [[5,6][2,3][2,5][2,9][1,6]]先按第一个元素升序排序,当一个元素相等时,按第二个元素降序排序,得到[1,6],[2,9],[2,5],[2,3] ],[5,6] 最佳答案
我正在尝试为类型为Vec>的向量创建可变的迭代器 迭代器代码: pub struct IterMut { iter: &'a mut Vec>, ix: usize, inne
我是 rust 编程的新手。我想用递归实现合并排序。这是我的代码: fn merge(a: &mut Vec, b: &mut Vec) -> Vec { let mut temp: Vec
我是一名优秀的程序员,十分优秀!