2013-01-10 17 views
1

나는 텍스트 마이닝 (tm 패키지)과 함께 findAssoc()을 사용했지만 내 데이터 세트에서 뭔가 이상하게 보일 수 없음을 깨달았습니다.tm :: findAssocs의 수학 함수는 어떻게 작동합니까?

내 데이터 세트는 1500 개의 열린 응답으로 csv 파일의 한 열에 저장됩니다. 그래서이 데이터 집합을 호출하여 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로 구성됩니다. (데이터가 CSV 파일의 행에 저장 되었기 때문에?)

Q2. 대상 용어 like이 한 번 나타나면 cousinfill이 한 번 나타나지만 점수는 이와 같이 다릅니다. 그들은 같지 않아야합니까?

나는 findAssoc()의 수학을 찾고 있지만 아직 성공하지는 못했습니다. 어떤 조언을 매우 높이 평가됩니다!

+0

에는 "textmining"패키지 크랑에 없다 5.

참조하십시오

. 사용한 library() 또는 require() 호출을 포함하십시오. –

+0

@Dwin - 패키지 'tm'에있는 것 같습니다 - http://www.inside-r.org/packages/cran/tm/docs/findAssocs – thelatemail

+0

@thelatemail - 편집 해 주셔서 감사합니다! – user1486507

답변

6
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> 
0

귀하의 dtm은 관측치의 고유 단어 수 (정지 단어 및 숫자 제외)이기 때문에 1689 개의 변수가 있습니다. 아마도 "like"라는 단어가 1500 건의 관찰 중 하나 이상에 나타나고 항상 "사촌"과 "채우기"가 수반되는 것은 아닙니다. "좋아요"가 몇 번이나 나타나는지 세 었습니까?

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이 충분히 크면이 기능을 사용하여 메모리 할당에 대한 오류를 얻을 수 있습니다.

3

아무도 귀하의 최종 질문에 답변하지 않았다고 생각합니다.

나는 findAssoc()의 수학을 찾으려고하지만 아직 성공하지 못했습니다. 모든 조언을 매우 높이 평가됩니다!

findAssoc()의 수학은 R의 통계 패키지에서 표준 함수 cor()을 기반으로합니다. 두 개의 숫자 벡터가 주어지면 cor()는 표준 편차로 나눈 공분산을 계산합니다.

findAssocs (dtm, "word1", 0)가 x 값을 갖는 "word2"를 리턴하도록 "word1"및 "word2"라는 용어를 포함하는 DocumentTermMatrix dtm이 주어지면 "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도 http://r.789695.n4.nabble.com/findAssocs-tt3845751.html#a4637248

관련 문제