저는 여기에 새로 왔으며 나의 질문은 나의 접근 방식이 합리적인지 여부에 대한 두 번째 의견을 얻고 자하는 자연을 프로그래밍하는 것이 라기보다는 수학적입니다.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
하지만, 나는 천국 ' 용어 사이의 유사점을 감지하는 데 사용되는 코사인이 보이기 때문에 내가 중요한 것을 놓쳤는 지 궁금합니다. 아마도이 방법은 제가 생각하지 못한 방식으로 결함이 있습니다. 그래서 내가 한 일에 대한 어떤 생각이라도 대단히 감사 할 것입니다.
당신이 그걸 멀리 만든다면, 읽어 주셔서 감사합니다 !!
건배
이 질문은 프로그램하는 방법보다는 계산의 이론에 관한 주제이기 때문에 주제가 아닌 것처럼 보입니다. –