[ES] Text Analysis

53965 단어 TILTIL

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

>> 품사 필터 포함한 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
중국

좋은 웹페이지 즐겨찾기