본문 바로가기
루모의 일상사

[감성 분석] 2. TF-IDF, Text Classification (작성중)

by xenophilius 2018.02.12


1. TF-IDF, 키워드 결정하기


일단 분석 할 뉴스를 긁어 모으긴 했습니다만 어떻게 하면 좋을까요? 예를들어 '검찰'라는 키워드에 대해서 어떤 감성이 나타나는지 알아보고 싶다고 생각 해 봅시다. 그렇다면 '검찰'에 대해서 말하고 있는 뉴스 기사들을 먼저 골라내고, 기사 본문을 보면서 긍정적인지 또는 부정적인지 알아내야 하겠지요. 첫단계는 '검찰'을 주제로 하는 기사를 찾는 것 부터 시작하겠습니다.


저는 처음에 수집한 문서마다 키워드를 부여해서 데이터베이스에 저장하도록 했습니다. 예를들면 아래의 단계를 보면....


1 원문 기사 제목

[단독] 檢, MB청와대도 국정원 특활비로 여론조사 정황 포착 

2 한자 치환

 검찰, 이명박 청와대도 국정원 특활비로 여론조사 정황 포착

3 형태소 분리

 [검찰, 이명박, 청와대, 국정원, 특활비, 여론조사, 정황, 포착]

 4. 키워드 결정

 [이명박, 검찰, 특활비]



2단계의 한자 치환에 관련해서는 아래에서 더 자세히 설명할게요.



이런 같은 과정으로 키워드를 결정 합니다. 제목에 주제와 관련된 내용이 있을 확률이 높으니까요. 위의 경우 검찰, 이명박, 청와대 등이 기사의 주제로 결정 된 것입니다. 그렇다면 나중에 '검찰'에 대한 키워드로 검색 했을 때 이 기사는 포함이 되겠군요. 결론적으로 뉴스 기사를 주제별로 클러스터링 하면 좋겠습니다만 그러기엔 시간도 부족하고 글에서 다루기엔 내용이 너무 많습니다. 뉴스 기사 클러스터링에 관해서는 좋은 글들이 많으니 다른 글들을 참고하면 좋겠습니다. 



1.1 
인문적 표현


헤드라인에서 주제를 찾기가 어려워지는 이유는 “우리가 한물 간 세대라고?”와 같은 주제를 명확하게 하지 않는 인문학적 표현에 있습니다. 내용을 읽어보면 인구 고령화에 대해 다루는 주제지만 제목만 봐서는 확실하게 알기 어렵습니다. 명확하지 않은 제목을 제가 했던 방식대로 토크나이징 하면 대략 '우리', '한물', '세대' 이렇게 세가지 정도로 키워드가 결정 될 것입니다. 인구 고령화에 대한 내용의 기사인데 이것은 전혀 맞지가 않죠. 


제목은 키워드를 추출하는데 있어서 정말 정말 좋은 재료지만 제목만 가지고는 역부족입니다. 그러니 TF-IDF로 키워드를 추출 할 때는 먼저 본문을 통해서 추출 한 다음 다시 또 제목에서 추출한 키워드들과 비교하는 방식이 좋다고 생각합니다. 앞으로 이 글에서 설명하는 TF-IDF 키워드 추출은 본문과 제목을 이용 했다고 생각하시면 되겠습니다.


또 TextRank를 사용하여 기사 내용으로 부터 키워드를 추출하면 이런 인문적 표현을 하는 기사에 대해서는 TF-IDF 방식보다 조금 더 나은 성능을 보이더군요. 일단은 TF-IDF에 대한 설명을 계속 이어나가겠습니다.



인문적 표현으로 쓴 기사 제목은 TextRank가 TF-IDF보다 키워드 추출에서 좀 더 유리했다.

TF-IDF는 결국 DF 값이 필요합니다. DF는 '모든 문서에 걸쳐 이 단어가 등장 한 횟수'라는 의미고 결국 모든 문서를 다 살펴본다는 거죠. 그러나 TextRank 알고리즘은 자기 말고 다른 문서들을 살펴 볼 필요가 없습니다. 그래서 인문적으로 표현한 기사 제목에 대해서 아무래도 TF-IDF보다 조금 더 유리한 면이 있습니다. TF-IDF는 다른 문서들의 TF 값에 영향을 받지만 TextRank는 그렇지 않으니까요. 직접 두 알고리즘을 테스트 해 보니 TextRank가 약간 더 나아보이더군요. 역시 이 평가 방법도 그냥 제 기준입니다 ㅋ.ㅋ 정답은 없습니다.


TF-IDF는 문서 내의 어떤 단어의 중요도를 의미합니다. 어떤 단어 두 개가 있고 각각 TF-IDF가 10, 5라면 5보다 10이 더 중요한 단어라는 의미가 됩니다. 결국 어떤 문서의 핵심 단어를 추출하는 용도로 사용됩니다. 


예를들어 '코코아'가 주제인 문서를 찾겠다고 가정하겠습니다. 그러면 ‘코코아’라는 단어가 많이 등장한 문서를 고르면 되지 않을까요? 코코아에 대해 말하는 기사라면 아무래도 본문에 '코코아'를 많이 언급 할 테니까요. 그럼 5개의 문서가 있다고 가정하고 이 중에서 '코코아'를 주제로 하는 문서를 찾아내 보도록 합시다.




<그림1>



일단 '코코아'가 가장 많이 언급 된 문서는 '문서D' 입니다. 35번이나 언급 됐네요. TF란 Term Frequency라는 의미로 Term이 등장한 횟수를 말합니다. 문서 D에서 코코아의 TF는 35입니다.


그렇다면 ‘ 날씨’를 키워드로 하는 문서를 찾고 싶다면? ‘코코아’ 처럼 단지 ‘ 날씨’가 많이 등장하는 문서를 고르면 될까요? 그렇지는 않을 것 같습니다. ‘날씨’는 어떤 문서에서나 흔하게 등장 할 법한 단어니까요. (그냥 그렇다 칩시다.) 대부분의 문서에서 '날씨'가 등장 할 겁니다. 그래서 전체 문서를 다 훑어보고 '날씨'라는 단어 전체 문서에서 가지는 희소성이 어느정도인지 알아 볼 필요가 있습니다. 모든 문서에서 '날씨'라는 단어가 등장한다면 '날씨'는 별로 특별한 단어가 아닌 것입니다. 



<그림 2>



DF는 전체 문서를 다 둘러보고 그 중에서 키워드가 등장하는 문서가 몇개 있는지 나타내는 수치입니다. 위 그림을 보면 '코코아'의 경우 DF가 3이라고 할 수 있겠네요. '사람'이라는 키워드는 딱 한 건의 문서에서만 등장하고 있고요. 날씨는 모든 문서에서 등장하고 있네요. 그래서 '날씨'는 흔한 단어인 것입니다. 


아주 간단하게 TF-IDF의 공식을 나타내면 아래와 같습니다. IDF는 DF를 거꾸로 한 것이니까요.


TF-IDF = TF * (1 / DF)

TF-IDF = TF / DF


이제는 문서A에서 코코아의 TF-IDF 값을 한 번 구해 보겠습니다. <그림1>에서 문서A를 보니 코코아의 TF는 30이네요. 문서A에서 코코아가 30번 등장 했다는 의미 입니다. <그림2>에서 코코아의 DF는 3입니다. 문서 A, C, D에서만 코코아가 등장하고 있네요. 따라서 문서A에서 '코코아'의 TF-IDF 값은 30 / 3 입니다. 10이네요. 이런식으로 문서A에서 등장하는 모든 단어에 대해서 TF-IDF 값을 계산해 보고 가장 높은 것들 몇개를 고르면 되겠죠.



TF-IDF는 간단하게 구현이 가능합니다. 문서를 토크나이징 해서 각 단어마다 TF 값을 알아 내면 땡입니다. 그러나 IDF의 경우에는 모든 문서를 다 훑고나서야 알 수 있는 값입니다. 무슨 말이냐 하면, TF는 한 문서 내에서 어떤 단어가 나타난 빈도를 의미하므로 한 문서에 대해서만 토크나이징을 하면 되지만 DF는 '몇개의 문서에서' 이 단어가 등장 했느냐를 의미하므로 모든 문서를 다 살펴야 합니다. 아래의 코드를 보면서 또 설명을 해 볼게요.




TF

 private int term_frequency(News document, String keyword) {
        int tf = 0;
        
        Seq tokens = OpenKoreanTextProcessorJava.tokenize(document.getText());
        List tokenList = OpenKoreanTextProcessorJava.tokensToJavaKoreanTokenList(tokens);

        for (KoreanTokenJava t : tokenList) {
            if (t.toString().contains("Noun") && t.getText().compareTo(keyword) == 0) {
                tf++;
            }
        }

        return tf;
}


주목 할 부분은 반복문입니다. 그냥 단순하게 파라미터로 주어진 keyword와 일치하면 tf++ 하고 tf값을 반환합니다. 예를들어 '날씨'라는 단어의 tf 값을 알고 싶다면 term_frequenct(뉴스12, "날씨")라고 했을 때 뉴스 12번 문서에서 "날씨"라는 키워드가 몇번 등장했는지 알 수 있는 것 입니다.




DF

private double document_frequency(List documentList, String keyword) {
        int df = 1;

        Seq tokens;
        List tokenList;

        for (News n : documentList) {
            tokens = OpenKoreanTextProcessorJava.tokenize(n.getText());
            tokenList = OpenKoreanTextProcessorJava.tokensToJavaKoreanTokenList(tokens);

            for (KoreanTokenJava t : tokenList) {
                if (t.toString().contains("Noun") && t.getText().compareTo(keyword) == 0) {
                    df++;
                    break;
                }
            }
        }

        return df / documentList.size();
}


여기서 주목 할 부분은 함수 파라미터로 documentList가 주어 졌다는 점입니다. 위의 tf를 구하는 함수는 하나의 document만 줬지만 df는 documentList를 받고 있습니다. 그도 그럴것이 df는 '모든 문서 중 어떤 단어가 등장한 횟수' 이므로 모든 문서를 살펴 봐야겠죠. 그래서 tf보다는 당연히 시간이 더 오래 걸릴 수 밖에 없는 작업입니다.





TF-IDF

private double tf_idf() {
        return term_frequency() / document_frequency();
}


이제는 간단합니다. tf와 df를 구하는 코드를 작성했으니 tf_idf 함수는 단순히 tf / df를 return하면 됩니다.




키워드를 분석 해 본 결과는 아래와 같습니다. TF-IDF 수치가 높은 상위 4개의 키워드를 골랐습니다. 키워드를 추출하는데에는 기사 제목만을 사용하지 않고 기사 본문도 사용했습니다.


뉴스 제목

 이영학 1심 사형 선고…"정의의 이름으로 영원히 격리"

 안전진단 막힌 재건축 5곳중 4곳 비강남…강남만 키운다

美 통상압박 시각차…與 "안보와 별개" vs 野 "동맹 균열" 

TF-IDF

이영학, 2.995732273553991

 강남, 4.127134385045092

 미국, 2.797281334830153

 TF-IDF 

 딸, 2.718121703031321

 재건축, 2.860270868800483

 안보, 1.8885939631132513

TF-IDF

 혐의, 1.440023395335774

 아파트, 2.355517186070986

정부, 1.4961070964471255 

TF-IDF

 피해자, 1.3770361751570304

안전, 2.292852436136162 

트럼프, 1.259062642075501


비교적 높은 TF-IDF 수치를 가진 단어들이 문서를 대표하고는 있습니다. 




TextRank


앞서 TF-IDF를 통해서 뉴스 본문과 제목을 통해 키워드를 추출 해 보았습니다. 




4. 감성 사전 준비하기


한국어 감성 사전은 '오픈한글'이라고 하는 과거 연세대 교수님들이 운영하는 OpenAPI 사이트도 있었고 활발하게 연구가 이루어지는 듯 했으나 어느날 갑자기 폐쇄 되었더군요. 이유는 알 수 없지만 안타까운 일입니다. 홈페이지에 가면 아래와 같이 공지사항이... 


그동안 오픈한글에 관심을 가져주셔서 감사합니다.
한글 자연어처리에 대한 연구와 실무에 보탬이 되고자 시작되었는데, 오픈서비스의 한계적인 문제점으로 인해 오픈한글은 API 서비스를 공식적으로 잠정 중단합니다.


http://openhangul.com/ (지금은 폐쇄됨)


어쩔 수 없습니다. 딴거 찾아 써야죠. 아래는 서울대학교 언어학과, 컴퓨터언어학 연구실에서 만든 한글 감성어 사전입니다. 홈페이지에 가 보면 이 데이터는 연구목적으로만 사용 될 수 있다고 나와 있군요. 사용하기 전에 연구실 메일로 사용 동의서를 작성해서 보내달라는 문구가 있습니다. 아래의 링크로 들어가서 다운로드 받을 수 있습니다.


http://word.snu.ac.kr/kosac/lexicon.php 

(이제 접속이 안 되네요. 여기 올려 둡니다.)

polarity.csv


논문을 살펴보면 수백개의 뉴스 기사를 데이터로 사용했다고 합니다.


코퍼스 구축을 위한 텍스트는 세종 구문 분석 코퍼스 중에서 조선 일보 생활, 사회면과 한국일보 한겨레 신문에서 332개 기사, 7744 문장을 선정하여 주석하였다. 구문 분석 코퍼스를 선택한 이유는 주석된 감정 표현 패턴의 구문 정보가 자동 감정 분석 시스템의 구축에 유용하게 사용될 수 있기 때문이다.


KOSAC(Korean Sentiment Analysis Corpus): 한국어 감 정 및 의견 분석 코퍼스


파일을 다운로드 받고 polarity.csv 파일을 열어보면 아래와 같습니다. '강화하다.'라는 동사는 0.33의 부정과 0.66의 긍정을 가지고 있네요. '강화'라는 면사는 부정이 0.25, 긍정이 0.75군요. 



그나마 지금 무료로 사용 할 수 있는 한국어 감성어 사전은 이게 유일 한 것 같습니다. 기타 블로그에서 개인적으로 감성어 사전을 구축하려고 노력하는 사이트들 몇개를 봤습니다만 진행도는 거의 0에 가깝더군요. 앞으로 이런 연구가 더 활발하게 진행 됐으면 좋겠습니다.



3. 한글 형태소 분리 라이브러리


수집한 기사들의 본문을 형태소 단위로 분리해야 감성 사전과 비교해 볼 수 있을 것입니다. 

 

문장을 형태소 단위로 분리 할 수 있는 라이브러리는 아주 많이 있습니다만 저는 Open-Korean-Text 라이브러리를 사용하기로 했습니다. Normalizing 기능이 마음에 들었습니다. 사실 이 Normalizing은 KoNLPy에도 포함되어 있습니다.


꼬꼬마 형태소 분석기 : 서울대학교 IDS 연구실에서 진행중인 과제입니다. JAVA로 작성 되었습니다.

http://kkma.snu.ac.kr/


KoNLPy : 파이썬으로 작성 되었습니다.

http://konlpy.org/ko/latest/


Open-Korean-Text

https://github.com/open-korean-text/open-korean-text


4. 한자 치환과 전처리


TF-IDF를 적용 했다고는 하나 마냥 그렇게 분석 해서만은 안됩니다. 먼저 데이터를 가공 해 주어야 합니다. 먼저 우리가 ‘북한’이라는 키워드에 대해서 검색을 한다고 가정하겠습니다. 오로지 ‘북한’이라는 키워드가 포함된 문서만 가져와선 안 될 것입니다. 우리는 뉴스라는 매체의 특징을 간과해선 안됩니다. 뉴스는 간단하고 명료하며 빠르게 정보를 전달 할 수 있는 제목을 선호합니다. 그래서 굳이 북한을 ‘북한’이라고 하지 않고 의미가 함축된 한자어로 표기하는 경우가 많습니다. 평소 뉴스를 본다면 당연히 알 수 있는 사실입니다. 


[뉴스분석] 초대장에 남북관계 새 전기…정상회담까진 난제 산적  



북한 뿐만이 아닙니다. 청와대, 법원, 검찰과 같은 기관이나 '문재인', '박근혜'등 주요 인물들도 한자어로 요약 표현합니다. 그냥 형태소 단위로 분리하다가 '한자'가 나오면 비교해서 치환하면 되지 않을까요? 간단하게 아래처럼 테이블을 만들어서요.


한자 

의미 

박근혜 

淸 

청와대 

劍 

검찰청 

북한 

獨 

독일 


뉴스 기사에 쓰이는 한자어가 그렇게 많지는 않으니 아마 테이블을 만드는 것 만으로도 충분할 겁니다. 


치환 전 

치환 후 

 [단독] MB청와대도 국정원 특활비로 여론조사 정황 포착 

[단독] 검찰, 이명박 청와대도 국정원 특활비로 여론조사 정황포착 

 권성동 "의원 무슨 힘 있냐…안미현 검사 법적조치 취할것" 

 권성동 “야당의원 무슨 힘 있냐…안미현 검사 법적조치 취할것"  

 [뉴스분석]  금리인상 공포… 글로벌 자산 거품 빠지나  

[뉴스분석] 미국 금리인상 공포… 글로벌 자산 거품 빠지나


한가지 재미있는 점은 이명박 전 대통령은 李가 아니라 MB로 통한다는 것 입니다 ㅋㅋ. 또, 과거 김영삼, 김대중 전 대통령도 각각 YS, DJ로 통합니다. 이런 영어 이니셜도 치환 해 줄 필요가 있습니다. 


저는 그냥 테이블을 만들어서 인물이나 국가명과 단순히 바꾸도록 구현했습니다. 그러나 조금 더 생각 해 보면 朴이 언제나 박근혜 전 대통령을 표현하지는 않습니다. 시대에 따라, 또는 기사의 내용에 따라 朴은 얼마든지 달라 질 수 있습니다. 박씨 성을 가진 사람이라면 그 누구든지 될 수도 있지요. 이것을 어떻게 구분해 낼 것인지에 대한 것은 조금 더 생각을 해 봐야 할 것 같습니다. 아직까지는 뉴스 기사에 쓰이는 한자어가 아주 많지는 않으므로 테이블 정도면 괜찮을 것 같습니다.



5. 감성 분석 시작


자 이제 준비물들이 갖춰 졌으니 어떻게 분석하면 좋을지 생각 해 봅시다. 일단 단순하게 뉴스의 본문 속에서 얼마나 많은 긍정, 부정 단어가 출현 했는지 세어 보는 방식으로 해 보겠습니다. 예를들면 아래와 같은 문서가 있다고합시다.



세브란스병원은 3일 오전 발생한 화재사고로 연기를 마신 환자 8명이 무사히 퇴원할 때까지 의료서비스를 지원하기로 했다./뉴스1 © News1 김명섭 기자 "특별한 후유증 없어"…스프링클러 정상작동 (서울=뉴스1) 신속한 대처로 인명사고가 일어나지 않았지만 화재사고에서 가장 위험한 연기를 마신 환자들에겐 도의적 책임을 지겠다는 뜻으로 풀이된다.



간단하게 일단 명사들만 골라 내 봅시다. 형태소 분석기가 명사만을 골라 내도록 한다면 아마 아래와 같을 것입니다.


세브란스병원, 오전, 발생, 화재, 사고, 연기, 환자, 명, 퇴원, 때, 의료, 서비스, 지원, 뉴스, 후유증, 스프링클러, 정상, 작동, 대처, 인명, 사고, 일어나지, 가장, 연기, 도의, 책임, 풀이


뭐 완벽하지는 않지만 얼추 명사들을 추출 해 낸 것 같습니다. 이제는 이 단어들을 아까 준비 해 뒀던 감성어 사전에서 한 번 찾아 봅시다. 진짜 영한 사전을 찾는 것 처럼요. 고유대명사인 세브란스 병원이나 스프링클러 같은 건 아마 안 나올 겁니다. 먼저 '화재'를 감성어 사전에서 한 번 찾아 볼까요?


 

POS 

NEG 

 화재 / NNG

 0

 1

 화재 / NNG; 가 / JKS

 0

 1


화재는 역시 부정 수치가 높습니다. 긍정은 하나도 없네요... 그렇다면 이 기사에는 부정적인 감성을 좀 더 해 줘야 겠군요. 이런식으로 모든 명사에 대해 감성어 사전에서 감성 수치를 찾아보고 합산해보면 대충 아래와 같은 결과가 나옵니다.



세브란스 병원 화재  

 

 

 







6. 문맥을 살피는 감성 분석


앞서 제가 간단하게 구현 해 본 감성분석은 정말 단어 갯수만 헤아리는 멍청한 방식입니다. 이보다 더 향상 시킬순 없을까요? 단순히 단어 등장 횟수로만 따져버리면 많은 문제점이 있습니다. 여러분은 그냥 단어 하나만 보고 이게 긍정이냐 부정이냐! 따질 수 있나요? 예컨대 제가 '박살'이라는 단어에 대해 긍정적이냐 부정적이냐를 물었을 때 긍정 또는 부정이라 단언 할 수 있나요? 절대 그렇지 않습니다. 아래 문장에서는 '박살'이라는 단어가 긍정적으로 쓰일 수 있지요.



"우리 국군이 적들을 박살 냈다."


위에서 했던 방식대로라면 이 문장도 부정적인 문장이 되어 버립니다. 좀 더 향상된 방법이 필요합니다.


바른미래당 하태경 최고위원이 8일 성폭행 혐의를 받고 있는 안희정 전 충남지사를 “긴급체포해 야 한다”고 밝혔다.

하 최고위원은 이날 국회에서 열린 원내정책회의에서 “안 전 지사가 상습 강간범이라는 게 확인 이 됐다”며 이같이 밝혔다.

하 최고위원은 “추가 피해자가 없다고 했는데 어제 저녁 뉴스에 추가 피해자가 나왔다”며 “더 악질적 범죄라는 게 확인됐다. 또 도주의 우려도 있다”고 했다.   


위 기사를 TextRank를 통해 키워드 추출하면 대략 아래와 같은 결과가 나왔습니다. 


최고위원, 하, 하태경, 충남지사


TF-iDF를 사용하든 TextRank를 사용하든 키워드를 추출 할 때 단순히 문장과 단어만을 본다면 위와 같은 일이 벌어집니다. 이 기사에서 '최고위원'이란 하태경을 의미하고 '하 최고위원' 역시 하태경을 의미합니다. 그러나 TextRank 알고리즘이 이걸 알리가 없죠. 


파란색으로 강조된 단어끼리는 같은 사람을 의미하고 주황색으로 강조된 사람도 역시 같은 사람을 의미합니다. '안희정 전 충남지사'라고 처음에는 풀 네임으로 썼다가 이후로는 기자가 '안 전 지사'라고 짧게 부릅니다. 그래서 키워드 추출 결과중에 '하' 같은 이상한 녀석이 있는 거죠. 


만약 어떤 문장에서 주어를 감지 할 수 있다면 얼마나 좋을까요? 제가 위에서 소개한 KoNLpy 한국어 자연어 처리 라이브러리를 보면 NP(명사구)와 VP를 구분 하기는 해도 Subject를 딱히 구분 해 주지 않는 것 같았습니다. 주어를 감지 해 낼 수 있는 방법과 관련해 좋은글이 아래에 있습니다.


https://medium.com/@acrosson/extract-subject-matter-of-documents-using-nlp-e284c1c61824



(작성중입니다 ㅠ.ㅠ)




7. Machine Learning


제 나름대로 문맥을 살핀답시고 NLP를 적용해서 주어와 동사를 찾는 등 온갖 수를 써 보았습니다. 그러나 감성 분석을 머신 러닝 해 본다면 어떨까요? 



FastText

Facebook AI 연구소에서 개발한 Text Classification을 위한 오픈소스 라이브러리 입니다. language identification은 아주 좋은 예를 보여주고 있습니다. 아래 는 FastText 세미나 설명 중 일부 장면입니다. Text들을 모두 벡터로 표현하고 있습니다.





참고가 된 자료


트위터에 올라온 글들을 감성 분류하는 카이스트의 논문입니다. Lexicon을 만들어서 감성 분석을 시도 한 것 같습니다.


http://www.anthology.aclweb.org/Y/Y15/Y15-2017.pdf



8. 음, 결론


결국, 먼저 분석하고자 하는 문서들을 분류하기 위해 키워드를 기반으로 clsuter 할 필요가 있습니다. 주제 별로 문서들이 cluster 되고 나면 각 문서에 대해 감성 분석을 합니다. 이 때 감성 분석은 다양한 방법으로 해 볼 수 있는데 머신 러닝으로 트레이닝 된 word model을 이용해 분석 해 볼 수도 있겠고 단순히 감성 사전에 대입하여 분석 해 볼 수도 있겠습니다. 어느 방식이 더 좋고 어떤 모델이 더 좋을지는 역시 실험에 의해 검증 되어야 할 것입니다.










댓글23

  • 2018.03.21 16:11

    비밀댓글입니다
    답글

  • 2018.04.06 19:23

    비밀댓글입니다
    답글

    • xenophilius 2018.04.06 19:43 신고

      이제 취직을 해버려서 넘모 바빠졌습니다... 글을 다듬을 여유가 없네요. 댓글로 물어주시면 답변 드리겠습니다. 이번 주말에 조금 손 봐야겠네요. 이렇게 봐 주시는 분이 있다니 감사요. 감히 서울대학교 학생에게 보일 글이 아닌데.

  • 2018.05.09 19:24

    비밀댓글입니다
    답글

  • 박재호 2018.12.30 13:45

    안녕하세요 글을 보다가 궁금한점이 있어서 문의 드립니다. polarity.csv 파일과 제가 수집한 데이터랑 어떻게 매칭을 시켰는지 궁금합니다. wogh5387@naver.com로 이메일 주시면 진짜 감사하겠습니다
    답글

  • 안녕하세요! 2019.03.18 16:01

    안녕하세요! 저는 이번학기를 마지막으로 졸업작품을 하는 정주현학생이라고합니다!
    감성분석에 대해 좋은 설명과 리뷰가 많이 도움됐습니다.
    제가 댓글을 남겨드린이유는.. 저도 이 감성분석을 자바로 해야하는데 너무 어려움이 많아서그런데
    배포의 의도는 절대 없이 프로젝트할때만 사용하려고합니다.. 혹시 구현하신소스를 받아볼수있을까요..?

    답변 부탁드립니다..!

    -정주현 올림-
    답글

    • xenophilius 2019.03.26 22:33 신고

      답이 늦어 미안합니다. 구현한 소스들이 존재 하지만 dependency가 너무 강해 다른 분들의 환경에서는 실행되지 않을 것입니다...

      https://hart-demo.herokuapp.com/

      REST API Service로서 공개 해 놓기는 했기에 이 REST API를 써 보시면 될 것 같습니다.

      https://rumo.tistory.com/106

  • 2019.03.25 03:14

    비밀댓글입니다
    답글

    • xenophilius 2019.03.26 22:37 신고

      일단 재밌게 읽어주셔서 감사합니다. 일전에도 polarity.csv로 어떻게 분석했는지 물어 보신 분이 계십니다. 제가 그 부분에서 자세하게 작성을 하지 않아 다들 물음을 주시는 것 같습니다.

      그렇게 대단한 방법은 아닙니다. 그저 형태소 단위로 분리된 단어를 polarity.csv의 단어들과 매칭을 해 보고 문장의 점수를 매기는 방식입니다. 매우 단순하고 수학적 증명도 없기 때문에 사실 의미가 크게 있진 않습니다. 보다 좀 더 의미있는 방식으로는 fasttext를 활용 한 것인데 REST API로 공개 해 두었습니다..

      https://hart-demo.herokuapp.com/
      https://rumo.tistory.com/106

    • . 2019.03.27 09:50

      감사합니다!!

  • 안녕하세요!! 2019.05.05 15:58

    안녕하세요! 정말 글 잘 읽었습니다 ㅜㅜ 저도 위에분들과 비슷한 고충이 있는데 polarity.csv랑 수집한 데이터를 매칭시키는 소스가 정말 필요해서요ㅜㅜ 만드신 hart api는 글자 입력수가 너무 짧아서 제것을 연구하기에 한계가 있습니다 혹시 라도 이글 보시게 되면 한번만 꼭 부탁드리겠습니다 ㅜㅜ 95743@naver.com 혼자 보겠습니다 ㅜㅜ
    답글

    • xenophilius 2019.05.05 16:03 신고

      매칭 방법은 형태소 분리된 단어들을 polarity와 단순 매칭하는 것 뿐입니다. 소스가 필요할 정도로 대단한 방식은 아니기에 저도 따로 가지고 있지는 않습니다..

    • xenophilius 2019.05.05 16:03 신고

      HART API는 DEMO에서 45자 제한이지만 막상 HTTP 리퀘스트를 날릴 때는 제한이 없습니다.

  • 안녕하세요 2019.05.10 18:06

    안녕하세요! 친절하게 정리해주셔서 감사합니다. 저는 자연어처리 쪽으로 공부하는 학생입니다. 저도 마찬가지로 polarity.csv 에서 정의한 ngram들이랑 크롤링한 데이터랑 매칭시키는 데 어려움이 있습니다ㅠㅠ 매칭하신 소스코드 메일로 보내주시면 정말정말 감사하겠습니다ㅠㅠ 메일은 foxoxo9603@naver.com 입니다 감사합니다ㅠㅠ
    답글

    • xenophilius 2019.05.10 18:11 신고

      음, 사실 위에도 댓글을 달긴 했는데 매칭 방법은 단순히 polarity.csv 데이터를 기준으로 합산(sum)한 것 뿐입니다.

  • xenophilius 2019.05.10 18:49 신고

    많은 분들이 댓글로 같은 질문을 주고 계서서 작성 해 보았습니다. https://rumo.tistory.com/111 이 글을 읽어 주세요.
    답글