ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Fastcat] 사전에 대해서 알아보자.
    개발하면서/코드보면서 2011. 9. 9. 03:16
    반응형

    검색엔진을 만들다 보면, 색인어로 등록 하면 안될 키워드가 있고(섹스, 도박, 자살 등등)

    서로 비슷한 키워드가 있다.(LG, 엘지, 앨지 이런것들...)

    fastcat에서는 한글 형태소 분석할때 사용하는 사전, 유의어 사전, 금지어 사전, 사용자 등록 사전이 있다.

     

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

     

    색인시, 키워드를 추출할때 사용하기도 하고, 검색 질의가 왔을때 질의를 분석할때 사용하기도 한다.

    만약에 사전이 없다면 색인어로 나이키가 있는데, 사용자가 nike를 쳤을때 검색이 안되는 뭐 그런..(비유가 맞나?;;)

     

     

    SearchFieldReader.java, KoreanNounExtractor.java 에서 사용하고 있다.

    사전의 용도를 알았으니 fastcat에서는 어떤 자료구조로 사전을 구성했는지 알아보도록 하자

     

     

    유의어사전은 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() 으로 서버 구동시 사전을 로딩한다.
    그 후에 검색이나 색인작업시 아래와같이 사전을 활용한다. 

    //SearchFieldReader.java 에서 사용
    	if(useSynonym && (synonymList = Dic.synonym.get(token)) != null){
    		for (int j = 0; j < synonymList.length; j++) {
    			CharVector synonym = synonymList[j];
    			logger.debug("synonym = "+synonym);
    			TermDocs termDocs = getPosting(indexFieldNum, synonym);
      			if(termDocs != null){
      				logger.debug("termDocs.count() = "+termDocs.count());
      				//add synonym terms.
    //	    	    				if(termList != null && i == 0){
      				if(termList != null){
      					logger.debug("add synonym = "+synonym);
        				termList[i].add(synonym.toString());
        				orgList[i].add("");
      				}
      				
      				//make synonym clauses
      				//give synonym a lesser score 
      				OperatedClause clause = new TermOperatedClause(termDocs, weight - 1);
      				if(synonymClause == null)
      					synonymClause = clause;
      				else
      					synonymClause = new OrOperatedClause(synonymClause, clause);
      			}
    	}
    	}
    
    //KoreanNounExtractor.java 에서 사용
    boolean foundStop = false;
    if(middle){
    	if(Dic.apStop.contains(current)){
    		foundStop = true;
    	}
    }else{
    	if(Dic.stop.contains(current)){
    		foundStop = true;
    	}
    }
    
    반응형

    댓글

Designed by Tistory.