2015년 9월 4일 금요일

소셜 데이터에 대한 빅데이터 분석과 형태소 분석기의 사용..

소셜 데이터들에 대한 빅데이터(?) 혹은 나름의 분석을 하려고 할때 많은 사람들이 찾게되는 기술블록인것 같다. 사실 개발하려는 기술을 빅데이터에 분석이라는 이름으로 정의를 하던 그렇지 않던간에 자연어 텍스트에 대한 분석을 하는 상황에서 형태소 분석기를 찾는건 어찌보면 당연한것 같다.

그래서인지 최근에 쉽게 사용할 수 있는 형태소 분석기의 옵션이 꽤 많아진것 같다.

HAM으로 잘 알려진 국민대의 형태소 분석기는 국민 형태소 분석기랄까? ㅎㅎ 한번씩은 다들 써보는 형태소 분석기이다.
KOMORAN 이나 꼬꼬마 한국어 형태소 분석기는 최근에 많이 쓰이는 추세인것 같고, 은전한닢 이라는 나름 좋은 컨셉으로 새롭게 만들어지고 있는 형태소 분석기도 있다.

이런 형태소 분석기들 중 뭐가 성능이 좋은가를 논하는건 사실 꽤나 의미가 없는 일이라고 생각된다. 왜냐면, '한국어텍스트' 자체가 처리하기 까다로운 언어라서 어떤 녀석을 택해도 직관적으로 만족스러울 만큼의 성능을 보장하지는 않기 때문에... 그래서 실제 한국어 텍스트 데이터들을 처리하는 회사들은 조금더 나은 성능의 상업버전(대부분 이런 형태소 분석기들을 기반으로 만들어진거지만..)을 가져다가 사용자 사전을 충실히 보강하는 방식으로 형태소 분석기를 활용하는 것으로 알고 있다. 은전한닢이 다른 형태소 분석기들에 비해서 새롭다는건... 이런 사전관리에 'Web기반', 'Open기반' 등의 개념의 도입을 고려하고 있어 다른 형태소 분석기들에 비해 사용자 사전관리가 용이한 녀석이 될 것 같기 때문이다. (아직까지 시스템에 반영된것은 아닌것으로 알지만, 현재로서도 사용자 사전 관리는 다른 형태소 분석기에 비해 용이한것으로 판단된다)

사실 형태소분석기의 사용여부는 참 풀기힘든 문제인것 같다. 아무래도 많은 데이터를 다루게 될텐데, 형태소 분석기를 앞단에 내세워 최대한의 garbage를 걸러내고 의미있게 태깅된 데이터만을 가지고 데이터를 분석하는게 맞는 것 같기도 하고, 형태소 분석기가 가지는 오류를 안고 가느니 분석범위를 포괄하는 사전(Dictionary)를 잘 구축해서 처리하는게 나을 것 같기도 하고... 참 '계륵'같은 녀석인것 같다.

결국은 포털에서 하는것처럼 형태소 분석기와 n-gram인식기를 둘다 사용하는 쪽으로 결론내는게 자연스러운 의사결정인것 같다. 하지만 의존성이랄까? 형태소 분석기와 n-gram 인식기의 비중, 두 녀석이 담당하는 영역의 정의 문제가 남게되는데.. 몇가지 기준은 정할 수 있을 것 같다.

1. 동사, 형용사에 대한 추출이 필요한가?
2. 텍스트데이터에서 뽑을 키워드 사전을 직접 구축할 수 있는가?
   2.1 ngram사전 > 내사전이 맞는가?

1번의 질문의 답이 '필요하다' 라면 당연히 형태소 분석기에 의존할 수 밖에 없다. 만약 '전혀 필요없다' 라면 n-gram단어 인식기를 쓰고 garbage 열심히 걸러내는 형태로 사용해도 형태소 분석기를 쓸때보다 나은 결과를 얻을 수 있을 것으로 보인다.
2번에서 텍스트 데이터를 분석할때 활용할 키워드를 사전화 할 수 있다는 말은 (사전의 주기적update도 포함해서) 데이터로 부터 추출할 키워드들을 명확하게 정리해낼 수 있는냐는 질문인데... 직접 사전이 구축가능하다면 n-gram추출기를 활용하는게 더 효율적일 가능성이 높다. 키워드가 한정된다면 garbage처리도 수월하고, 데이처처리 속도도 '형태소분석' >>넘사벽>> '사전을 사용한 ngram인식' 일 확률이 높기 때문이다.
2.1번의 질문은 2번에서 구축한 사전이 n-gram사전처럼 방대한 경우는 다르게 생각해야할 수 있다는 건데, 이럴 경우, garbage 필터링에 대한 보장을 할 수 없고 n-gram인식기의 처리속도도 그닥 빨라지기 힘들어 진다. 포털은 이러한 상황에 의해 형태소 분석기와 ngram인식기를 함께 쓰는걸로 봐야할듯 하고...

형태소 분석기과 n-gram인식기를 사용한 방식에 대한 비교글은 조만간 테스트가 끝나는 대로 정리해볼 예정이다.


* ms에서 공개하는 N-gram사전 서비스가 있다. 물론 영어..
** 한국어는 오픈한글이라는 사이트에서 제한적으로(감성사전만..) api형태로 제공하고 있기는 한데.. n-gram사전이라고 하기엔 좀 민망하다.







2015년 9월 2일 수요일

한국어 ngram 생성기..

단어가 아닌 글자수로 ngram을 생성하기 위한 java 코드.
한국어라고해서 딱히 달라질건 없으나, 함수 입력값으로 gram생성을 위한 size를 받아서 해당 size의 ngram만 생성해준다. 물론 1~10크기의 ngram을 생성하기 위해서는 10번을 호출해야한다.
한국어 특성상 ngram을 생성하면 garbage가 꽤나 많아지므로 글자의 size별로 grabage 날리기 위한 처리를 하기에는 편한 코드.

public ArrayList<String> nGramAnalyzer(String sentence, int gram) {
ArrayList<String> termList = new ArrayList<String>();
for(int i = 0; i < sentence.length() - (gram - 1); i++)
        {
String term = "";
for (int j = 0; j < gram; j++) {
if (j == (gram - 1)) {
term += String.valueOf(sentence.charAt(i + j));
} else {
term += sentence.charAt(i + j) + "";
}
}
termList.add(term);
}
return termList;
}

** 대상 text는 UTF-8로 가정하고 테스트를 해본 코드
** 사전은 가능하면 Map으로 memory에 로딩해서 비교해야 처리속도를 보장할 수 있음