트위터 팔로워들의 자기소개 분석을 이용한 나

최근 rjson이 업데이트 되었는데, 정말 기다리고 기다리던 CJK 인코딩 문제가 해결되었다. 그래서 이것을 활용하는 twitteR 패키지에서 이젠 정상적으로 한글이 나오게 되었다.  이 패키지를 활용하면 트위터 팔로워들 그리고 내가 팔로잉 하는 사람들의 정보를 가져와서 분석할 수 있고, 이 밖에도 그들 각자의 트위터 문장을 분석할 수 있다.

비로소 KoNLP가 가장 많이 활용될 수 있는 패키지가 이제 정상화 된 것으로 볼 수 있다.

이것을 가지고 간단하게 나를 팔로잉하는 사람들의 자기소개를 분석해서 어떤 사람들이 나를 팔로잉하는지 확인해보고 이를 기반으로 내가 어떤 성격의 트윗을 주로 날렸는지 간접적으로 유추해 볼 수 있을 것이다. 한마디로 내가 한 말들로 인해 어떤 사람들이 나를 팔로윙 하는지 알아보자는 것이다.

 

코드는 아래와 같다.

library(twitteR)
library(KoNLP)
library(wordcloud)
library(tm)

# gogamza <- userTimeline(user="gogamza", n=1000)
#
# gogamzatw <- c()
# for(i in 1:length(gogamza)){
#   gogamzatw <- append(gogamzatw, gogamza[[i]]$text)
# }
#
# gogamzaNoun <- sapply(gogamzatw, extractNoun,USE.NAMES=F)
#
# gogamza.corpus <- Corpus(VectorSource(gogamzaNoun))
#
# control <- list(stopwords=T, removePunctuation = T, removeNumbers=T, minDocFreq=2)
# tw.tdm <- TermDocumentMatrix(gogamza.corpus, control)


gogamza <- getUser("gogamza")
#gogamza.friends <- gogamza$getFriends()
#gogamza.friendsID <- gogamza$getFriendIDs()
gogamza.followers <- gogamza$getFollowers()


#팔로워들의 자기 소개를 벡터에 적재 한다.
followerDesc <- c()

for(i in gogamza.followers){
  followerDesc <- append(followerDesc, i$description)
}


#쓸모없는 문자들을 제거한다.
followerDesc <- gsub("\n","", followerDesc)
followerDesc <- gsub("\r", "", followerDesc)


nouns <- Map(extractNoun, followerDesc)

wordsvec <- unlist(nouns, use.name=F)
#쓸모없는 문자들을 제거한다. 특히 영문자의 경우 tm의 stopwords를 활용한다.
wordsvec <- wordsvec[-which(wordsvec %in% stopwords("english"))]
wordsvec <- gsub("[[:punct:]]","", wordsvec)
wordsvec <- Filter(function(x){nchar(x)>=2}, wordsvec)

wordcount <- table(wordsvec)
pal <- brewer.pal(8,"Dark2")


wordcloud(names(wordcount),freq=wordcount,scale=c(4,0.5),min.freq=10,
          random.order=T,rot.per=.1,colors=pal)

 

 

이렇게 나온 워드 클라우드는 아래와 같다.

 

image

 

나를 팔로잉 하는 분들이 내가 트위터에서 어떤 의미인지 해석해 보자면,

“IT개발자이며 정보나 웹, data에 관심있는 엔지니어…”

맞는 이야기다…쩝

나 말고 정말 많은 팔로워들이 있는 @gaiaville 님의 경우 아래와 같다.

image

CEO란 단어도 있고, 소셜 그리고 엔지니어 SNS, 자바, 데이터, 검색 등등이 있다.

물론 이 그림을 보고 해석은 각자 나름대로 할 수 있을 것이다.

 

혹여나 트위터에서 어떤 사람의 성향을 바로 알고자 한다면, 위 코드에서 상대방 아이디만 넣어보면 대략 알 수 있지 않을까 한다. 원작자로서 다만 타인의 뒤를 캐는데 코드가 활용되지 않길 바랄 뿐이다.  ㅋ  

굉장히 유명한 트위터러에 대한 정보를 알고자 한다면 팔로워들을 분석하기 보다는 트위터러의 엑티브한 행동의 결과인 트위터러가 팔로잉하는 사람들의 자기소개를 분석해 보는게 더 효과적일지도 모르겠다.

0 0 votes
Article Rating
Subscribe
Notify of
guest

26 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
sakong1985

먼저 좋은 포스팅해주셔서 잘 읽었습니다.
직접 R에서 패키지를 설치하고 위의 쿼리를 실행하니 오류가 발생하네요..
오류내용은 다음과 같습니다.
———————————————————————————– 
nouns <- Map(extractNoun, followerDesc)다음에 오류.jnew("HannanumInterface") :   java.lang.UnsupportedClassVersionError: Bad version number in .class file

확인 부탁드립니다^^

gogamza

자바 vm 버전 문제입니다.제가 컴파일을 v1.7에서 1.5까지 호환성을 가지게끔 컴파일 했는데 혹시 vm 버전이 무었인지 알려주시면 큰 도움이 될수 있을거 같습니다. —
Sent from my Android phone with K-9 Mail. Please excuse my brevity.

sakong1985

현재 확인해보니 1.5.0_12 입니다.

gogamza

이 문제는 일단 vm을 새 버전으로 업데이트 하시면 해결됩니다만 제가 1.5부터 되는걸로 알고있었던건데 큰 문제점을 알려주셨네요. 일단 업데이트 항목에 넣겠습니다.
감사합니다.

Sent from my Android phone with K-9 Mail. Please excuse my brevity.

gogamza

혹시 KoNLP는 새버전으로 설치하셨나요?

Sakong1985

네~링크에서 다운 받아서 업데이트 하였습니다..
이번에는 새로운 문제가 발생하네요…
gogamza <- getUser("gogamza")다음에 오류.self$twFromJSON(out) :   Error: Rate limit exceeded. Clients may not make more than 150 requests per hour.

이것도 확인부탁드립니다..ㅠㅠ

gogamza

이건 twitteR에서 너무 많은 리퀘스트를 날려서 트위터 내에서 블록을 한겁니다. 아마도 어제 올린 예제 때문에 많은 유저가 리퀘스트를 날려서 그런듯 합니다. ^^;

따로 개인 계정을 만들어 API를 사용하시는걸 추천합니다.

이것에 대해서는 http://cran.r-project.org/web/packages/twitteR/vignettes/twitteR.pdf
의 Authentication with OAuth에 잘 나와 있습니다.

2012년 4월 2일 오전 11:45, Disqus 님의 말:

Sakong1985

아~이제 잘 되네요^^

사용자가 많았나 봅니다~

좋은 자료 공유 감사합니다..

다시 한 번 R의 능력에 감탄합니다..

gogamza

잘 되셨다니 다행입니다.
한가지만 확인해 주실수 있나요?
extractNoun 문제 어떻게 해결하셨나요? KoNLP버전업을하셨는지 아니면 자바vm 업그레이드를 하셔서 해결하셨는지요? —
Sent from my Android phone with K-9 Mail. Please excuse my brevity.

Sakong1985

제 생각에는 KoNLP 업그레이드가 우선인듯하구요..그래도 오류가 나신다면 자바 vm 업그레이드를 하는게 나을듯 싶습니다. 허나..지금은 사용자들의 리퀘스트가 많아서 수시로 에러가 발생하는게 가장 큰 문제인듯합니다..ㅠㅠ

gogamza

네 감사합니다.

KoNLP 업그레이드 이후에 문제가 없어졌다는거네요.

KoNLP v0.7에 vm 1.5 지원을 하게끔 컴파일을 했었거든요. 아마도 그 때문인듯 합니다.

답변 감사드립니다.

2012년 4월 2일 오후 4:11, Disqus 님의 말:

dlthks

안녕하세요! 트위터 분석에 관심있어 궁금한게 많습니다!
1. 패키지 설치후
library(KoNLP) 실행
자바도 설치했는데 , 이런오류가 떴습니다.. 

Java initialized.

Error : .onLoad failed in loadNamespace() for ‘KoNLP’, details:
call: .jinit(parameters = c(“-Dfile.encoding=UTF-8”, “-Xmx512m”))
error: Cannot create Java virtual machine (-1)
에러:’‘KoNLP’’ 에 대한 패키지/네임스페이스 로드가 실패했습니다 

2. twitter 말고 facebook api 도 R 안에서 분석이 가능할까요?

gogamza

말씀하신 에러는 JVM  힙 메모리 512mb를 확보하지 못해서 나는 에러입니다. 사실 권장으로는 1GB메모리를 확보하게끔하고 그걸 확보하지 못했을 경우 512MB를 확보하게 해놓았는데, 512MB의 메모리도 가용하지 않은 상태이신거 같네요.  

현재 시스템에 가용한 메모리를 먼저 확인하시고, 실행을 하시기 바랍니다. 

2번 facebook api를 저도 시도해 보지 못했습니다. 

감사합니다. 

dlthks

아 정말 감사합니다! 저 오류는 메모리문제 말고 다른문제는 없는건가요?할당된 메모리가 1GB 가 넘는데도 저 오류가 떴습니다.
자바 WINDOWS 용 설치 , R-2.15 번젼입니다

gogamza

 OS 메모리 단편이 나서 한꺼번에 메모리를 잡지 못할 경우도 있고, 여러 이슈가 있을 수 있습니다.

그리고 KoNLP는 여태 많은 분들이 사용하셨으며, 이 부분에서는 메모리 문제 말고 다른 이슈는 알려진바 없습니다. 

dlthks

감사합니다! 아직 학생이라서 R을 더 공부하고싶습니다! R 은 정말 끝이 없는것같습니다. 감사합니다!

Hjcheon

포스팅 잘 보았습니다. 아니 사실 예전에 봤는데 최근에 다시 봤습니다.
이 코드를 사용해서 트위터 검색을 통해 검색어와 관련된 워드클라우드도 할 수 있겠다 싶어 함 해봤는데…잘 안됩니다. 코드는 http://pastebin.com/hz4ZKW48 이며, 에러는 http://pastebin.com/SKcH8MRc 입니다.
워낙 짧은 지식이라 잘 모르겠으나 띄어쓰기를 안한 긴 문장에서 에러가 나는듯 합니다.
그래서 gsub로 좀 해결해 볼라 했으나 잘 안되네요…함 확인 부탁드립니다.
항상 행복하세요~

Hjcheon

검색결과 수를 줄이고 운이 좋으면 가끔 되네요…띄어쓰기가 문제인듯….

gogamza

말씀 주신 문제는 띄어쓰기가 맞습니다. 관련 fix가 현재 개발 완료 되었으나, CRAN에 윈도 버전이 올라가지 않았습니다. 아마도 윈도 시스템을 쓰시는거 같네요. 

만일 윈도가 아니라면 업데이트 하고 실행하시면 잘 동작을 할걸로 예상하구요. 

만일 윈도 버전이 아니라시면 아래 링크에서 github 개발 버전을 설치하고 하셔도 됩니다. 

https://github.com/haven-jeon/KoNLP 

설치 방법은 위 링크에 포함되어 있습니다.

감사합니다.

Hjcheon

감사합니다. 리눅스에서 해보니 잘됩니다.
소스 : http://pastebin.com/dnsKxp1S
결과 : http://i49.tinypic.com/28qryiw.jpg
좀 더 잘 해보고 싶은데 실력이 못받쳐주네요…T T
훌륭한 패키지 공개해주셔서 감사합니다.

gogamza

서치 키워드를 가지고 분석 하셨군요.
재밋는 결과네요… 

저도 잘 봤습니다. 

박영석

wordcloud 폰트는 변경 안되나요?

gogamza

다른 plot 명령어는 특정 변수가 base plot 함수까지 넘어가기 때문에 변경이 될겁니다.

다른 플롯에서도 폰트 변경 경험이 있으나 이 부분은 직접 한번 시도해보시는게 좋을거 같네요.

2012/9/13 Disqus

박영석

wordcloud함수가 다른 플롯에서도 적용이 가능한가요? 혹시 적용 가능한 예가 있으면 알려주시기 부탁드립니다.

Sensation9

gogamza <- getUser("gogamza")다음에 오류.self$twFromJSON(out) :   Error: Rate limit exceeded. Clients may not make more than 150 requests per hour.
이 부분에 대해서 참고 하라고 하신 내요이 있는데 전 초보라 그런지 잘 안되네요…좀더 상세한 설명좀 부탁드려도 될까요? ㅠㅠ

gogamza

메일로 답변 보내드렸습니다.