달력

042018  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  
  •  
  •  
  •  
검색엔진을 만들다 보면, 색인어로 등록 하면 안될 키워드가 있고(섹스, 도박, 자살 등등)
서로 비슷한 키워드가 있다.(LG, 엘지, 앨지 이런것들...)
fastcat에서는 한글 형태소 분석할때 사용하는 사전, 유의어 사전, 금지어 사전, 사용자 등록 사전이 있다.

그럼 이 사전을 어디다가 쓰느냐? 

색인시, 키워드를 추출할때 사용하기도 하고, 검색 질의가 왔을때 질의를 분석할때 사용하기도 한다.
만약에 사전이 없다면 색인어로 나이키가 있는데, 사용자가 nike를 쳤을때 검색이 안되는 뭐 그런..(비유가 맞나?;;)

  SearchFieldReader.java, KoreanNounExtractor.java 에서 사용하고 있다.
사전의 용도를 알았으니 fastcat에서는 어떤 자료구조로 사전을 구성했는지 알아보도록 하자.
class 구성은 아래와 같다.


유의어사전은 1 : n 이기 때문에 Map, 그외 다른 사전은 1:1이기 때문에 Set을 사용하였다.
HashSetDictionary와 HashMapDictionary의 차이점을 보자니 termArray밖에 없으므로
HashMapDictionary에 대해서만 설명하려고 한다.(오잉? ㅋㅋㅋㅋㅋ)

근데 변수명을 보자니 어디서 많이 봤다....아~!!! 

[Fastcat]FullIndexJob을 알아보자(3) 에서 나름 설명한 그것이다.(자료구조나 조금 복잡한 알고리즘을 쉽게 설명하는 그런 능력을 갖고싶다....하악...)

termArray는 MemoryPosting에서 색인어가 저장된 idx와 동일한 idx 문서 번호를 가지고 있었듯이
(아래 처럼 postingArray에 keyPos와 동일한 idx에 문서번호 저장)

PostingBuffer old = postingArray[idx];

postingArray[idx] = p;

return old; 

 
HashMapDictionary에서도 keyPos에 해당하는 term은 keyArray에 저장이 되어있을 것이고, 그 term에 해당하는 유의어들이 동일한 idx의 termArray에 저장이 되어있다. 

IRService.java 에서 Dic.init() 으로 서버 구동시 사전을 로딩한다.
그 후에 검색이나 색인작업시 아래와같이 사전을 활용한다.

 
Posted by 오산돌구