我使用文档频率矩阵上的findAssocs() of tm包来识别与语料库中不同文档之间的特定术语相关联的单词。
我的问题是,当把一个术语向量作为函数的输入时,我得到的输出与给出单个项作为输入时的输出是不同的。
这是我的例子。
library(tm)
txt <- c("alpha bravo", "alpha charlie", "alpha charlie", "zulu")
corp <- Corpus(VectorSource(txt))
dtm <- DocumentTermMatrix(corp)返回以下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()"有什么不同?
发布于 2016-03-31 22:31:38
由于@Steven的评论中所述的原因,tm::findAssocs()省略了直接比较。考虑到您正在搜索一小组可能高度相关的术语,这似乎更像是一个bug,而不是一个特性。这个函数的例子(请参阅?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.3333333similarity()可以进行余弦相似以及代理包中定义的其他相似点,但是(Pearson)相关和余弦方法目前是在完全稀疏计算中实现的,而其他方法目前还没有实现。此外,通过定义margin = "documents",您可以比较文档而不是术语,例如用于集群。
https://stackoverflow.com/questions/36341031
复制相似问题