Elasticsearch를 사용하여 analyze를 사용하다가 조사, 형용사 등등을 제외하고 형태소 토크나이즈가 되어야 했다. 그래서 정식 문서를 찾아보더니 nori_part_of_speech라는 필터가 있었다.
우선 저번 시간에 만들었던 wedul_analyzer 인덱스를 이용해서 토크나이즈를 해보자.
{
"tokens": [
{
"token": "바보",
"start_offset": 0,
"end_offset": 2,
"type": "word",
"position": 0
},
{
"token": "위들",
"start_offset": 3,
"end_offset": 5,
"type": "word",
"position": 1
},
{
"token": "이",
"start_offset": 5,
"end_offset": 6,
"type": "word",
"position": 2
},
{
"token": "집에",
"start_offset": 7,
"end_offset": 9,
"type": "word",
"position": 3
},
{
"token": "서",
"start_offset": 9,
"end_offset": 10,
"type": "word",
"position": 4
},
{
"token": "나",
"start_offset": 11,
"end_offset": 12,
"type": "word",
"position": 5
},
{
"token": "왔다",
"start_offset": 12,
"end_offset": 14,
"type": "word",
"position": 6
}
]
}
여기서 '나'와 '왔다'를 없애고 토크나이즈 결과가 나왔으면 좋겠다.
그럼 '나'와 '왔다'의 형태소가 어떻게 되는지 우선 알아보자. analyzer api에 explain: true 옵션을 부여하면 해당 토크나이즈에 분리된 형태소들의 정보가 나온다.
GET _analyze
{
"analyzer": "nori",
"explain": true,
"text": "바보 위들이 집에서 나왔다"
}
'나'와 '왔다'는 NP와 UNKNOWN이다. 이 두개를 nori_part_of_speech필터를 이용해서 제거해보자.
{
"token": "나",
"start_offset": 11,
"end_offset": 12,
"type": "word",
"position": 6,
"bytes": "[eb 82 98]",
"leftPOS": "NP(Pronoun)",
"morphemes": null,
"posType": "MORPHEME",
"positionLength": 1,
"reading": null,
"rightPOS": "NP(Pronoun)",
"termFrequency": 1
},
{
"token": "왔다",
"start_offset": 12,
"end_offset": 14,
"type": "word",
"position": 7,
"bytes": "[ec 99 94 eb 8b a4]",
"leftPOS": "UNKNOWN(Unknown)",
"morphemes": null,
"posType": "MORPHEME",
"positionLength": 1,
"reading": null,
"rightPOS": "UNKNOWN(Unknown)",
"termFrequency": 1
}
custom analyzer를 만들면서 nori_part_of_speech 필터를 추가해주면된다. 이 필터에서 stoptags 배열에 제거하고 싶은 형태소 요형을 추가하면 해당 형태소를 제거한 결과만 출력된다.
PUT wedul_anaylyzer
{
"settings": {
"index" : {
"analysis" : {
"tokenizer": {
"nori_user_dict": {
"type": "nori_tokenizer",
"decompound_mode": "none",
"user_dictionary": "dic/nori_userdict_ko.txt"
}
},
"analyzer" : {
"custom_analyze" : {
"type": "custom",
"tokenizer" : "nori_user_dict",
"filter": [
"my_posfilter"
]
}
},
"filter": {
"my_posfilter": {
"type": "nori_part_of_speech",
"stoptags": [
"NP", "UNKNOWN"
]
}
}
}
}
}
}
이렇게 만든 analyze를 이용해서 다시한번 확인해보자.
아래 결과 처럼 '나'와 '왔다' 두개의 형태소가 사라진 것을 확인할 수 있다.
{
"tokens": [
{
"token": "바보",
"start_offset": 0,
"end_offset": 2,
"type": "word",
"position": 0
},
{
"token": "위들",
"start_offset": 3,
"end_offset": 5,
"type": "word",
"position": 1
},
{
"token": "이",
"start_offset": 5,
"end_offset": 6,
"type": "word",
"position": 2
},
{
"token": "집에",
"start_offset": 7,
"end_offset": 9,
"type": "word",
"position": 3
},
{
"token": "서",
"start_offset": 9,
"end_offset": 10,
"type": "word",
"position": 4
}
]
}
기본적으로 stoptags를 적용하지 않으면 10몇가지의 형태소 종류가 기본으로 배제된다.
NP, VPC등 형태소들에 대한 용어는 하단 사이트에 잘 정리되어 있다.
https://coding-start.tistory.com/167
http://kkma.snu.ac.kr/documents/?doc=postag
출처
https://www.elastic.co/guide/en/elasticsearch/plugins/6.4/analysis-nori-speech.html
'데이터베이스 > Elasticsearch' 카테고리의 다른 글
Elasticsearch reindex시 alias를 사용하여 무중단으로 진행하기 & big index 리인덱싱 시 비동기 처리 방법 (4) | 2019.07.01 |
---|---|
Elasticsearch nori 형태소 분석기에서 readingform filter를 이용해서 한자 내용을 한글로 변환하기 (0) | 2019.06.18 |
Elasticsearch에서 Dictionary 변경 시 analyzer와 인덱싱된 Document 갱신 방법 (2) | 2019.06.15 |
[번역] Elasticsearch 퍼포먼스 튜닝 방법 - ebay (1) | 2019.06.12 |
Elasticsearch template를 일별 index 구성하기 (0) | 2019.06.12 |