공부메모 & 오류해결/Spring Boot

[Elasticsearch] 엘라스틱 서치의 Analyzer, Tokenizer 정리(Nori_tokenizer)

남건욱 2024. 4. 18. 16:22

목차

    반응형

    1. Analyzer 기본 설정 (standard)

    아무런 설정을 하지 않으면 Standard Analyzer가 사용되며 한글 타입은 단순 토큰화만되고 형태소 분석 등은 이루어지지 않음

     

     

     

     

     

    2. 추천 Nori_tokenizer

    PUT /library_index
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "custom_korean_analyzer": {
              "type": "custom",
              "tokenizer": "nori_tokenizer",
              "filter": ["nori_readingform", "lowercase", "nori_part_of_speech"]
            }
          }
        }
      }
    }

    사용된 필터

    nori_tokenizer: 기본 형태소 분석기로 한글 텍스트를 형태소 단위로 분석

    nori_readingform: 한자가 포함된 텍스트를 한글 읽기 형태로 변환. 이는 한자를 사용하는 책 제목이 한글로도 검색될 수 있도록 설정

    lowercase: 영어 책 제목에 포함된 대문자를 소문자로 변환하여, 대소문자 구분 없이 검색할 수 있도록 설정

    nori_part_of_speech: 불필요한 품사를 제거하여 인덱싱을 더 효율적으로 생성

     

     

     

     

    사진) nori_part_of_speech 품사코드 정보 (출처 : 꼬꼬마 한국어 형태소 분석기)

     

     

     

     

    stoptags 기본값

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

     

     

     

     

    커스텀 설정 예시

    "filter": {
      "my_pos_filter": {
        "type": "nori_part_of_speech",
        "stoptags": ["E", "IC", "J", "MAG", "MM", "SP", "SSC", "SSO", "SC", "SE"]
        }
    }

     

     

    3. decompound_mode 옵션 3가지 (Nori_tokenizer)

    : 합성어의 저장 방식을 결정

     

    none : 어근을 분리하지 않고 완성된 합성어만 저장

    ex) 백두산이 -> 백두산,

     

    discard (기본값) : 합성어를 분리하여 각 어근만 저장

    ex) 백두산이 -> 백두, ,

     

    mixed : 어근과 합성어를 모두 저장

    ex) 백두산이 -> 백두산, 백두, ,

     

     

     

     

    4. N-GRAM

    : N-gram은 텍스트를 고정된 크기의 조각(gram)으로 나누는 방법으로, 이러한 조각들을 사용하여 텍스트 분석을 수행

     

    ex)

    PUT my_ngram
    {
      "settings": {
        "analysis": {
          "filter": {
            "my_ngram_f": {
              "type": "nGram",
              "min_gram": 2,
              "max_gram": 3
            }
          },
          "analyzer": {
            "my_ngram_analyzer": {
              "type": "custom",
              "tokenizer": "keyword",
              "filter": ["my_ngram_f"]
            }
          }
        }
      }
    }
    
    GET my_ngram/_analyze
    {
      "analyzer": "my_ngram_analyzer",
      "text": "한글테스트"
    }

    분석 결과: "한글", "한글테", "글테", "글테스", "테스", "테스트", "스티", "

     

     

    5. N-GRAM 종류

    : N-gram은 문장을 몇 개의 단어 개수에 따라 나눌지에 따라 종류가 결정. 문장 부호 전처리 가정 하에 종류별 예시.

     

    문장

    -> "오늘 점심 추천 메뉴: 파스타, 피자"

      모델명 구현 결과
    1 Unigram(N=1) 오늘, 점심, 추천, 메뉴, 파스타, 피자
    2 Bigram(N=2) 오늘 점심, 점심 추천, 추천 메뉴, 메뉴 파스타, 파스타 피자
    3 Trigram(N=3) 오늘 점심 추천, 점심 추천 메뉴, 추천 메뉴 파스타, 메뉴 파스타 피자
    4 4-gram(N=4) 오늘 점심 추천 메뉴, 점심 추천 메뉴 파스타추천 메뉴 파스타 피자

     

     

     

     

     

    6. N-GRAM 장단점

     

    장점

    단순하고 유연한 구현: N-gram 모델은 구현이 비교적 간단하며, 다양한 크기의 N을 선택함으로써 분석의 정밀도와 커버리지를 조절할 수 있는 유연성을 제공.

     

    부분 문자열 검색에 유리: 텍스트를 부분적인 시퀀스로 분해하기 때문에, 완전히 일치하지 않는 검색어에 대해서도 유연한 검색이 가능. 이는 오타가 있거나 부분적으로만 일치하는 검색어에 대해서도 좋은 성능을 보임.

     

    문맥 파악 가능성: 특히 큰 N값을 사용할 경우, 인접한 요소 간의 관계를 반영하여 문맥을 일정 부분 파악 가능. 문서 분류 작업에 유용하게 활용될 수 있음

     

    단점

    인덱스 크기와 리소스 사용의 증가: N의 값이 크면 생성되는 N-gram의 수가 기하급수적으로 증가하므로, 데이터 저장과 처리에 필요한 리소스가 상당히 증가.

     

    경계 처리 문제: 텍스트의 시작과 끝에서 N-gram이 제대로 형성되지 않거나, 어절의 경계가 모호해질 수 있음. 특히, 언어에 따라 어절의 경계를 정확히 반영하지 못하는 문제가 발생할 수 있음.

     

    반응형
    프로필사진

    남건욱's 공부기록