使用R中的text2vec计算未加权的基于单词的TCM?

时间:2016-10-30 15:22:02

标签: r nlp n-gram text2vec

我正在尝试使用text2vec中的R包来计算语料库中的术语共生矩阵(或TCM)(因为它有一个很好的并行后端)。我跟着this tutorial,但在检查一些玩具示例时,我注意到create_tcm函数对术语 - 术语共现值进行了某种缩放或加权。我知道它在内部使用了skip-gram,但是文档没有提到它如何扩展它们 - 显然,更远的术语/ 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窗口中的每个term / unigram被平等对待?即,如果术语在语料库中在另一个术语的上下文窗口内发生两次,则在TCM矩阵中应该说“2”。

奖金问题:默认扩展功能如何运作?如果你在最后一个例子中添加更多的“a”,那么b-c值似乎线性减少,而b-a值实际上增加了 - 尽管更多的出现或“a”看起来远离“b”。

1 个答案:

答案 0 :(得分:1)

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

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

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

然而,有几个人已经要求这个功能,我可能会在下一个版本中包含这样的选项。