2.X/3. Dealing with Human Language

3-3-4. Unicode Case Folding

drscg 2017. 9. 24. 17:18

Humans are nothing if not inventive, and human language reflects that. Changing the case of a word seems like such a simple task, until you have to deal with multiple languages.

인간이 창의적이지 않으면 아무것도 아니다. 그리고 인간의 언어는 이것을 반영한다. 단어의 대/소문자를 변경하는 것은 다양한 언어를 다루기 전까지는, 간단한 작업처럼 보인다.

Take, for example, the lowercase German letter ß. Converting that to upper case gives you SS, which converted back to lowercase gives you ss. Or consider the Greek letter ς (sigma, when used at the end of a word). Converting it to uppercase results in Σ, which converted back to lowercase, gives you σ.

독일어(German) 소문자 ß 를 예로 들어보자. 대문자로 변경하면 SS 가 되나, 이를 다시 소문자로 변경하면 ss 가 된다. 또는 그리스(Greek) 문자 ς(sigma, 단어의 마지막에 사용되는 경우)를 보면, 대문자로 바꾸면 Σ 가 되고, 다시 소문자로 변경하면 σ 가 된다.

The whole point of lowercasing terms is to make them more likely to match, not less! In Unicode, this job is done by case folding rather than by lowercasing. Case folding is the act of converting words into a (usually lowercase) form that does not necessarily result in the correct spelling, but does allow case-insensitive comparisons.

단어를 소문자로 변경하는 상황의 요점은 덜 일치하는 것을  일치할 것 같은 것으로 만드는 것이다. Unicode에서, 이 작업은 소문자화(lowercasing)라기보다는 대/소문자 변경(case folding)이다. 대/소문자 변경 은 단어를, 필연적으로 올바른 철자가 되지 않는, 그러나 대소문자 구분 없는 비교를 할 수 있는 (일반적으로 소문자) 형태로, 변경하는 작업이다.

For instance, the letter ß, which is already lowercase, is folded to ss. Similarly, the lowercase ς is folded to σ, to make σς, and Σ comparable, no matter where the letter appears in a word.

예를 들어, 문자 ß 는 이미 소문자 ss 로 변경되었다(folded). 유사하게, 소문자 ς 는 σ 를 만들기 위해, σ로 변경되었다. 그 문자가 단어의 어디에 나타나든지 관계없이, ς 와 Σ 는 비교가 가능하다.

The default normalization form that the icu_normalizer token filter uses is nfkc_cf. Like the nfkcform, this does the following:

icu_normalizer token filter가 사용하는 기본 정규화 형식은 nfkc_cf 이다. nfkc 와 비슷한데, 다음과 같이 동작한다.

  • Composes characters into the shortest byte representation

    글자를 가장 짧은 byte로 표현하도록 합성(compose).

  • Uses compatibility mode to convert characters like  into the simpler ffi

     같은 글자를 더 간단한 ffi 로 바꾸기 위해 호환(compatibility) 모드를 사용.

But it also does this:

하지만, 다음과 같이 동작하기도 한다.

  • Case-folds characters into a form suitable for case comparison

    대소문자 비교에 적합한 형태로 문자를 대소문자 변경(case-folds).

In other words, nfkc_cf is the equivalent of the lowercase token filter, but suitable for use with all languages. The on-steroids equivalent of the standard analyzer would be the following:

즉, nfkc_cf 는 lowercase token filter와 동일하다. 그러나, 모든 언어와 함께 사용하기에 적합하다. 아래 예는 standard analyzer 이상 이다.

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

icu_normalizer 는 nfkc_cf 형식이 기본이다.

We can compare the results of running Weißkopfseeadler and WEISSKOPFSEEADLER (the uppercase equivalent) through the standard analyzer and through our Unicode-aware analyzer:

standard analyzer와 위에서 언급한 Unicode 인식 analyzer를 통해, Weißkopfseeadler 와 WEISSKOPFSEEADLER(대문자로 표시)을 실행한 결과를 비교해보자.

GET /_analyze?analyzer=standard 
Weißkopfseeadler WEISSKOPFSEEADLER

GET /my_index/_analyze?analyzer=my_lowercaser 
Weißkopfseeadler WEISSKOPFSEEADLER

weißkopfseeadlerweisskopfseeadler token을 출력

weisskopfseeadlerweisskopfseeadler token을 출력

The standard analyzer emits two different, incomparable tokens, while our custom analyzer produces tokens that are comparable, regardless of the original case.

standard analyzer는 비교할 수 없는, 2 개의 다른 결과를 출력한다. 반면에 Unicode 인식 analyzer는 원래의 대소문자에도 불구하고, 비교할 수 있는 token을 만들어 낸다.

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

3-3-2. You Have an Accent  (0) 2017.09.24
3-3-3. Living in a Unicode World  (0) 2017.09.24
3-3-5. Unicode Character 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