[오피니언 마이닝의 개념 ]



수행단계는 긍정, 부정, 중립을 표현하는  단어 정보를 추출하는 단계, 세부 평가 요소와 그것이 가리키는 오피니언의 연결 관계를 포함한 문장을  인식하는 단계, 긍정, 부정, 중립 표현의 수 및 유용한 문장을 추출하여 리뷰 요약을 생성하면  선호도를 분류하는 단계로 되어 있습니다. 이 점을 잘 기억하고 학습을 시작하세요. 



1. 개요


오피니언 마이닝 은 비정형 데이터 마이닝의 유형 중 하나입니다. 오피니언 마이닝은 사람들이 특정 제품 및 서비스를  좋아하거나 싫어하는 이유를 분석하며 어떤 사안에 대해 대중의 관심이나 여론이 실시간으로 어떻게  변하는지 확인합니다. 즉 오피니언의 흐름을 반영하여 주어진 조건과 상황에 따라 그에 맞는 '추천'을  하고자 하는데요. 오피니언 마이닝은 일반적으로 3단계의 의견분류의 과정을 가집니다. 먼저 긍정,  부정, 중립을 표현하는 단어 정보를 추출합니다. 다음으로 세부 평가 요소와 그것이 가리키는  오피니언의 연결 관계를 포함한 문장을 인식합니다. 마지막으로 긍정, 부정, 중립 표현의 수 및 유용한  문장을 추출하여 리뷰 요약을 생성하면 선호도를 분류할 수있습니다. 



2. 수행단계



긍정 및 부정을 표현하는 단어 정보 추출

 의견분류를 하는 세 단계가 즉 오피니언 마이닝의 수행단계가 되는데요. 오피니언 마이닝 각 단계별로  좀 더 자세히 살펴보겠습니다. 먼저 첫번째로 긍정/부정 표현에 해당하는 어휘 정보를 추출하는  단계입니다. 기존에 구축된 사전 등의 리소스를 이용하거나 수작업을 통합니다. 이를 통해 해당  도메인에서 높은 빈도로 긍정/부정을 표현하는 단어들을 확인할 수 있는데요. 아쉽게도 이런 리소스는  영어에 국한되어 있고 한국어에 대해서는 아직 활용할 만한 리소스가 존재하지 않습니다. 또한 학습  데이터에 대한 유용한 통계 정보를 활용하여 긍정 및 부정을 표현하는 어휘 정보를 추출하기도 합니다.  통계 정보를 활용하면 자동으로 어휘 정보를 얻을 수 있는데요. 단, 주어진 특정 도메인에 대해  긍정/부정 표현에 해당하는 단어들을 자동으로 생성하는 것은 쉽지 않습니다. 한국어로 작성한 사용자  별점을 활용하여 긍정 및 부정을 표현하는 단어 정보를 추출할 수도 있는데요. 별점이 아주 높은  리뷰에서는 높은 빈도 즉, 고빈도 단어를 긍정 표현으로 추출합니다. 그리고 사용자 별점이 아주 낮은  리뷰에서는 고빈도 단어를 부정 표현으로 추출할 수 있습니다. 하지만 한국어로 작성된 긍정과 부정에  대한 표현은 자동으로 분석했을 때 정확도는 약 80% 정도록 아주 높지는 않았습니다. 수작업을 최소화  하면서 유용한 어휘별 긍정/부정 감정 정보를 자동으로 생성하는 방법에 대한 연구가 계속 수행되어야  합니다. 



세부 평가요소와 오피니언으로 구성된 문장을 인식

문장을 인식하는 것 또한 무척 중요한데요. 첫 번째 단계에서 구축된 어휘 정보를 사용하여 세부 평가요소와 긍정/부정 표현을  찾게 됩니다. 그리고 규칙기반 방법과 통계기반 방법을 동시에 활용할 수 있습니다. 형용사를 오피니언  단어로 간주하고 긍정/부정을 결정하기 위하여 다양한 규칙 및 통계량을 활용합니다. 문장 단위로  분류하기 위해서 여러가지 방법을 적용할 수 있는데요. 이는 긍정적인 오피니언인지 부정적인  오피니언인지 문장 단위로 분류하기 위함입니다. 그리고 대량의 레이블이 부착된 학습 데이터를  생성하여 다양한 기계학습 알고리즘을 적용하여 학습을 수행합니다.


 규칙기반방법은 사용자에게 개인 신상, 관심 분야, 선호도 등을 질의하여  그 사용자의 정보 프로파일을 획득해 내는 기법입니다. 예를 들어, 우편 번호, 사용하는 컴퓨터의 종류,  취미, 어떤 특정 사항에 대한 선호도 등을 질문하게 되고 이러한 질문들을 통해 그 사람의 프로파일을  획득하게 되는데요. 이러한 정보를 기반으로 고객의 심리 정보와 고객의 선호도 정보에 알맞은 정보 및  상품을 추천 또는 제공하는 방법입니다. 




긍정 부정 표현의 수 및 중요 문장 추출하여 리뷰 요약 생성
마지막으로 긍정/부정 표현의 수 및 중요 문장을 추출하여 리뷰 요약을 생성하는 단계입니다.  각 세부 평가요소에 대한 긍정 표현과 부정 표현의 차를 통하여 사용자들의 선호도를 제시할 수  있는데요. 맛집 리뷰에서 평가요소들을 요약한 표를 그 예로 들 수 있습니다. 특정 맛집의 전체평가,  맛, 서비스, 분위기, 가격, 실재료, 양, 위생, 주차, 대표 메뉴 등 여러 평가요소에 대한 긍정/부정  표현의 비율을 나타냈습니다. 이러한 오피니언 마이닝 결과를 통해 사람들이 맛집의 세부 평가요소에  대하여 좋아하거나 싫어하는 정도를 얻을 수 있습니다. 긍정/부정 표현의 수 및 중요 문장을 추출하여  리뷰 요약을 생성하는 단계는 앞에 제시된 오피니언 마이닝의 결과를 긍정/부정 평가의 정도를 나타낸  것과 요약 형태로 제시될 수 있는데요. 이번에는 세부 평가요소와 관련된 오피니언을 포함하는 문장들  중 유의미한 문장들을 긍정/부정 평가별로 추출하여 중요 문장으로 구성된 리뷰 요약을 생성하는 것에  대해서 살펴보겠습니다. 이 표는 특정 맛집의 평가요소 중 ‘가격’에 대한 리뷰 요약의 예입니다.  긍정 평가와 부정 평가로 나눠 가격에 대한 리뷰를 요약해놨는데요 강조된 텍스트들이 보이시나요?  가격, 만족, 적당, 싼, 비싼, 별로 등등이 있는데요. 강조된 단어는 평가 요소나 오피니언에 속하는  단서 단어들입니다. 리뷰 요약을 할 시에는 사용자들의 리뷰를 대표하면서 유익한 정보를 제공해 줄 수   있어야 하고 읽기 편하고 길지 않아야 합니다. 





[R을 활용한 오피니언 마이닝 수행 ]


1. 텍스트 파일 불러와서 긍정, 부정에 대한 단어 누적하기


R 프로그래밍 언어 패키지 중  twitter R패키지를 이용하여 분석을 해볼 텐데요. 텍스트 파일을 불러와서 긍정, 부정에 대한 단어를  누적하고 이에 대하여 score 부여 및 결과를 보는 것까지 살펴보겠습니다. 


자, 지금부터 힐튼 호텔  평판에 대한 오피니언 마이닝을 수행 하여보겠습니다. 1번 박스 안 언어를 먼저 볼까요?   library(twitteR)라고 되어 있습니다. library는 괄호 안의 파일을 불러오는데요. twitteR을 불러오는  것입니다. twitteR이라는 것은 R 프로그래밍 언어 패키지 중 하나로 twitter API에 접속해서 정보처리를  하는 것입니다. 다음 2번 박스에 hilton.tweets <- searchTwitter("@hilton", n=1500)를 보겠습니다.  우리는 화살표 왼쪽의 함수를 실행해서 얻은 결과를 맨 왼쪽의 변수에 담는다는 것을 알고 있습니다.   

즉, hilton.tweets에는 @hilton을 언급한 내용을 최대 1500개의 message를 가져와서 저장하는 것입니다.  그러나 실제로는 대부분 1500개를 가져오지 못하는데요. 이는 일정시간 동안의 사용량을 접속한 계정인  IP address등으로 파악하여 자동적으로 제한하기 때문입니다. 



텍스트추리기

트위터에서 가져온 텍스트를 추려보겠습니다. 3번 박스를 먼저 보면 library(plyr)라고 되어  있습니다. library는 괄호 안의 파일을 불러오죠. plyr을 불러옵니다. plyr은 데이터를 결합하고 쪼개서  해석 용이한 형태로 만들어 주는 패키지입니다. 즉, 빅데이터를 분석하기 전 분석하기 쉬운 형태로  데이터를 만들기 위한 패키지입니다. 이를 실행하고 hilton.text <- laply(hilton.tweets,  function(t)t$getText())를 입력하면 앞서 hilton을 언급한 내용을 최대 1500개의 message를 가져와서  저장해놓은 hilton.tweet에서 text만을 추출해서 hilton.text에 저장합니다. 추린 텍스트 중에서 이제  긍정 단어와 부정 단어를 찾고 누적해보겠습니다. pos.word=scan("./positive -words.txt",  what="character", comment.char=";“)와 neg.word=scan("./negative-words.txt",what="character",   comment.char=";")는 긍정 단어와 부정 단어에 관련된 영어 관련 파일을 읽어서 pos.word, neg.word에 각각  저장한다는 것입니다. 그리고 pos.words < - c(pos.word,"upgrade") 와 neg.words <- c(neg.word,  "wtf","wait", "waiting","epic fail","mechanical")는 기존 긍정과 부정 단어집에 내용에 따른 별도  정의나 추가 단어를 누적한다는 것입니다. pos.word에 upgrade를, neg.word에 wtf, wait, waiting,  epicfail, mechanical 등을 추가로 누적합니다.  





 2. 긍정 및 부정에 대한 score 부여 및 결과보기


긍정 부정에 대한 score 부여
지금부터는 긍정 단어와 부정 단어들을 이용해서 긍정 및 부정에 대한 score를 부여하는 루틴을  알아보겠습니다. 이는 타이핑을 치지 않고 제공된 파일을 이용해서 직접 loading하여 처리합니다.  7번 박스부터 13번 박스까지 이에 해당하니 참고하세요. 그럼 7번 박스를 보겠습니다. 
score.sentiment   = function(sentences, pos.words, neg.words, .progress='none') 줄 바꿔 {는 score를 부여할 변수와  긍정 단어와 부정 단어들을 할당하고 progress를 표시할 것인지 결정합니다. 이 학습에서는 none으로  하여 표시하지 않도록 합니다. 8번 박스를 보시죠. require(plyr) 줄 바꿔 require(stringr) 줄 바꿔   scores = laply(sentences, function(sentence, pos.words, neg.words) 띄우고 {는 plyr, stringr를  활용하는데요. stringr은 문자를 보다 쉽게 처리하고 작업할 수 있게 해주는 패키지입니다. 긍정,  부정에 따라 score를 변환하도록 합니다. 9번 박스 안의 언어를 보겠습니다. 
sentence =   gsub('[[:punct:]]', '',sentence) 줄 바꿔 sentence = gsub('[[:cntrl:]]', '', sentence) 줄 바꿔  sentence = gsub('\\d+', '', sentence)는 구문점이나 특수기호, 숫자문자열을 빈칸으로 대체하도록  설정합니다. 
그리고 sentence = tolower (sentence) 줄바꿔 word.list = str_split(sentence, '\\s+')줄  바꿔 words = unlist(word.list)는 문장을 단어 리스트로 변환합니다. pos.matches = match(words,  pos.words) 줄 바꿔 neg.matches = match(words, neg.words)는 단어들을 긍정 단어와 부정 단어로  비교하여 개수를 저장합니다. 12번 박스의 언어에서 세번째 네번째 줄을 한 번 볼까요? score =  sum(pos.matches) - sum(neg.matches)는 긍정 단어와 부정 단어 개수의 합을 차감하여 점수를 산출하고  return(score)로 되돌려줍니다. scores.df = data.frame(score=scores, text=sentences) 줄 바꿔  return(scores.df) 줄 바꿔 }는 점수와 문장을 데이터프레임 형태로 되돌려주면 긍정 및 부정에 대한  score 부여가 마무리 해줍니다. 



실행 후 결과
마지막으로 결과 산출을 위해 hist(hilton.scores$score) 실행합니다. 부여한 긍정 및 부정에 대한   score로 히스토그램을 산출합니다. 다음과 같은 히스토그램이 나왔습니다. 여기서 음수는 부정, 0은  중립, 양수는 긍정을 표현합니다. 지금 히스토그램을 보면 빈도수가 가장 높은 것은 0입니다. 하 지만 이는 단어들이 붙어있어 구분을 하지 못해 0으로 처리된 중립이죠. 두 번째로 높은 빈도수를  자랑하는 것이 1이기 때문에 힐튼 호텔 평판에 대한 오피니언 마이닝은 긍정이 더 많음을 알 수  있습니다.