【发布时间】:2016-10-30 15:22:01
【问题描述】:
我正在尝试使用R 中的text2vec 包从语料库中计算术语-术语共现矩阵(或TCM)(因为它有一个很好的并行后端)。我关注了this tutorial,但在检查一些玩具示例时,我注意到create_tcm 函数对术语-术语共现值进行了某种缩放或加权。我知道它在内部使用了 skip-gram,但文档没有提到它是如何缩放它们的 - 显然,更远的术语/unigram 的权重更低。
这是一个例子:
tcmtest = function(sentences){
tokens <- space_tokenizer(sentences)
it = itoken(tokens, progressbar = FALSE)
vocab <- create_vocabulary(it, ngram = c(ngram_min = 1L, ngram_max = 1L))
vectorizer <- vocab_vectorizer(vocab, grow_dtm = FALSE, skip_grams_window = 5L)
return(create_tcm(it, vectorizer))
}
> tcmtest(c("a b", "a b c"))
3 x 3 sparse Matrix of class "dgTMatrix"
b c a
b . 1 2.0
c . . 0.5
a . . .
> tcmtest(c("a b", "c a b"))
3 x 3 sparse Matrix of class "dgTMatrix"
b c a
b . 0.5 2
c . . 1
a . . .
> tcmtest(c("a b", "c a a a b"))
3 x 3 sparse Matrix of class "dgTMatrix"
b c a
b . 0.25 2.833333
c . . 1.833333
a . . .
问题:有没有什么办法可以禁用这种行为,从而使 skip-gram 窗口中的每个术语/unigram 都得到同等对待?即,如果一个词在语料库中两次出现在另一个词的上下文窗口内,它应该在 TCM 矩阵中显示“2”。
额外问题:默认缩放功能是如何工作的?如果您在最后一个示例中添加更多“a”,那么 b-c 值似乎会线性减小,而 b-a 值实际上会增加 - 尽管出现更多的“a”或“a”似乎离“b”更远。
【问题讨论】:
-
额外问题:在最后一个示例中,“b”是 c 中的第 4 个字母。那是1/4。对于“a”和“c”,在来自 c 的 1、2 和 3 个字母处都有“a”。那是 1 + 1/2 + 1/3 = 1.833333。对于“b”和“a”,您有 2 次“a”紧邻“b”,然后有两个“a”实例分别与“b”的距离为 2 和 3。那是 2 + 1/2 + 1/3。既然你有
skip_grams_window = 5,c("a b", "c a a a a a a b")和c("a b", "c a a a a a b")将产生与tcmtest相同的结果。 -
@Jota 很酷,这是有道理的。现在我该如何绕过这个缩放问题?
-
@user3554004 实际上您在示例中没有使用任何并行后端。看看我们如何在这个vignette 中创建
jobs。另外我想补充一点,对tcm使用并行后端仅对非常大的语料库有意义。 -
@user3554004 使用 RcppParallel 完成 GloVe 装配,因此没有开销(ram 和 cpu)。
tcmcreation 是不同的——我们为每个块计算它,然后对它们求和,see here。然而,在这种情况下,我们面临着内存消耗的开销……只要我们有足够的 RAM,我们就可以尝试并行增长它。但根据我的经验tcm构建通常不是瓶颈 - 我们构建一次并多次重用。在英语维基百科的 1 个线程中创建tcm需要 ~ 2 小时。 -
@user3554004 现在(text2vec >= 0.5)你可以直接在
create_tcm函数中指定权重向量。