首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tm包的findAssocs()禁止关联。

tm包的findAssocs()禁止关联。
EN

Stack Overflow用户
提问于 2016-03-31 18:30:34
回答 1查看 837关注 0票数 2

我使用文档频率矩阵上的findAssocs() of tm包来识别与语料库中不同文档之间的特定术语相关联的单词。

我的问题是,当把一个术语向量作为函数的输入时,我得到的输出与给出单个项作为输入时的输出是不同的。

这是我的例子。

代码语言:javascript
复制
library(tm)
txt  <- c("alpha bravo", "alpha charlie", "alpha charlie", "zulu")
corp <- Corpus(VectorSource(txt))
dtm  <- DocumentTermMatrix(corp)

返回以下dtm

代码语言:javascript
复制
> 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"相关的所有术语,我将得到以下输出(如预期的那样):

代码语言:javascript
复制
> findAssocs(dtm, "alpha", 0.00)
$alpha
charlie   bravo 
   0.58    0.33 

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

代码语言:javascript
复制
> findAssocs(dtm, "bravo", 0.00)
$bravo
alpha
0.33

由于我希望找到一些术语的这些关联,所以我向findAssocs传递了一个向量,以获得所需的输出。但是,如果我向函数传递一个术语向量(chr),则输出与为单个输入获得的输出不同:

代码语言:javascript
复制
> findAssocs(dtm, c("alpha","bravo"), 0.00)
$alpha
charlie 
   0.58 

$bravo
numeric(0)

实际上,"alpha""bravo"之间的连接被省略了,这不是我在这里所期望的行为。该函数似乎独立地处理单个术语,因此,如果"alpha""bravo"都在向量中传递给函数,则不会分析它们之间的相关性。

有人能解释一下这种行为并告诉我如何省略吗?作为一种解决办法,我可以为每个术语应用函数,但这并不是很方便……

更新

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

代码语言:javascript
复制
> 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()"有什么不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-31 22:31:38

由于@Steven的评论中所述的原因,tm::findAssocs()省略了直接比较。考虑到您正在搜索一小组可能高度相关的术语,这似乎更像是一个bug,而不是一个特性。这个函数的例子(请参阅?tm::findAssocs)说明了这一点,其中术语oilopec最相似,但这是因为彼此的关联向量中忽略了它们。

另一种方法是使用quanteda包中的等效特性:

代码语言:javascript
复制
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 

或者如果你喜欢它作为一个矩阵:

代码语言:javascript
复制
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()可以进行余弦相似以及代理包中定义的其他相似点,但是(Pearson)相关和余弦方法目前是在完全稀疏计算中实现的,而其他方法目前还没有实现。此外,通过定义margin = "documents",您可以比较文档而不是术语,例如用于集群。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36341031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档