반응형

Elasticsearch에서 공식적으로 지원하는 한글 형태소 분석기 노리(Nori)의 품사 태그와 예시를 정리하였다.

공식 가이드북에 따르면 한글 검색에서는 명사, 동명사 정도만을 검색하고 조사, 형용사 등은 제거하는 것이 바람직하다고 한다. 하지만 이는 서비스하고 있는 업무 도메인에 따라 달라질 수 있을 것이다. 엘라스틱서치에서 지원하는 Nori의 품사 태그들이 어떤 것이 있는 지 알아보고, 각자의 상황에 맞게 쓰는 것을 추천한다. 

Nori 토크나이저가 사용하는 한글 사전은 mecab-ko-dic과 세종 말뭉치이다. 한글 단어의 품사 태그는 사전마다, 한글 형태소 분석기의 내부 로직에 따라 달라질 수 있다. 예를 들어, 국립국어원 혹은 다른 한글 형태소 분석기에서는 어떤 단어를 "접두사"로 매핑하였지만, Nori는 다른 품사로 매핑하였을 수 있다. 

노리 형태소 분석기는 한 개의 토크나이저와 두 개의 토큰 필터를 제공한다.
그 중 사용하고 싶지 않은 형태소 품사 태그를 제거하는 nori_part_of_speech 토큰 필터의 stoptags 파라미터를 자세히 다룬다.

 

품사태그 정리를 위해 참고한 문서

 

stoptags 품사 태그

품사 태그를 정리한 노리 형태소 분석기의 버전은 6.4.3이다. 스터디 중인 교재의 버전과 맞추기 위해서였으므로 각자의 버전 혹은 최신 버전의 결과와는 다소 상이할 수 있다. 

값과 값의 영문명은 루씬 API 문서를 기준으로 정리하였고, 한글명은 꼬꼬마 형태소 분석기를 기준으로 정리하였다. 예시는 6.4.3 버전 기준이다.

값(tag) 영문명 한글명 예시
E Verbal endings 어미 사랑/하(E)/다
IC Interjection 감탄사 와우(IC), 맙소사(IC)
J Ending Particle 조사 나/는(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) 의존명사  
NNBC Dependent noun 의존명사(단위를 나타내는 명사)  
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 동사 파생 접미사 ES에서 매핑되는 단어를 찾기 못함

* 일부 품사 태그의 경우 예시를 찾기 어려웠다. 아마 실습 중인 엘라스틱서치의 버전이 낮기 때문에 사전 정보 또한 최신 정보가 아니라 그런 게 아닐까 추측된다.


직접 품사 태그 확인해보기

포스팅은 스터디를 위해 책과 버전을 맞추기 위해 6.4.3 버전으로 확인하였다. 엘라스틱서치 버전은 최신으로 하여 확인하거나, 본인들에게 맞는 버전으로 확인해보기를 권한다.

엘라스틱서치 버전 : 6.4.3
analysis-nori 버전 : 6.4.3
lucene-analyzers-nori : 7.4.0

 

1. 설치 및 테스트

노리 형태소 분석기는 공식적으로 지원되는 플러그인이지만 기본 설치는 되어있지 않다. 아래와 같이 따로 플러그인을 설치한다.

bin/elastisearch-plugin install analysis-nori

 

정상적으로 설치가 되었는지 확인하기 위해 테스트 해보자.

GET _analyze
{
  "tokenizer": "nori_tokenizer",
  "text": "잠실역",
  "explain": true
}

잠실, 역으로 분리되어 분석한 결과가 표시될 것이다.

기본적으로 stoptags를 지정하지 않으면 아래와 같이 제외되는 품사 태그들이 있다.

"E", "IC", "J", "MAG", "MAJ", "MM", "SP", "SSC", "SSO", "SC", "SE", "XPN", "XSA", "XSN", "XSV", "UNA", "NA", "VSV"

위와 같은 품사에 어떤 단어들이 매핑되는 지 보기 위해서, 노리 형태소 분석기의 옵션을 바꿔 새로운 분석기를 만들어보겠다.

 

2. 인덱스 생성

편한 테스트를 위해 nori_tokenizer를 적용한 분석기를 인덱스에 생성해본다.

PUT my_nori_index
{
  "settings": {
    "index": {
      "analysis": {
        "tokenizer":{
          "my_nori_tokenizer":{
            "type": "nori_tokenizer",
            "decompound_mode": "mixed",
            "user_dictionary": "userdict_ko.txt"
          }
        },
        "analyzer": {
          "my_nori_analyzer": {
            "tokenizer": "my_nori_tokenizer",
            "filter": [
              "my_nori_filter"
            ]
          }
        },
        "filter": {
          "my_nori_filter": {
            "type": "nori_part_of_speech",
            "stoptags": [
              "SP"   
            ]
          }
        }
      }
    }
  }
}

* stoptags 파라미터에서 제외한 품사는 SP로, 공백(space)를 뜻한다.

* nori_tokenizer를 적용하면 특수문자와 같은 품사 태그를 확인하기 어려우므로, 토크나이저를 keyword로 바꿔도 좋다.

 

3. 사용 예시 (품사 확인하기)

POST my_nori_index/_analyze
{
  "analyzer": "my_nori_analyzer",
  "text": "잠실역",
  "explain": true
}

 

반응형