[ES] Text Analysis
1. text analysis
1) text 형태소 분리(토큰화) : tokenizer
"tokenizer": "whitespace"
: 여백을 기준으로 형태소 분석
>> request
GET _analyze
{
"text": "Home Sweet Home",
"tokenizer": "whitespace"
}
-------------------------------------------------------
>> response
Home / Sweet / Home
2) 형태소 필터링 : filter
"filter": "lowercase"
: 소문자로 변환
"filter": "stop"
: 불용어(the, and 등) 제거
"filter": "snowball"
: ~ing, ~s 등 제거, 단어를 기본 형태로 변환
>> request
GET _analyze
{
"text": "I bought you five roses and ring",
"tokenizer": "whitespace",
"filter": ["lowercase", "stop", "snowball"]
}
-------------------------------------------------------
>> response
i / bought / you / five / rose / ring
3) index에 analyzer 적용
- 위 방법은 analyze API를 활용하여 주어진 text만을 분석
- index에 analyzer를 적용하면, analyzer가 해당 field 데이터를 모두 분석(토큰화,필터링)하여 검색에 반영
>> analyzer 적용
PUT sampleindex
{
"mappings": {
"properties": {
"적용대상field명": {
"type": "text",
"analyzer" : "snowball"
}
}
}
}
--------------------------------------------------------------------------------------------------
>> 'snowball' 적용 후 검색 시
: analyzer가 적용된 field 내 데이터를 그대로 입력하지 않고
**기본 형태만 입력하거나, **해당 단어와 같은 기본 형태를 갖는 그 외 형태를 입력하여 검색해도 검색 가능
예) `develop`이 저장된 경우, `developing`, `developer`로도 검색 가능
4) 사용자 정의 analyzer 생성
>> 사용자 정의 analyzer 생성 및 적용
PUT sampleindex
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"사용자정의analyzer이름": {
"type": "custom",
"tokenizer": "whitespace"
"filter": ["lowercase", "stop", "snowball"]
}
}
}
}
},
"mappings": {
"properties": {
"적용대상field명": {
"type": "text",
"analyzer" : "사용자정의analyzer이름"
}
}
}
}
-------------------------------------------------------
>> 원하는 옵션 선택하여 사용자 정의 analyzer 생성 가능
>> 생성 후 적용까지 해주면 해당 field 데이터 분석, 검색 적용
2. 한글 형태소 분석(nori)
0) nori 한글 형태소 분석기 설치
C:\ElasticStack\elasticsearch-7.11.1\bin>elasticsearch-plugin install analysis-nori
1) 한글 형태소 분리 : nori_tokenizer
- 한글 형태소 분리
@
등 특수문자는 문자로 인식하지 않음
>> request
GET _analyze
{
"tokenizer": "nori_tokenizer",
"text": "뒷동산에 @ 감나무 심기"
}
-------------------------------------------------------
>> response
뒷 / 동산 / 에 / 감 / 나무 / 심기
2) 사용자 정의 사전에 단어 등록 : user_dictionary_rules / user_dictionary
- 위 분석 결과 중
뒷동산
, 감나무
등의 복합어를 하나의 단어로 인식하고 싶을 경우, 해당 단어를 사용자 정의 사전에 등록
- ①
user_dictionary_rules
: tokenizer 지정시 함께 단어 등록
>> 사용자 정의 사전 포함한 tokenizer 생성 및 적용
PUT sampleindex
{
"settings": {
"analysis": {
"analyzer": {
"사용자정의analyzer이름": {
"type": "custom",
"tokenizer": "사용자정의tokenizer이름"
}
},
"tokenizer": {
"사용자정의tokenizer이름": {
"type": "nori_tokenizer",
"user_dictionary_rules": ["뒷동산", "감나무"]
}
}
}
},
"mappings": {
"properties": {
"message": {
"type": "text",
"analyzer": "사용자정의analyzer이름"
}
}
}
}
-------------------------------------------------------
>> 해당 tokenizer 사용
GET _analyze
{
"tokenizer": "사용자정의tokenizer이름",
"text": "뒷동산에 @ 감나무 심기"
}
>> response
뒷동산 / 에 / 감나무 / 심기
- ②
user_dictionary
: C:\ElasticStack\elasticsearch-7.11.1\config
안에 텍스트 파일 생성하여 단어 등록
>> 사용자 정의 사전 포함한 tokenizer 생성
PUT sampleindex
{
"settings": {
"analysis": {
"tokenizer": {
"사용자정의tokenizer이름": {
"type": "nori_tokenizer",
"user_dictionary": "텍스트파일명.txt"
}
},
"analyzer": {
"사용자정의analyzer이름": {
"type": "custom",
"tokenizer": "사용자정의tokenizer이름"
}
}
}
},
"mappings": {
"properties": {
"message": {
"type": "text",
"analyzer": "사용자정의analyzer이름"
}
}
}
}
-------------------------------------------------------
>> 해당 tokenziser 사용
GET _analyze
{
"tokenizer": "사용자정의tokenizer이름",
"text": "뒷동산에 @ 감나무 심기"
}
>> response
뒷동산 / 에 / 감나무 / 심기
3) 복합어 처리 방식 : decompound_mode(none / discard / mixed)
none
: 복합어 분리하지 않고, 원본만 그대로 출력
discard
: 복합어 분리하여 출력(원본은 출력X)
mixed
: 복합어 분리하여 출력하고, 원본도 함께 출력
>> 각각의 decompound_mode를 포함한 tokenizer 생성
PUT my_nori
{
"settings": {
"analysis": {
"tokenizer": {
"nori_none": {
"type": "nori_tokenizer",
"decompound_mode": "none"
},
"nori_discard": {
"type": "nori_tokenizer",
"decompound_mode": "discard"
},
"nori_mixed": {
"type": "nori_tokenizer",
"decompound_mode": "mixed"
}
}
}
}
}
-------------------------------------------------------
>> 1) "none" 모드 tokenizer 사용
GET my_nori/_analyze
{
"tokenizer": "nori_none",
"text": "삼성전자"
}
>> response
삼성전자
------------------------------------
>> 2) "discard" 모드 tokenizer 사용
GET my_nori/_analyze
{
"tokenizer": "nori_discard",
"text": "삼성전자"
}
>> response
삼성 / 전자
------------------------------------
>> 3) "mixed" 모드 tokenizer 사용
GET my_nori/_analyze
{
"tokenizer": "nori_mixed",
"text": "삼성전자"
}
>> response
삼성전자 / 삼성 / 전자
4) 품사 필터(특정 품사 제외) : nori_part_of_speeck - stoptags
- 한글 형태소 분석시 조사(은,는,이/가) 등 의미를 갖지 않는 품사를 필터링 하기 위함
- 필요에 따라 의미를 갖는 품사도 필터링 할 수 있음
- 품사별 입력 태그는 꼬꼬마 한국어 형태소 분석기, 한글 형태소 품사 (Part Of Speech, POS) 태그표 에서 확인할 수 있음
>> 품사 필터 포함한 analyzer 생성
PUT my_nori
{
"settings": {
"analysis": {
"analyzer": {
"사용자정의analzer이름": {
"tokenizer": "nori_tokenizer",
"filter": ["사용자정의filter이름"]
}
},
"filter": {
"사용자정의filter이름": {
"type": "nori_part_of_speech",
"stoptags": ["J"] # "J"는 조사, 해당 필터는 조사 제외 필터
}
}
}
}
}
-------------------------------------------------------
>> 해당 analyzer 사용
GET my_nori/_analyze
{
"analyzer": "사용자정의analzer이름",
"text": "그대 이름은 장미"
}
>> response
그대 / 이름 / 장미 # 조사 "은" 제거됨
5) 형태소별 품사 확인 : explain
- 품사 필터를 사용하기 전, 형태소별 품사 확인이 필요할 경우 사용
"explain": true
옵션 적용
>> request
GET _analyze
{
"tokenizer": "nori_tokenizer",
"explain": true,
"text": "그대 이름은 장미"
}
-------------------------------------------------------
>> response
그대 "NP(Pronoun)"
이름 "NNG(General Noun)"
은 "J(Ending Particle)"
장미 "NNG(General Noun)"
6) 한자 한글 변환 필터 : nori_readingform
- text 중 한자 값을 한글로 변환해주는 필터
>> 한자 한글 변환 필터 포함한 analyzer 생성
PUT my_nori
{
"settings": {
"analysis": {
"analyzer": {
"사용자정의analyzer이름": {
"tokenizer": "nori_tokenizer",
"filter": ["nori_readingform"]
}
}
}
}
}
-------------------------------------------------------
>> 해당 analyzer 사용
GET my_nori/_analyze
{
"analyzer": "사용자정의analyzer이름",
"text": "中國"
}
>> response
중국
Author And Source
이 문제에 관하여([ES] Text Analysis), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@geesuee/ES-Text-Analysis
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
"tokenizer": "whitespace"
: 여백을 기준으로 형태소 분석>> request
GET _analyze
{
"text": "Home Sweet Home",
"tokenizer": "whitespace"
}
-------------------------------------------------------
>> response
Home / Sweet / Home
"filter": "lowercase"
: 소문자로 변환"filter": "stop"
: 불용어(the, and 등) 제거"filter": "snowball"
: ~ing, ~s 등 제거, 단어를 기본 형태로 변환>> request
GET _analyze
{
"text": "I bought you five roses and ring",
"tokenizer": "whitespace",
"filter": ["lowercase", "stop", "snowball"]
}
-------------------------------------------------------
>> response
i / bought / you / five / rose / ring
>> analyzer 적용
PUT sampleindex
{
"mappings": {
"properties": {
"적용대상field명": {
"type": "text",
"analyzer" : "snowball"
}
}
}
}
--------------------------------------------------------------------------------------------------
>> 'snowball' 적용 후 검색 시
: analyzer가 적용된 field 내 데이터를 그대로 입력하지 않고
**기본 형태만 입력하거나, **해당 단어와 같은 기본 형태를 갖는 그 외 형태를 입력하여 검색해도 검색 가능
예) `develop`이 저장된 경우, `developing`, `developer`로도 검색 가능
>> 사용자 정의 analyzer 생성 및 적용
PUT sampleindex
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"사용자정의analyzer이름": {
"type": "custom",
"tokenizer": "whitespace"
"filter": ["lowercase", "stop", "snowball"]
}
}
}
}
},
"mappings": {
"properties": {
"적용대상field명": {
"type": "text",
"analyzer" : "사용자정의analyzer이름"
}
}
}
}
-------------------------------------------------------
>> 원하는 옵션 선택하여 사용자 정의 analyzer 생성 가능
>> 생성 후 적용까지 해주면 해당 field 데이터 분석, 검색 적용
0) nori 한글 형태소 분석기 설치
C:\ElasticStack\elasticsearch-7.11.1\bin>elasticsearch-plugin install analysis-nori
1) 한글 형태소 분리 : nori_tokenizer
- 한글 형태소 분리
@
등 특수문자는 문자로 인식하지 않음
>> request
GET _analyze
{
"tokenizer": "nori_tokenizer",
"text": "뒷동산에 @ 감나무 심기"
}
-------------------------------------------------------
>> response
뒷 / 동산 / 에 / 감 / 나무 / 심기
2) 사용자 정의 사전에 단어 등록 : user_dictionary_rules / user_dictionary
- 위 분석 결과 중
뒷동산
,감나무
등의 복합어를 하나의 단어로 인식하고 싶을 경우, 해당 단어를 사용자 정의 사전에 등록 - ①
user_dictionary_rules
: tokenizer 지정시 함께 단어 등록
>> 사용자 정의 사전 포함한 tokenizer 생성 및 적용
PUT sampleindex
{
"settings": {
"analysis": {
"analyzer": {
"사용자정의analyzer이름": {
"type": "custom",
"tokenizer": "사용자정의tokenizer이름"
}
},
"tokenizer": {
"사용자정의tokenizer이름": {
"type": "nori_tokenizer",
"user_dictionary_rules": ["뒷동산", "감나무"]
}
}
}
},
"mappings": {
"properties": {
"message": {
"type": "text",
"analyzer": "사용자정의analyzer이름"
}
}
}
}
-------------------------------------------------------
>> 해당 tokenizer 사용
GET _analyze
{
"tokenizer": "사용자정의tokenizer이름",
"text": "뒷동산에 @ 감나무 심기"
}
>> response
뒷동산 / 에 / 감나무 / 심기
- ②
user_dictionary
:C:\ElasticStack\elasticsearch-7.11.1\config
안에 텍스트 파일 생성하여 단어 등록
>> 사용자 정의 사전 포함한 tokenizer 생성
PUT sampleindex
{
"settings": {
"analysis": {
"tokenizer": {
"사용자정의tokenizer이름": {
"type": "nori_tokenizer",
"user_dictionary": "텍스트파일명.txt"
}
},
"analyzer": {
"사용자정의analyzer이름": {
"type": "custom",
"tokenizer": "사용자정의tokenizer이름"
}
}
}
},
"mappings": {
"properties": {
"message": {
"type": "text",
"analyzer": "사용자정의analyzer이름"
}
}
}
}
-------------------------------------------------------
>> 해당 tokenziser 사용
GET _analyze
{
"tokenizer": "사용자정의tokenizer이름",
"text": "뒷동산에 @ 감나무 심기"
}
>> response
뒷동산 / 에 / 감나무 / 심기
3) 복합어 처리 방식 : decompound_mode(none / discard / mixed)
none
: 복합어 분리하지 않고, 원본만 그대로 출력discard
: 복합어 분리하여 출력(원본은 출력X)mixed
: 복합어 분리하여 출력하고, 원본도 함께 출력
>> 각각의 decompound_mode를 포함한 tokenizer 생성
PUT my_nori
{
"settings": {
"analysis": {
"tokenizer": {
"nori_none": {
"type": "nori_tokenizer",
"decompound_mode": "none"
},
"nori_discard": {
"type": "nori_tokenizer",
"decompound_mode": "discard"
},
"nori_mixed": {
"type": "nori_tokenizer",
"decompound_mode": "mixed"
}
}
}
}
}
-------------------------------------------------------
>> 1) "none" 모드 tokenizer 사용
GET my_nori/_analyze
{
"tokenizer": "nori_none",
"text": "삼성전자"
}
>> response
삼성전자
------------------------------------
>> 2) "discard" 모드 tokenizer 사용
GET my_nori/_analyze
{
"tokenizer": "nori_discard",
"text": "삼성전자"
}
>> response
삼성 / 전자
------------------------------------
>> 3) "mixed" 모드 tokenizer 사용
GET my_nori/_analyze
{
"tokenizer": "nori_mixed",
"text": "삼성전자"
}
>> response
삼성전자 / 삼성 / 전자
4) 품사 필터(특정 품사 제외) : nori_part_of_speeck - stoptags
- 한글 형태소 분석시 조사(은,는,이/가) 등 의미를 갖지 않는 품사를 필터링 하기 위함
- 필요에 따라 의미를 갖는 품사도 필터링 할 수 있음
- 품사별 입력 태그는 꼬꼬마 한국어 형태소 분석기, 한글 형태소 품사 (Part Of Speech, POS) 태그표 에서 확인할 수 있음
>> 품사 필터 포함한 analyzer 생성
PUT my_nori
{
"settings": {
"analysis": {
"analyzer": {
"사용자정의analzer이름": {
"tokenizer": "nori_tokenizer",
"filter": ["사용자정의filter이름"]
}
},
"filter": {
"사용자정의filter이름": {
"type": "nori_part_of_speech",
"stoptags": ["J"] # "J"는 조사, 해당 필터는 조사 제외 필터
}
}
}
}
}
-------------------------------------------------------
>> 해당 analyzer 사용
GET my_nori/_analyze
{
"analyzer": "사용자정의analzer이름",
"text": "그대 이름은 장미"
}
>> response
그대 / 이름 / 장미 # 조사 "은" 제거됨
5) 형태소별 품사 확인 : explain
- 품사 필터를 사용하기 전, 형태소별 품사 확인이 필요할 경우 사용
"explain": true
옵션 적용
>> request
GET _analyze
{
"tokenizer": "nori_tokenizer",
"explain": true,
"text": "그대 이름은 장미"
}
-------------------------------------------------------
>> response
그대 "NP(Pronoun)"
이름 "NNG(General Noun)"
은 "J(Ending Particle)"
장미 "NNG(General Noun)"
6) 한자 한글 변환 필터 : nori_readingform
- text 중 한자 값을 한글로 변환해주는 필터
>> 한자 한글 변환 필터 포함한 analyzer 생성
PUT my_nori
{
"settings": {
"analysis": {
"analyzer": {
"사용자정의analyzer이름": {
"tokenizer": "nori_tokenizer",
"filter": ["nori_readingform"]
}
}
}
}
}
-------------------------------------------------------
>> 해당 analyzer 사용
GET my_nori/_analyze
{
"analyzer": "사용자정의analyzer이름",
"text": "中國"
}
>> response
중국
Author And Source
이 문제에 관하여([ES] Text Analysis), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@geesuee/ES-Text-Analysis저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)