elasticsearch / / 2022. 12. 23. 07:01

nori tokenizer에서 불용어 제거

nori에서 기본적으로 검색할 때 "조사", "어미", "감탄사" 등 검색에 불필요한 단어도 모두 형태소 분석이 된다.
형태소 분석이 불필요한 불용어를 설정해보자.

"사랑하다"를 nori로 형태소 분석을 해보자.

POST _analyze
{
  "tokenizer": "nori_tokenizer",
  "text": "사랑하다"
}

결과

{
  "tokens" : [
    {
      "token" : "사랑",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "하",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "다",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "word",
      "position" : 2
    }
  ]
}

위에서 실제 필요한 단어는 "사랑"이며 "하"(동사파생접미사)와 "다"(어미)는 필요 없을 것 같다.

이를 위해서 token_filter에 stoptags를 설정해주면 된다. (type: nori_part_of_speech)

PUT nori_test
{  
  "settings": {    
    "index": {      
      "analysis": {        
        "tokenizer":{
          "korean_tokenizer": {            
            "type": "nori_tokenizer"         
          }        
        },
        "analyzer": {          
          "my_nori_analyzer": {            
            "tokenizer": "korean_tokenizer",           
            "filter": [              
                "nori_filter"
                ]          
          }        
        },  
        "filter": {          
          "nori_filter": {
            "type": "nori_part_of_speech",            
            "stoptags": []
          }        
        }      
      }    
    }
  }
}
POST nori_test/_analyze
{
  "analyzer": "my_nori_analyzer",
  "text": "사랑하다"
}

결과

{
  "tokens" : [
    {
      "token" : "사랑",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "word",
      "position" : 0
    }
  ]
}

이런식으로 "하"와 "다"는 탈락된 결과를 나타낸다.


stoptags의 품사는 아래를 참고하면 된다.

태그 영문명 한글명 예시
E (*) Verbal endings 어미 - 사랑/하/다(E)
- 고맙/다(E)
IC (*) Interjection 감탄사 - 와우(IC), 맙소사(IC)
- 아(IC) 놀랍다
J (*) Ending Particle 조사 - 나/는(J)/너/에게(J)
- 추석/연휴/를(J)
MAG (*) General Adverb 일반 부사 - 빨리(MAG)/달리다
- 과연(MAG)/범인/은/누구/인가
MAJ (*) Conjunctive adverb 접속 부사 - 그런데(MAJ)
- 그러나(MAJ)
MM (*) ES:Modifier(한정사), 루씬 API:Determiner(관형사) 설명이 다름 - 맨(MM)/밥
NA (*) Unknown 알 수 없음  
NNB Dependent noun (following nouns) 의존명사
'것', '따름', '뿐', '데'
- 볼/것(NNB)
NNBC Dependent noun 의존명사(단위를 나타내는 명사)
개, 마리, 장, 권, 켤레, 줄, 몰
- 책/2/권(NNBC)
NNG General Noun 일반 명사 강아지(NNG)
NNP Proper Noun 고유 명사 비숑(NNP)
NP Pronoun 대명사 그것(NP), 이거(NP)
NR Numeral 수사 하나(NR)/밖에, 칠(NR)/더하기/삼(NR)
SC (*) Separator (· / :) 구분자 nori_tokenizer가 특수문자 제거
SE (*) Ellipsis 줄임표(...) nori_tokenizer가 특수문자 제거
SF Terminal punctuation (? ! .) 물음표, 느낌표, 마침표 nori_tokenizer가 특수문자 제거
SH Chinese character 한자 中國(SH)
SL Foreign language 외국어 hello(SL)
SN Number 숫자 1(SN)
SP (*) Space 공백  
SSC (*) Closing brackets 닫는 괄호 ),] nori_tokenizer가 특수문자 제거
SSO (*) Opening brackets 여는 괄호 (,[ nori_tokenizer가 특수문자 제거
SY Other symbol 심벌  
UNA (*) Unknown 알 수 없음  
UNKNOWN Unknown 알 수 없음  
VA Adjective 형용사 하얀(VA)/눈
VCN Negative designator 부정 지정사(서술격조사) 사람/이/아니(VCN)/다
VCP Positive designator 긍정 지정사(서술격조사) 사람/이(VCN)/다
VSV (*) Unknown 알 수 없음  
VV Verb 동사 움직이(VV)/다,먹(VV)/다
VX Auxiliary Verb or Adjective 보조 용언 가지/고/싶(VX)/다, 먹/어/보(VX)/다
XPN(*) Prefix 접두사(체언 접두사?) ES에서 매핑되는 단어를 찾지 못함
XR(*) Root 어근 ES에서 매핑되는 단어를 찾기 못함
XSA (*) Adjective Suffix 형용사 파생 접미사 멋/스럽(XSA)/다
XSN (*) Noun Suffix 명사 파생 접미사 ES에서 매핑되는 단어를 찾기 못함
XSV (*) Verb Suffix 동사 파생 접미사 사랑/하(XSV)/다
  • 위의 태그에서 (*)표시는 nori_part_of_speech 토큰 필터에서 디폴트로 설정된 태그
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유