2.X/3. Dealing with Human Language

3-3-5. Unicode Character Folding

drscg 2017. 9. 24. 17:16

In the same way as the lowercase token filter is a good starting point for many languages but falls short when exposed to the entire tower of Babel, so the asciifolding token filter requires a more effective Unicode character-folding counterpart for dealing with the many languages of the world.

lowercase token filter와 동일한 방식이 많은 언어에 대해 좋은 출발점이지만, 비현실적인 계획(the entire tower of Babel) 앞에서는 부족하다. 따라서, asciifolding token filter는 세계의 많은 언어를 처리하기 위해, 더 효율적인 Unicode 문자 변경(character folding) filter를 필요로 한다.

The icu_folding token filter (provided by the icu plug-in) does the same job as the asciifoldingfilter, but extends the transformation to scripts that are not ASCII-based, such as Greek, Hebrew, Han, conversion of numbers in other scripts into their Latin equivalents, plus various other numeric, symbolic, and punctuation transformations.

icu plug-in에서 제공하는, icu_folding token filter는 asciifolding filter와 동일한 역활을 하지만, ASCII 기반이 아닌, 그리스어(Greek), 히브리어(Hebrew) 같은 문자의 변경, 다른 문자의 숫자를 해당하는 라틴어로 변경, 추가로 다양한 숫자, 기호, 문장 부호의 변환을 추가로 포함한다.

The icu_folding token filter applies Unicode normalization and case folding from nfkc_cfautomatically, so the icu_normalizer is not required:

icu_folding token filter는, Unicode 정규화와, 대소문자 변경 형식인 nfkc_cf 가 자동으로 적용된다. 따라서, icu_normalizer 는 필요하지 않다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_folder": {
          "tokenizer": "icu_tokenizer",
          "filter":  [ "icu_folding" ]
        }
      }
    }
  }
}

GET /my_index/_analyze?analyzer=my_folder
١٢٣٤٥ 

아라비아 숫자 ١٢٣٤٥ 는 해당하는 라틴어로 변경된다: 12345

If there are particular characters that you would like to protect from folding, you can use aUnicodeSet (much like a character class in regular expressions) to specify which Unicode characters may be folded. For instance, to exclude the Swedish letters åäöÅÄ, and Ö from folding, you would specify a character class representing all Unicode characters, except for those letters: [^åäöÅÄÖ] (^ means everything except).

변경하지 않으려는 특별한 문자가 있다면, 변경할 Unicode 문자를 지정하기 위해, UnicodeSet (정규 표현식에서 character class와 매우 유사)을 사용할 수 있다. 예를 들어, 스웨덴어(Swedish) 문자 åäöÅÄÖ 를 변경에서 제외하기 위해, 해당 문자([^åäöÅÄÖ])를 제외한(^제외한 모두 라는 의미), 모든 Unicode 문자를 나타내는 character class를 지정해야 한다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "swedish_folding": { 
          "type": "icu_folding",
          "unicodeSetFilter": "[^åäöÅÄÖ]"
        }
      },
      "analyzer": {
        "swedish_analyzer": { 
          "tokenizer": "icu_tokenizer",
          "filter":  [ "swedish_folding", "lowercase" ]
        }
      }
    }
  }
}

swedish_folding token filter는, 스웨덴어 문자를 제외하고, 대소문자 모두를 처리하는,icu_folding token filter를 사용자 정의한다.

swedish analyzer는 먼저 단어를 token으로 만든다. 그 다음에 swedish_folding filter를 사용하여 각 token을 변형한다. 그리고, ÅÄ 또는 Ö 문자를 제외하고, 대문자를 포함하고 있는 경우, 각 문자를 소문자로 만든다.


'2.X > 3. Dealing with Human Language' 카테고리의 다른 글

3-3-3. Living in a Unicode World  (0) 2017.09.24
3-3-4. Unicode Case Folding  (0) 2017.09.24
3-3-6. Sorting and Collations  (0) 2017.09.24
3-4. Reducing Words to Their Root Form  (0) 2017.09.24
3-4-1. Algorithmic Stemmers  (0) 2017.09.24