Elasticsearch 노리(Nori)형태소 분석기의 stoptags 한글 품사 태그 정리
Elasticsearch에서 공식적으로 지원하는 한글 형태소 분석기 노리(Nori)의 품사 태그와 예시를 정리하였다.
공식 가이드북에 따르면 한글 검색에서는 명사, 동명사 정도만을 검색하고 조사, 형용사 등은 제거하는 것이 바람직하다고 한다. 하지만 이는 서비스하고 있는 업무 도메인에 따라 달라질 수 있을 것이다. 엘라스틱서치에서 지원하는 Nori의 품사 태그들이 어떤 것이 있는 지 알아보고, 각자의 상황에 맞게 쓰는 것을 추천한다.
Nori 토크나이저가 사용하는 한글 사전은 mecab-ko-dic과 세종 말뭉치이다. 한글 단어의 품사 태그는 사전마다, 한글 형태소 분석기의 내부 로직에 따라 달라질 수 있다. 예를 들어, 국립국어원 혹은 다른 한글 형태소 분석기에서는 어떤 단어를 "접두사"로 매핑하였지만, Nori는 다른 품사로 매핑하였을 수 있다.
노리 형태소 분석기는 한 개의 토크나이저와 두 개의 토큰 필터를 제공한다.
그 중 사용하고 싶지 않은 형태소 품사 태그를 제거하는 nori_part_of_speech 토큰 필터의 stoptags 파라미터를 자세히 다룬다.
품사태그 정리를 위해 참고한 문서
- stoptags 파라미터 값과 영문명 기준 (루씬 API 8.4.0) : https://lucene.apache.org/core/8_4_0/analyzers-nori/org/apache/lucene/analysis/ko/POS.Tag.html
- 한글명 (꼬꼬마 형태소 분석기) : http://kkma.snu.ac.kr/documents/?doc=postag
- 공식문서 7.6버전 : https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-nori-analyzer.html
- 공식가이드북 : https://esbook.kimjmin.net/06-text-analysis/6.7-stemming/6.7.2-nori
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
}
'데이터 관리 > ElasticSearch' 카테고리의 다른 글
Elasticsearch 유사도 알고리즘(similarity) BM25과 TF/IDF (0) | 2020.05.16 |
---|---|
Elasticsearch Object타입과 Nested타입 (0) | 2020.04.26 |
Elasticsearch in action 정리 블로그 발견 (0) | 2020.04.18 |
Elasticsearch 대소문자 색인과 검색 keyword tokenizer VS normalizer (0) | 2020.04.17 |
댓글
이 글 공유하기
다른 글
-
Elasticsearch 유사도 알고리즘(similarity) BM25과 TF/IDF
Elasticsearch 유사도 알고리즘(similarity) BM25과 TF/IDF
2020.05.16 -
Elasticsearch Object타입과 Nested타입
Elasticsearch Object타입과 Nested타입
2020.04.26 -
Elasticsearch in action 정리 블로그 발견
Elasticsearch in action 정리 블로그 발견
2020.04.18 -
Elasticsearch 대소문자 색인과 검색 keyword tokenizer VS normalizer
Elasticsearch 대소문자 색인과 검색 keyword tokenizer VS normalizer
2020.04.17