我正在尝试使用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”。
答案 0 :(得分:1)
更新2017-02-01
Pushed update to github - 现在您可以直接在create_tcm
中指定加权向量。
加权函数定义为here。
如果窗口中的每个术语需要相等的权重,则需要调整权重函数以始终返回1
(仅使用devtools
或R CMD build
克隆仓库,更改函数定义并从源代码构建包):
inline float weighting_fun(uint32_t offset) {
return 1.0;
}
然而,有几个人已经要求这个功能,我可能会在下一个版本中包含这样的选项。