0

我正在尝试使用 in 中的text2vec包从语料库中计算术语术语共现矩阵(或 TCM) R(因为它有一个很好的并行后端)。我遵循了本教程,但是在检查一些玩具示例时,我注意到该create_tcm函数对术语-术语共现值进行了某种缩放或加权。我知道它在内部使用skip-grams,但文档没有提到它是如何缩放它们的——显然,更远的术语/unigrams 的权重更低。

这是一个例子:

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 窗口中的每个术语/单字都得到同等对待?即,如果一个词在语料库中两次出现在另一个词的上下文窗口内,则它应该在 TCM 矩阵中显示为“2”。

额外的问题:默认缩放是如何工作的?如果在最后一个示例中添加更多的“a”,则 bc 值似乎线性减小,而 ba 值实际上增加了——尽管出现更多的“a”或“a”看起来离“b”更远。

4

1 回答 1

1

更新 2017-02-01 将更新推送到 github - 现在您可以直接在create_tcm.

加权函数在这里定义。如果您需要窗口内每个术语的权重相等,则需要调整权重函数以始终返回(只需克隆 repo,更改函数定义并使用or1从源代码构建包):devtoolsR CMD build

inline float weighting_fun(uint32_t offset) {
  return 1.0;
}

然而,已经有几个人要求使用此功能,我可能会在下一个版本中包含此类选项。

于 2016-10-30T16:46:46.630 回答