【问题标题】:Compute unweighted bag-of-words based TCM using text2vec in R?在 R 中使用 text2vec 计算未加权的基于词袋的 TCM?
【发布时间】: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 = 5c("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函数中指定权重向量。

标签: r nlp n-gram text2vec


【解决方案1】:

2017-02-01 更新 Pushed update to github - 现在您可以直接在create_tcm 中指定权重向量。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2021-10-01
    • 1970-01-01
    • 2019-08-29
    • 2016-02-06
    相关资源
    最近更新 更多