검색 기능이 포함되어있는 사전을 구현하는 프로젝트를 시작해서 검색 기능을 구현하려고 한다.

     

    먼저 프로젝트 내부에서 동작할 검색 기능의 순서의 초안은 다음과 같다.

     

    1. 사전에 단어를 추가할 때, 문서 내부의 단어들을 Lemmentization (자연어처리 라이브러리 사용)하여 DB에 저장.

    (문서의 주제어는 Lemmentization하지 않는다.)

     

    2. 유저의 Query를 받고,

     

    3. 사전적 검색으로 완전히 동일한 단어를 1차적으로 선별,

     

    4. query를 Lemmentization 하고, tf-idf weighting을 통해서 query-document 연관 검색어 출력.

     

    따라서 검색 기능을 구현할 DB 구조를 설계해보려고 한다.

     

     

    1. tf-idf란?

    Term frequency - Inverted term frequency의 약자로, Document내의 term의 중요도를 계산하는 방법론이다.

     

    가장 일반적인 logarithm으로 예시를 들자면,

    tf는 하나의 document내부에서 term이 얼마나 자주 등장했는지 중요도를 계산하는 방법이다.

    tf = 1 + log(문서에서 등장횟수) 로 표현한다,

     

    idf는 특정 단어가 몇개의 문서에서 등장했는지를 따져주는 것으로, 너무 많은 문서에서 등장하는 단어인 경우, 보편적인 단어로 중요도가 낮아지기 때문에 사용된다.

     

    따라서 빈도수가 높을수록 중요도가 낮아지기 때문에 역수를 취하는데 이 때문에 invert가 붙게 된 것.  

    식은 idf = log( 전체문서 / 단어의 등장 빈도 ) 이다.

     

    따라서 가중치 W는 (tf 값) x (idf 값)이 된다.

    이렇게 구한 수치를 정규화하면, 둘의 유사도를 각도 세타로 표현할 수 있게 된다. 각도가 작을수록 유사도가 높아지기 때문에 코사인을 사용해서 유사도를 판단한다.

     

    위의 형식에 따라 ddd.qqq (document, query)로 표현한다. lnc.ltn이 가장 보편적이라고 하는데

    문서와 쿼리에서 각각 가중치를 구해서 곱할때 어떤 방법론을 선택할지 정하는 것이다

     

    아래는 그 예시이다(펌)

     

    query의 경우(ltn)

    tf는 logarithm, 

    document frequnecy는 idf,

    normalization 은 none으로 1을 곱하고

     

    document의 경우(lnc)

    tf는 logarithm

    document frequency는 no로 1을 곱하고,

    normalization은 cos정규화를 사용한다.

     

     

    결과적으로 query-ltn에서 document frequency가 필요한데 이는 쿼리할때마다 매번 모든 document를 뒤질 수 없으니,  document마다 term table이 필요하고,

     

    lnc에서 cos정규화를 시켜놓은 값도 저장해둔 테이블이 필요하니 이 컬럼도 추가한다.

     

    그럼 DB 테이블 구조는

     

    1. 단어 / 내용 테이블 (내용 안에 이미지 url 포함)

     

    2. 단어를 foreign key로 가지고, 내용을 term단위로 쪼개놓은 ( Lemmentization 수행) terms frequency table, 해당 term에 cos 정규화 값 컬럼도 추가.

     

    3. 단어를 foreign key로 가진 주석 테이블

     

    4.  단어를 foreign key로 가진 카테고리 테이블

     

    이 확정적으로 필요하며,

    query에서 document frequency를 빠르게 구하기 위해서 전체 term을 column으로 가지고 있는 document frequency 테이블을 만들지 생각을 해봐야할 것 같다.

     

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기