tm 包的 findAssocs() 抑制关联

findAssocs() of tm packages suppresses associations

我在文档频率矩阵上使用 tm 包的 findAssocs() 来识别与语料库中各种文档中的特定术语相关联的词。

我的问题是,将项向量作为函数的输入与将单个项作为输入相比,我得到的输出不同。

这是我的例子。

library(tm)
txt  <- c("alpha bravo", "alpha charlie", "alpha charlie", "zulu")
corp <- Corpus(VectorSource(txt))
dtm  <- DocumentTermMatrix(corp)

Returns以下dtm

> as.matrix(dtm)
    Terms
Docs alpha bravo charlie zulu 
   1     1     1       0    0
   2     1     0       1    0
   3     1     0       1    0
   4     0     0       0    1

如果我想识别与 "alpha" 相关的所有术语,我会得到以下输出(按预期):

> findAssocs(dtm, "alpha", 0.00)
$alpha
charlie   bravo 
   0.58    0.33 

我可以对 "bravo" 执行相同的操作并获得以下输出(如预期的那样):

> findAssocs(dtm, "bravo", 0.00)
$bravo
alpha
0.33

因为我想找到一些术语的关联,所以我将向量传递给 findAssocs 以获得所需的输出。但是,如果我将项向量 (chr) 传递给函数,则输出与我为单个输入获得的输出不同:

> findAssocs(dtm, c("alpha","bravo"), 0.00)
$alpha
charlie 
   0.58 

$bravo
numeric(0)

实际上,"alpha""bravo" 之间的关联被省略了,这不是我在这里期望的行为。该函数似乎独立对待各个项,因此如果 "alpha""bravo" 都传递给向量中的函数,则不会分析它们之间的相关性。

任何人都可以解释这种行为并告诉我如何忽略它吗?作为一种解决方法,我可以为每个单独的术语应用该函数,但这并不是很方便...

更新

我觉得奇怪的是,如果我们绘制关联图,"alpha""bravo" 之间的相关性不会被忽略,例如通过以下代码:

> freqTerm <- findFreqTerms(dtm, 1)
> freqTerm
[1] "alpha"   "bravo"   "charlie" "zulu" 

plot(dtm, term=freqTerm, corThreshold=0.0, weighting=T, attrs=list(node=list(fixedsize=FALSE, shape="ellipse")))

plot(dtm, term=freqTerm ..."findAssocs()" 有何不同?

tm::findAssocs() 完全出于@Steven Beauport 评论中所述的原因而省略了直接比较。鉴于您正在搜索一小组可能高度相关的术语,这看起来更像是一个错误而不是一个功能。此函数的示例(请参阅 ?tm::findAssocs)说明了这一点,其中术语 oilopec 最相似,但这被彼此的关联向量中的每个省略所掩盖.

另一种方法是使用 quanteda 包中的等效功能:

library(quanteda)
txt  <- c("alpha bravo", "alpha charlie", "alpha charlie", "zulu")
corp <- corpus(txt)
dtm  <- dfm(corp, verbose = FALSE)
# this also works fine if you want to go straight from text:
# dtm <- dfm(txt, verbose = FALSE)

(simlist <- similarity(dtm, c("alpha","bravo"), margin = "features"))
## similarity Matrix:
## $alpha
## charlie   bravo    zulu 
##  0.5774  0.3333 -1.0000 
## 
## $bravo
##   alpha    zulu charlie 
##  0.3333 -0.3333 -0.5774 

或者如果您更喜欢它作为矩阵:

as.matrix(simlist)
##              alpha      bravo
## alpha    1.0000000  0.3333333
## charlie  0.5773503 -0.5773503
## bravo    0.3333333  1.0000000
## zulu    -1.0000000 -0.3333333

similarity() 可以做余弦相似性以及 proxy 包中定义的其他相似性,但是(Pearson 的)相关性和余弦方法目前在完全稀疏中实现计算,而其他的还没有(还)。此外,通过定义 margin = "documents",您可以比较文档而不是术语,例如用于聚类。