Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

형태소분석기를 이용하는 색인기를 만들면 좋겠으나 워낙에 많은 시간이 필요로 하니, 우선 ngram방식의 색인기를 만들기로 했다. 어절은 마침표,따움표,쉼표,공백문자를 기준으로 하기로 했다.

n-gram방식은 prefix를 중요하게 생각하기로 했다. 예를 들어 "검색엔진"을 전통적인 2-gram으로 나눈다면,
  1. 검색, 색엔, 엔진이 만들어지겠지만
  2. , 검색, 검색엔, 검색엔진 으로 만들기로 했다.
2번방식을 사용할 경우 색엔에 대해서는 리콜이 이루어지지 않으므로, 질의어에 부적합한 문서들이 검색될 확률이 적어질 것이다. 단. 띄어쓰기와 붙여쓰기가 잘못되어 있을 경우 리콜에 문제가 생길 수는 있을 것이다.
  • "아버지가 방에 들어가신다"로 색인되어 있는데, 질의어가 "아버지 가방에 들어가신다"일 경우 리콜되지 않을 것이다.
이러한 문제는 감수하고 2번 방식을 사용하기로 했다.

아래는 간단한 ngram 프로그램이다. 영문만 대응된다.
#include <strings.h>
#include <stdio.h>
#include <vector>
#include <string>
#include <iostream>

using namespace std;
void ngram(string str);

int main(int argc, char **argv)
{
    string str = "hello world !! my name yundream";
    ngram(str);
}

void ngram(string str)
{
    vector<string> grams;
    string gram;
    int pos = 0;
    int size = 1;
    for (int i = 0; i < str.size(); i++)
    {
        if (str[i] == ' ')
        {
            pos = i+1;
            size = 1;
            continue;
        }
        cout << size << " (" << pos << ")" << " : " << str.substr(pos, size) << endl;
        size++;
    }
}
이제 UTF-8에도 대응되게 해야 할건데, 신경쓰기 싫어서 qt(:12)에서 제공하는 QString 클래스를 사용하기로 했다. QString 클래스를 이용해서 UTF-8에 대응되도록 하는 작업은 집에서 해야 되겠다.