3

我一直在使用findAssoc()文本挖掘(tm包),但意识到我的数据集似乎有些不对劲。

我的数据集是保存在一列 csv 文件中的 1500 个开放式答案。所以我像这样调用数据集并使用典型tm_map将其制成语料库。

library(tm)
Q29 <- read.csv("favoritegame2.csv")
corpus <- Corpus(VectorSource(Q29$Q29))
corpus <- tm_map(corpus, tolower)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus<- tm_map(corpus, removeWords, stopwords("english"))
dtm<- DocumentTermMatrix(corpus)

findAssocs(dtm, "like", .2)
> cousin  fill  ....
  0.28    0.20      

Q1。当我找到与 相关的术语时like,我没有将输出like = 1视为输出的一部分。然而,

dtm.df <-as.data.frame(inspect(dtm))

该数据框由 1500 个 obs 组成。1689 个变量..(或者是因为数据保存在一行 csv 文件中?)

Q2。即使cousinandfill出现过一次,当目标词like出现一次时,分数就不同了。他们不应该一样吗?

我试图找到数学findAssoc()但还没有成功。任何建议都非常感谢!

4

4 回答 4

10

我认为没有人回答你的最后一个问题。

我试图找到 findAssoc() 的数学,但还没有成功。任何建议都非常感谢!

findAssoc() 的数学运算基于 R 的 stats 包中的标准函数 cor()。给定两个数值向量,cor() 计算它们的协方差除以两个标准差。

因此,给定一个包含术语“word1”和“word2”的 DocumentTermMatrix dtm,使得 findAssocs(dtm,“word1”, 0) 返回值为 x 的“word2”,“word1”和“word2”的术语向量的相关性是 x。

对于一个冗长的例子

> data <-  c("", "word1", "word1 word2","word1 word2 word3","word1 word2 word3 word4","word1 word2 word3 word4 word5") 
> dtm <- DocumentTermMatrix(VCorpus(VectorSource(data)))
> as.matrix(dtm)
    Terms
Docs word1 word2 word3 word4 word5
   1     0     0     0     0     0
   2     1     0     0     0     0
   3     1     1     0     0     0
   4     1     1     1     0     0
   5     1     1     1     1     0
   6     1     1     1     1     1
> findAssocs(dtm, "word1", 0) 
$word1
word2 word3 word4 word5 
 0.63  0.45  0.32  0.20 

> cor(as.matrix(dtm)[,"word1"], as.matrix(dtm)[,"word2"])
[1] 0.6324555
> cor(as.matrix(dtm)[,"word1"], as.matrix(dtm)[,"word3"])
[1] 0.4472136

第 4 和第 5 字以此类推。

另见http://r.789695.n4.nabble.com/findAssocs-tt3845751.html#a4637248

于 2017-04-03T18:43:50.613 回答
7
 findAssocs
#function (x, term, corlimit) 
#UseMethod("findAssocs", x)
#<environment: namespace:tm>

methods(findAssocs )
#[1] findAssocs.DocumentTermMatrix* findAssocs.matrix*   findAssocs.TermDocumentMatrix*

 getAnywhere(findAssocs.DocumentTermMatrix)
#-------------
A single object matching ‘findAssocs.DocumentTermMatrix’ was found
It was found in the following places
  registered S3 method for findAssocs from namespace tm
  namespace:tm
with value

function (x, term, corlimit) 
{
    ind <- term == Terms(x)
    suppressWarnings(x.cor <- cor(as.matrix(x[, ind]), as.matrix(x[, 
        !ind])))

那就是删除自我引用的地方。

    findAssocs(x.cor, term, corlimit)
}
<environment: namespace:tm>
#-------------
 getAnywhere(findAssocs.matrix)
#-------------
A single object matching ‘findAssocs.matrix’ was found
It was found in the following places
  registered S3 method for findAssocs from namespace tm
  namespace:tm
with value

function (x, term, corlimit) 
sort(round(x[term, which(x[term, ] > corlimit)], 2), decreasing = TRUE)
<environment: namespace:tm>
于 2013-01-10T23:35:52.707 回答
2

顺便说一句,如果您的术语文档矩阵非常大,您可能想尝试以下版本findAssocs

# u is a term document matrix (transpose of a DTM)
# term is your term
# corlimit is a value -1 to 1

findAssocsBig <- function(u, term, corlimit){
  suppressWarnings(x.cor <-  gamlr::corr(t(u[ !u$dimnames$Terms == term, ]),        
                                         as.matrix(t(u[  u$dimnames$Terms == term, ]))  ))  
  x <- sort(round(x.cor[(x.cor[, term] > corlimit), ], 2), decreasing = TRUE)
  return(x)
}

这样做的好处是它使用不同的方法将 TDM 转换为矩阵tm:findAssocs。这种不同的方法可以更有效地使用内存,这意味着您可以使用tm:findAssocs无法处理的大型 TDM(或 DTM)。当然,使用足够大的 TDM/DTM 时,使用此功能也会出现有关内存分配的错误。

于 2013-05-30T22:21:24.847 回答
0

您的 dtm 有 1689 个变量,因为这是您观察中唯一词的数量(不包括停用词和数字)。可能“喜欢”这个词出现在你的 1500 次观察中不止一个,并且并不总是伴随着“表亲”和“填充”。你数过“喜欢”出现了多少次吗?

于 2013-05-16T02:28:04.767 回答