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
)说明了这一点,其中术语 oil
和 opec
最相似,但这被彼此的关联向量中的每个省略所掩盖.
另一种方法是使用 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"
,您可以比较文档而不是术语,例如用于聚类。
我在文档频率矩阵上使用 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
)说明了这一点,其中术语 oil
和 opec
最相似,但这被彼此的关联向量中的每个省略所掩盖.
另一种方法是使用 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"
,您可以比较文档而不是术语,例如用于聚类。