2.X/3. Dealing with Human Language

3-4-1. Algorithmic Stemmers

drscg 2017. 9. 24. 13:21

Most of the stemmers available in Elasticsearch are algorithmic in that they apply a series of rules to a word in order to reduce it to its root form, such as stripping the final s or es from plurals. They don’t have to know anything about individual words in order to stem them.

Elasticsearch에서 이용할 수 있는 대부분의 형태소 분석기는, 단어를 원형으로 축소하기 위해, 복수형에서 마지막의 s 나 es 를 떼어내는 것 같은, 일련의 규칙을 적용하는 알고리즘이다. 형태소 분석을 위해, 개별 단어에 대해 알 필요가 없다.

These algorithmic stemmers have the advantage that they are available out of the box, are fast, use little memory, and work well for regular words. The downside is that they don’t cope well with irregular words like beare, and am, or mice and mouse.

이들 알고리즘 형태소 분석기는 바로 사용할 수 있고, 빠르고, 적은 메모리를 사용하고, 규칙적인 단어에 대해 잘 동작하는 장점을 가지고 있다. 단점은 beaream, 또는 micemouse 같은 불규칙적인 단어에 잘 대응하지 못한다는 점이다.

One of the earliest stemming algorithms is the Porter stemmer for English, which is still the recommended English stemmer today. Martin Porter subsequently went on to create the Snowball language for creating stemming algorithms, and a number of the stemmers available in Elasticsearch are written in Snowball.

초기 형태소 분석 알고리즘 중의 하나는, 영어에 대한 Porter 형태소 분석기이다. 이것은 오늘날에도 여전히 영어 형태소 분석기로 추천된다. Martin Porter 이후, 형태소 분석 알고리즘의 생성을 위해 Snowball language 생성되었고, Elasticsearch에서 이용할 수 있는 많은 형태소 분석기가 snowball에서 작성되었다.

Tip

The kstem token filter is a stemmer for English which combines the algorithmic approach with a built-in dictionary. The dictionary contains a list of root words and exceptions in order to avoid conflating words incorrectly. kstem tends to stem less aggressively than the Porter stemmer.

kstem token filter는 내장된 사전과 알고리즘 방식을 조합한 영어 형태소 분석기이다. 사전은 단어의 원형 목록과, 부정확한 단어의 혼합을 피하기 위한 예외 사항을 포함하고 있다. kstem 은, Porter 형태소 분석기 보다, 덜 적극적으로 형태소 분석하려는 경향이 있다.

Using an Algorithmic Stemmeredit

While you can use the porter_stem or kstem token filter directly, or create a language-specific Snowball stemmer with the snowball token filter, all of the algorithmic stemmers are exposed via a single unified interface: the stemmer token filter, which accepts the language parameter.

porter_stem이나 kstem token filter를 바로 사용하거나, snowball token filter 를 이용하여, 특정 언어용 snowball 형태소 분석기를 생성할 수도 있지만, 모든 알고리즘 형태소 분석기는 하나의 통일된 인터페이스(language 매개변수를 가진 stemmer token filter)를 가진다.

For instance, perhaps you find the default stemmer used by the english analyzer to be too aggressive and you want to make it less aggressive. The first step is to look up the configuration for the english analyzer in the language analyzers documentation, which shows the following:

예를 들자면, english analyzer에 의해 사용되는 기본 형태소 분석기가 너무 적극적이어서, 덜 적극적으로 만들려고 할 수 있다. 첫 번째 단계는 language analyzers document에서, 아래처럼 보이는, englishanalyzer의 설정을 살펴보는 것이다.

{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_"
        },
        "english_keywords": {
          "type":       "keyword_marker", 
          "keywords":   []
        },
        "english_stemmer": {
          "type":       "stemmer",
          "language":   "english" 
        },
        "english_possessive_stemmer": {
          "type":       "stemmer",
          "language":   "possessive_english" 
        }
      },
      "analyzer": {
        "english": {
          "tokenizer":  "standard",
          "filter": [
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "english_keywords",
            "english_stemmer"
          ]
        }
      }
    }
  }
}

keyword_marker token filter는 형태소 분석을 하지 않을 단어를 나열한다. 기본값은 빈 목록이다.

 

english analyzer는 2개의 형태소 분석기(possessive_english 와 english 형태소 분석기)를 사용한다. possessive 형태소 분석기는, english_stopenglish_keywords 그리고 english_stemmer 에 단어를 전달하기 전에, 모든 단어에서 's 를 제거한다.

Having reviewed the current configuration, we can use it as the basis for a new analyzer, with the following changes:

현재의 설정을 검토해 보면, 다음 사항을 변경하여, 새로운 analyzer의 기반으로 사용할 수 있다.

  • Change the english_stemmer from english (which maps to the porter_stem token filter) to light_english (which maps to the less aggressive kstem token filter).

    english_stemmer 를 english (porter_stem token filter에 mapping된)에서 light_english (덜 적극적인 kstem token filter에 mapping된)로 변경

  • Add the asciifolding token filter to remove any diacritics from foreign words.

    외래어의 모든 발음 구별 부호를 제거하기 위한, asciifolding token filter를 추가

  • Remove the keyword_marker token filter, as we don’t need it. (We discuss this in more detail in Controlling Stemming.)

    필요하지 않은, keyword_marker token filter를 제거한다. 이 부분에 대해 Controlling Stemming에서 더 자세히 이야기할 것이다.

Our new custom analyzer would look like this:

새로운 사용자 정의 analyzer는 아래와 같다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_"
        },
        "light_english_stemmer": {
          "type":       "stemmer",
          "language":   "light_english" 
        },
        "english_possessive_stemmer": {
          "type":       "stemmer",
          "language":   "possessive_english"
        }
      },
      "analyzer": {
        "english": {
          "tokenizer":  "standard",
          "filter": [
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "light_english_stemmer", 
            "asciifolding" 
          ]
        }
      }
    }
  }
}

 

english 형태소 분석기를 덜 적극적인 light_english 형태소 분석기로 대체

asciifolding token filter를 추가


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

3-3-6. Sorting and Collations  (0) 2017.09.24
3-4. Reducing Words to Their Root Form  (0) 2017.09.24
3-4-2. Dictionary Stemmers  (0) 2017.09.24
3-4-3. Hunspell Stemmer  (0) 2017.09.24
3-4-4. Choosing a Stemmer  (0) 2017.09.24