[ElasticSearch] 데이터 색인과 텍스트 분석 - 2

donghyeok·2023년 2월 22일

ElasticSearch

목록 보기
7/8

4. 캐릭터 필터 (Character Filter)

캐릭터 필터는 애널라이저에서 가장 먼저 처리되는 과정으로 토크나이저에 의해 텀으로 분리되기 전에 전체 문장에 대해 적용되는 일종의 전처리 도구이다. 7.0 버전 기준으로 캐릭터 필터는 HTML Strip, Mapping, Pattern Replace 3개가 존재한다. 캐릭터 필터는 char_filter 항목에 배열로 입력한다.

HTTML Strip

입력된 텍스트가 HTML인 경우 HTML 태그를 제거하여 일반 텍스트로 만든다.

//char_filter를 이용하여 HTML 문장 처리 
POST _analyze
{
 	"tokenizer" : "keyword",
  	"char_filter" : [
      	"html_strip"
      ],
  	"text" : "<p>I&apos;m so <b>happy</b>!</p>"
}
--> "I'm so happy!"로 변경 

Mapping

Mapping 캐릭터 필터를 이용하면 지정된 단어를 다른 단어로 치환할 수 있다.
특수문자 등을 포함하는 검색기능을 구현하려는 경우 반드시 적용해야해서 실제 캐릭터 필터 중에는 가장 많이 쓰인다. (Standard 애널라이저 및 대다수 애널라이저들은 특수문자를 제거함)

//캐릭터 필터 설정 예시
PUT index
{
 "setting" : {
	"analysis" : {
     	"coding_analyzer" : {
          	"char_filter" : [
            	"cpp_char_filter"  
            ],
          	"tokenizer" : "whitespace",
          	"filter" : ["lowercase", "stop", "snowball"]
        }
    },
   	"char_filter": {
     	"cpp_char_filter": {
         	"type": "mapping",
          	"mappings": [ "+ => _plus_", "- => _minus_" ]
        }
    }
 },
 "mapping": {
  	"properties": {
     	"language": {
         	"type": "text",
          	"analyzer": "coding_analyzer"
        }
    }
 }
}

Pattern Replace

Pattern Replace 캐릭터 필터는 정규식을 이용해 좀 더 복잡한 패턴들을 치환할 수 있는 필터이다.
다음은 카멜 표기법으로 된 단어를 대문자 시작시마다 공백을 삽입하여 세부 단어별로 토크나이징 될 수 있도록 애널라이저를 생성하는 예제이다.

PUT index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "camel_analyzer": {
          "char_filter": [
            "camel_filter"
          ],
          "tokenizer": "standard",
          "filter": [
            "lowercase"
          ]
        }
      },
      "char_filter": {
        "camel_filter": {
          "type": "pattern_replace",
          "pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
          "replacement": " "
        }
      }
    }
  }
}

5. 토크나이저 (Tokenizer)

데이터 색인 과정에서 검색에 가장 큰 영향을 미치는 단계가 토크나이저이다. 토크나이저는 반드시 한 개만 사용이 가능하다.

Standard, Letter, Whitespace

일반적으로 가장 많이 사용되고 기능이 유사하지만 다른특징들이 있는 토크나이저들이다.

  • Standard Tokenizer
    - 공백으로 텀을 구분하면서 "@"와 같은 일부 특수문자를 제거한다. 단어 끝에 있는 특수문자는 제거되지만 단어 중간에 있는 마침표나 밑줄 등은 제거나 분리되지 않는다.
  • Letter Tokenizer
    - 알파벳을 제외한 모든 공백, 숫자, 기호들을 기준으로 텀을 분리한다.
  • Whitespace Tokenizer
    - 스페이스, 탭, 줄바꿈 같은 공백만을 기준으로 텀을 분리한다.

UAX URL Email

보통 토크나이저는 특수문자들을 공백과 마찬가지로 제거하고 분리한다.
UAX URL Email 토크나이저는 이메일 주소와 웹 URL 경로는 분리하지 않고 하나의 텀으로 저장한다.

Pattern

필요한 문자를 구분자로 사용하여 텀을 분리하고 싶은 경우 사용할 수 있는 토크나이저이다.
Pattern 토크나이저는 분리할 패턴을 기호 또는 Java 정규식 형태로 지정 가능하다.
아래는 / 기호로 텀을 분리하는 Pattern 토크나이저를 생성하는 예제이다.

PUT pat_tokenizer
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "my_pat_tokenizer": {
          "type": "pattern",
          "pattern": "/"
        }
      }
    }
  }
}

Path Hierarchy

디렉토리나 파일 경로등은 흔하게 저장되는 데이터이다. Path Hierarchy 토큰나이저는 경로 데이터를 계층별로 저장해서 하위 디렉토리에 속한 도큐먼트들을 수준별로 검색하거나 집계하는 것이 가능하다.
delimiter 속성을 이용해 구분자를 대치할 수도 있다.

POST _analyze
{
  "tokenizer": "path_hierarchy",
  "text": "/usr/share/elasticsearch/bin"
}
-> /usr
-> /usr/share
-> /usr/share/elasticsearch
-> /usr/share/elasticsearch/bin
텀으로 저장됨.

6. 토큰 필터 (Token Filter)

토크나이저에 의해 텀 분리 과정 이후에는 각각의 텀들을 지정한 규칙에 따라 처리해주는데 이를 담당하는 것이 토큰 필터이다.
토큰 필터는 filter 항목에 배열로 나열해서 지정한다.

Lowercase, Uppercase

텀의 텍스트를 모두 소문자로 변경하거나 모두 대문자로 변경한다.

Stop

Stopword(불용어)란 영문에서 the, is, a 등 검색에서 큰 의미가 없는 조사나 전치사들을 말한다.
Stop 토큰 필터를 적용하면 불용어에 해당하는 텀들을 제거한다.
적용할 불용어는 배열 형태로 직접 지정할 수도 있고 파일을 참조하여 파일 내에 불용어들을 저장하여 지정할 수도 있다.

Synonym

검색 서비스에 따라 동의어를 제공해야 하는 경우가 있다. 예를 들어 클라우드 서비스 정보 검색 시에 AWS, Amazon, 아마존 등은 함께 검색 되도록하면 더욱 효과적이다.
이럴 경우 Synonym 토큰 필터를 통해 동의어 저장이 가능하다.

동의어 사전 명시 규칙에는 다음 내용이 있다.

"A, B => C" : 왼쪽의 A, B 대신 C 텀을 저장. A, B로는 C 검색이 가능하지만 C로 A, B 검색 불가.
"A, B" : A, B 각 텀이 A, B 두 개의 텀을 모두 저장. A와 B는 서로 검색 가능하다. 

Synonym 역시 파일을 참조하여 동의어를 저장하여 경로를 지정해 줄 수 있다.
expand, lenient 같은 옵션들이 있으니 확인해보자.

NGram, Edge NGram, Shingle

  • NGram
    - 단어에 대해 N개의 글자 부분을 모두 검색 토큰으로 저장한다.
    - ex) house -> ho, ou, us, se 저장
    - 저장되는 텀의 갯수가 기하급수적으로 늘어나기 때문에 전체 개수가 많지 않은 데이터 집단에 자동완성 같은 기능을 구현할 때 적합하다.
  • Edge NGram
    - 단어에 대해 앞쪽에서부터 min_gram 개의 글자부터 max_gram개의 글자까지 모두 저장
    - ex) min_gram : 1, max_gram : 4 / house -> h, ho, hou, hous 저장
  • Shingle
    - Gram이 글자를 기준으로 토큰을 확장했다면 Shingle은 단어 단위로 토큰을 확장한다.
    - ex) this is my house -> this is, is my, my house 저장

Unique

여러 텀에 대하여 동일한 텀들은 삭제해주는 토큰 필터이다.
ex) "white fox, white rabbit, white bear" -> "white", "fox", "rabbit", "bear"
match 쿼리를 이용해 정확도를 따져야 하는 검색의 경우에는 사용하지 않는 것이 좋다.
(텀의 개수가 줄어들어 TF(Term Frequency) 값이 줄어 스코어가 줄어든다.

출처 : https://esbook.kimjmin.net/

0개의 댓글