/*
다들 ngram을 어찌 사용하시는지 모르겠지만..전 종종 쓸일이 있더라구요..
좀 도움이 될까 하고 올립니다.
*/
#include <stdafx.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int WORDLENGTH = 1024;
const int BASENGRAMCOUNT = 2;//2글자부터 뽑는다.
const int LIMITNGRAMCOUNT = 8;//4글자까지 뽑는다.
void HangleNgram(char* inputWord , int gramCnt);
int main()
{
char inputWord[WORDLENGTH] = {0,};
int gramCnt = 0;
while(1)
{
printf("글자를 입력하세요 <졸라필터하고 온니 한글만-글자다붙여쓰고>\"exit\"출력\n");
gets(inputWord);
fflush(stdin);
if(strcmp(inputWord , "exit") == 0)
{
printf("끝\n");
exit(0);
}
int totalLen = 0;
totalLen = strlen(inputWord);
for(int gramCnt=BASENGRAMCOUNT; gramCnt<=(totalLen/2); gramCnt++)
{
HangleNgram(inputWord , gramCnt);
}
}
return 0;
}
void HangleNgram(char* inputWord , int gramCnt)
{
//한글,영문,숫자,한문 필터처리
//힌글만 있다고 가정한다.
int totalLen = 0;
totalLen = strlen(inputWord);
int hangleWordLen = 0;
char korWord[WORDLENGTH] = {0,};
while(1)
{
memset(korWord , 0 , WORDLENGTH);
if(hangleWordLen == 0)
{
strncpy(korWord , inputWord , 2*gramCnt);//한단어는 2byte
}
else
{
strncpy(korWord , inputWord+hangleWordLen , 2*gramCnt);//*는 한단어는 2byte
}
if(strlen(korWord) > LIMITNGRAMCOUNT)//ngram 최대글자 보다 크면 break;
{
break;
}
printf("HangleNgram = %s\n" , korWord);
if((hangleWordLen+(2*gramCnt)) == totalLen)
{
break;
}
hangleWordLen += 2;//한단어씩 가야 한다.
}
}
전체 모든 내용을 ngram으로 색인한다는건..좀 무리가 있을듯 하지만..
ㅎㅎ 뭐 ngram으로 처리 해야할 일들이 종종 있더라구요..
절대적으로 필요한 튜닝 팁 정도?
서로의 장 단점을 살린다면..딱히 나쁠꺼 같진 않은데요~ ^^
어설픈 형태소 분석보다는 N-Gram이 나을때가 많죠. ㅎ
참 오래된 논란거리인것 같습니다만... 저도 한마디 거들겠습니다.
검색엔진 입장에서는 Precision과 Recall이 오랫동안 성능의 기준이 되어왔으며, 이 두 factor가 조화롭게 잘 나오는 엔진이 좋은 엔진이라고 떠들어 왔습니다.
하지만, 요즘들어 Recall은 잘 모르겠는데, 전통적인 Precision에 대한 개념이 모호해졌습니다. 구글 때문이죠. (PageRank 알고리즘)
게다가, 개인화 검색이라는 말이 나옴에 따라서, 이 정확도(Precision)의 개념이 완전히 뭉개져 버렸습니다.
그런 와중에, 기술적인 한계에서 오는 답답함이라고나 할까? 아님 탈출구? 해방구? 그런 측면에서 Recall이 또 부곽되고 있습니다.
Recall만 보장되면, 그 다음엔 사용자가 알아서 찾겠지라는 생각인가???? 방금 찾았는데 또 찾아???
N-Gram은 Recall 측면에서는 당근 와따죠....
초창기에 어느 외산 엔진("베" 머시기..ㅋㅋㅋ)이 들어오면서 공공기관에 돌아다니면서 Recall이 정말 중요하다고, 그래서 N-Gram을 써야한다고 하도 세뇌를 시켜놔서 나중에 국산엔진이 다시 영업할 때 그 사람들 다시 설득한다고 애를 먹었다는 웃지못할 애피소드도 있었습니다.
하지만, 언어처리기를 쓰는 것과 N-Gram을 사용하는 것은 단순히 검색엔진 차원에서만 볼 문제가 아니라고 봅니다.
여러분도 다들 아시겠지만, 요즘 검색엔진의 대세는 많은 부가기능(문서분류, 군집화, 키워드자동추출, 연관검색 등등)들이 함께 붙는 통합형으로 가고 있습니다. 이런 상황에서 하부 색인엔진을 N-Gram을 이용한다는 것은 무리가 있는 것으로 생각됩니다.
예를 들어, N-Gram을 이용해서 분류기를 한번 만들어 본다고 생각해 보십시오. 클러스터링은요? 키워드 및 질의 추출에 기반한 연관검색기능? 하일라이팅 기능?
현재 언어처리엔진이 완벽하다는 말씀을 드리는 것도 아니며, N-Gram이 쓸모 없다는 말씀을 드리는 것도 아닙니다.
검색시스템의 범위와 폭을 넓게 가져가야 한다는 말씀을 드리는 것이구요. 그런 측면에서는 언어처리엔진은 반드시 필요하다는 말씀을 드리는 겁니다.




n-gram 분석기만 있어도 충분히 색인기 테스트나 실제 사용 가능하지요