tm.package:findAssocs和Cosine

IVR

我是新来的,我的问题是数学而不是编程性质的,我想就我的方法是否有意义获得第二意见。

我试图找到使用功能在我的语料字与字之间的关联findAssocs,从tm包。即使它在通过该软件包提供的数据(例如《纽约时报》和美国国会)上似乎表现得相当不错,但我对我自己的数据集却不太整洁,对它的性能还是感到失望。罕见的文件似乎包含了几个重复的相同单词,这似乎很容易使它们失真,这似乎在它们之间建立了很强的联系。我发现,即使基于文献,余弦度量也可以更好地说明术语之间的相关性,尽管它仅倾向于用于度量文档的相似性,而不是术语。让我们使用RTextTools软件包中的USCongress数据来演示我的意思:

首先,我将设置所有内容...

data(USCongress)

text = as.character(USCongress$text)

corp = Corpus(VectorSource(text)) 

parameters = list(minDocFreq        = 1, 
                  wordLengths       = c(2,Inf), 
                  tolower           = TRUE, 
                  stripWhitespace   = TRUE, 
                  removeNumbers     = TRUE, 
                  removePunctuation = TRUE, 
                  stemming          = TRUE, 
                  stopwords         = TRUE, 
                  tokenize          = NULL, 
                  weighting         = function(x) weightSMART(x,spec="ltn"))

tdm = TermDocumentMatrix(corp,control=parameters)

假设我们有兴趣研究“政府”与“外国”之间的关系:

# Government: appears in 37 docs and between then it appears 43 times
length(which(text %like% " government"))
sum(str_count(text,"government"))

# Foreign: appears in 49 document and between then it appears 56 times
length(which(text %like% "foreign"))
sum(str_count(text,"foreign"))

length(which(text[which(text %like% "government")] %like% "foreign"))
# together they appear 3 times

# looking for "foreign" and "government"
head(as.data.frame(findAssocs(tdm,"foreign",0.1)),n=10)

             findAssocs(tdm, "foreign", 0.1)
countri                                 0.34
lookthru                                0.30
tuberculosi                             0.26
carryforward                            0.24
cor                                     0.24
malaria                                 0.23
hivaid                                  0.20
assist                                  0.19
coo                                     0.19
corrupt                                 0.19

# they do not appear to be associated

现在,让我们添加另一个包含“外国政府”的文档,该文档重复了50次:

text[4450] = gsub("(.*)",paste(rep("\\1",50),collapse=" "),"foreign government")
corp = Corpus(VectorSource(text)) 
tdm = TermDocumentMatrix(corp,control=parameters)

#running the association again:
head(as.data.frame(findAssocs(tdm,"foreign",0.1)),n=10)

             findAssocs(tdm, "foreign", 0.1)
govern                                  0.30
countri                                 0.29
lookthru                                0.26
tuberculosi                             0.22
cor                                     0.21
carryforward                            0.20
malaria                                 0.19
hivaid                                  0.17
assist                                  0.16
coo                                     0.16

如您所见,现在这是一个不同的故事,并且全部归结为一个文档。

在这里,我想做一些非常规的事情:使用余弦查找文档空间中术语之间的相似性。这种方法往往用于查找文档之间的相似性而不是术语,但是我认为没有理由不能将其用于查找单词之间的相似性。在传统意义上,文档是向量,而项是轴,我们可以根据这些文档之间的角度检测它们的相似性。但是术语文档矩阵是文档术语矩阵的转置,并且类似地,我们可以在文档空间中投影术语,即让您的文档成为坐标轴,使术语成为可以测量角度的向量。它似乎没有像简单关联这样的缺点:

cosine(as.vector(tdm["government",]),as.vector(tdm["foreign",]))
     [,1]
[1,]    0

除此之外,这两种措施似乎非常相似:

tdm.reduced = removeSparseTerms(tdm,0.98)

Proximity = function(tdm){ 
  d = dim(tdm)[1] 
  r = matrix(0,d,d,dimnames=list(rownames(tdm),rownames(tdm))) 
  for(i in 1:d){ 
    s = seq(1:d)[-c(1:(i-1))] 
    for(j in 1:length(s)){ 
      r[i,s[j]] = cosine(as.vector(tdm[i,]),as.vector(tdm[s[j],])) 
      r[s[j],i] = r[i,s[j]] 
    } 
  } 
  diag(r) = 0 
  return(r) 
}

rmat = Proximity(tdm.reduced)

# findAssocs method
head(as.data.frame(sort(findAssocs(tdm.reduced,"fund",0),decreasing=T)),n=10)

        sort(findAssocs(tdm.reduced, "fund", 0), decreasing = T)
use                                                         0.11
feder                                                       0.10
insur                                                       0.09
author                                                      0.07
project                                                     0.05
provid                                                      0.05
fiscal                                                      0.04
govern                                                      0.04
secur                                                       0.04
depart                                                      0.03

# cosine method
head(as.data.frame(round(sort(rmat[,"fund"],decreasing=T),2)),n=10)

       round(sort(rmat[, "fund"], decreasing = T), 2)
use                                              0.15
feder                                            0.14
bill                                             0.14
provid                                           0.13
author                                           0.12
insur                                            0.11
state                                            0.10
secur                                            0.09
purpos                                           0.09
amend                                            0.09

但是,令人惊讶的是,我还没有看到余弦被用来检测术语之间的相似性,这使我想知道我是否错过了一些重要的东西。也许这种方法在某种程度上是我没有过的。因此,对我所做的任何想法都将不胜感激。

如果您已经做到了这一点,那么感谢您的阅读!!

干杯

用户1370741

如果我理解您的查询(我认为应该在堆栈交换上)。我认为问题在于,术语“距离”findAssocs使用的是欧几里德测量。因此,仅是单词的两倍的文档将成为异常值,并且在距离测量中被认为有很大不同。
广泛使用余弦作为文档度量标准,因此我怀疑术语也可以。我喜欢skmeans用余弦对文档进行聚类软件包。球形K均值将直接接受TDM,并且以单位长度进行余弦距离。

视频在〜11米在显示它的情况下,你不知道的。希望这会有所帮助...最终,我认为余弦是可以接受的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

tm.package:findAssocs和Cosine

来自分类Dev

如何可视化tm的findAssocs()结果

来自分类Dev

R tm package and cyrillic text

来自分类Dev

tm包:矩阵中而不是R中的列表的findAssocs()输出

来自分类Dev

tm包:矩阵中而不是R中的列表的findAssocs()输出

来自分类Dev

Swift - C 函数和 struct tm

来自分类Dev

opencv中的TM_CCORR和TM_CCOEFF是什么意思?

来自分类Dev

R tmap-package图例标题位于tm_lines和

来自分类Dev

R:使用grep和tm包的部分匹配字典词

来自分类Dev

PDF:如何通过TM和TD计算起始位置

来自分类Dev

R tm软件包和西里尔文字

来自分类Dev

R tm软件包和西里尔文字

来自分类Dev

R:使用grep和tm包的部分匹配字典词

来自分类Dev

Html.Raw()和一个“ TM”字符

来自分类Dev

我是否必须填充tm_gmtoff和tm_zone?并且,我应该使用哪个函数mktime或gmtime在C中获取无时区的datetime?

来自分类Dev

R:使用tm和proxy计算距术语文档矩阵的余弦距离

来自分类Dev

在R中使用LDA和tm进行文本分析

来自分类Dev

OpenCL ATI Mobility Radeon 4500和Intel Core(TM)2 Duo CPU

来自分类Dev

使用tm()挖掘两个和三个单词短语的PDF

来自分类Dev

在R中使用LDA和tm进行文本分析

来自分类Dev

OpenCL ATI Mobility Radeon 4500和Intel Core(TM)2 Duo CPU

来自分类Dev

英特尔品牌名称中的(R)和(TM)是什么意思?

来自分类Dev

函数tm :: tm_map遇到错误

来自分类Dev

填充结构TM

来自分类Dev

OpenJDK 64位服务器VM和Java HotSpot(TM)64位服务器VM

来自分类Dev

解释struct tm中的tm_isdst字段

来自分类Dev

应用tm_map时tm丢失元数据

来自分类Dev

应用tm_map时tm丢失元数据

来自分类Dev

mktime不更新struct tm

Related 相关文章

热门标签

归档