2014-01-25 4 views
4

저는 여기에 새로 왔으며 나의 질문은 나의 접근 방식이 합리적인지 여부에 대한 두 번째 의견을 얻고 자하는 자연을 프로그래밍하는 것이 라기보다는 수학적입니다.tm.package : findAssocs vs Cosine

tm 패키지의 findAssocs 함수를 사용하여 내 컴퓨터에서 단어 간의 연결을 찾으려고했습니다. New York Times와 US Congress와 같이 패키지를 통해 사용할 수있는 데이터에 대해 합리적으로 잘 수행하는 것처럼 보이지만 필자는 자신의 실적이 저조한 데이터 세트에 실망했다. 그것은 희귀 한 문서에 의해 왜곡되는 경향이있는 것으로 보인다. 나는 코사인 척도가 문학과 관련하여 더 나은 그림을 제공한다는 것을 발견했다. 비록 문학에 기반을두고 있지만, 용어보다는 문서의 유사성을 측정하는 용도로만 쓰이는 경향이있다.

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) 

의 우리가 "정부"와 "사이의 관계를 조사 할 관심이 있다고 가정 해 봅시다 ...

첫째, 내가 모든 것을 설정합니다 :의가 무슨 뜻인지 보여 RTextTools 패키지에서 USCongress 데이터를 사용하자 외국인 "이제

# 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 

의에 포함 된 다른 문서를 추가 할 수는"

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 
외국 정부는 "50 회 반복

이제 보시다시피, 그것은 다른 이야기이며 모두 하나의 문서로 나옵니다.

여기 나는 틀린 뭔가를하고 싶습니다. 코사인을 사용하여 문서 공간에 앉아있는 용어 간의 유사성을 찾습니다. 이 방법은 용어보다는 문서 간의 유사성을 찾는 데 사용되는 경향이 있지만 단어 간의 유사성을 찾는 데 사용할 수없는 이유는 없습니다. 전통적인 의미에서 문서는 벡터이고 용어는 축이며 우리는 이들 문서 간의 각도에 따라 유사점을 감지 할 수 있습니다. 그러나 용어 문서 행렬은 문서 용어 행렬의 전치이며 마찬가지로 문서 공간에서 용어를 투영 할 수 있습니다. 즉, 문서를 축과 용어로 사용하여 각도를 측정 할 수있는 벡터를 만들 수 있습니다. 그것은 단순한 상관 관계와 같은 결점을하지 않는 것 :보다

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

기타, 2 개 조치가 매우 유사하게 나타납니다 놀랍게도

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 

하지만, 나는 천국 ' 용어 사이의 유사점을 감지하는 데 사용되는 코사인이 보이기 때문에 내가 중요한 것을 놓쳤는 지 궁금합니다. 아마도이 방법은 제가 생각하지 못한 방식으로 결함이 있습니다. 그래서 내가 한 일에 대한 어떤 생각이라도 대단히 감사 할 것입니다.

당신이 그걸 멀리 만든다면, 읽어 주셔서 감사합니다 !!

건배

+1

이 질문은 프로그램하는 방법보다는 계산의 이론에 관한 주제이기 때문에 주제가 아닌 것처럼 보입니다. –

답변

2

귀하의 질문 (내가 생각하는 스택 교환에 있어야합니다)을 이해합니다. 나는이 문제가 findAssocs의 거리라는 유클리드 측정을 사용하고 있다고 생각한다. 따라서 단순히 단어가 두 배인 문서는 이상치가되어 거리 측정에서 많이 다른 것으로 간주됩니다.
문서에 대한 척도로 코사인을 사용하는 것은 널리 사용되므로 용어도 괜찮습니다. 나는 코사인에 의한 문서 클러스터링을위한 skmeans 패키지를 좋아한다.구형 K-Means는 TDM을 직접 받아들이며 단위 길이로 코사인 거리를 계산합니다.

video ~ 11m는 이미 알지 못하는 경우를 대비하여 보여줍니다. 희망이 조금 도움이되었습니다 ... 결국 코사인을 받아 들일 수 있다고 생각합니다.

+0

대단히 고마워! 'skmeans'는 재미있을 것 같고, 시도해야합니다. – IVR