2.X/3. Dealing with Human Language

3-4-5. Controlling Stemming

drscg 2017. 9. 24. 13:12

Out-of-the-box stemming solutions are never perfect. Algorithmic stemmers, especially, will blithely apply their rules to any words they encounter, perhaps conflating words that you would prefer to keep separate. Maybe, for your use case, it is important to keep skies and skiing as distinct words rather than stemming them both down to ski (as would happen with the english analyzer).

내장된 형태소 분석기는 절대 완벽하지 않다. 특히, 알고리즘 형태소 분석기는, 개별적으로 저장하는 것이 더 나은 혼합 단어를 만나면, 그것의 규칙을 해당 단어에 무분별하게 적용한다. 아마, skies 와 skiing 을 형태소 분석하여 둘 모두를 ski 로 하는 (english analyzer에서 발생) 것보다는, 별개의 단어로 저장하는 것이 더 중요할 것이다.

The keyword_marker and stemmer_override token filters allow us to customize the stemming process.

사용자 정의 형태소 분석 프로세스를 위해, keyword_marker와 stemmer_override token filter 를 이용할 수 있다.

Preventing Stemmingedit

The stem_exclusion parameter for language analyzers (see Configuring Language Analyzers) allowed us to specify a list of words that should not be stemmed. Internally, these language analyzers use the keyword_marker token filter to mark the listed words as keywords, which prevents subsequent stemming token filters from touching those words.

language analyzer(Configuring Language Analyzers 참조)에 대해, stem_exclusion 매개변수로, 형태소 분석을 하지 않을 단어의 목록을 지정할 수 있다. 내부적으로, 이런 language analyzer는, 나열된 단어를 keywords 로 표시하는, keyword_marker token filter를 사용한다. 이것은, 후속 형태소 분석 token filter가 해당 단어를 변경하지 않도록 한다.

For instance, we can create a simple custom analyzer that uses the porter_stem token filter, but prevents the word skies from being stemmed:

예를 들어, porter_stem token filter를 사용하는, 간단한 사용자 정의 analyzer를 만들어 보자. 그러나, 이것은 skies 라는 단어를 형태소 분석되는 것을 방지한다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "no_stem": {
          "type": "keyword_marker",
          "keywords": [ "skies" ] 
        }
      },
      "analyzer": {
        "my_english": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "no_stem",
            "porter_stem"
          ]
        }
      }
    }
  }
}

keywords 매개변수에는 다수의 단어를 넣을 수 있다.

Testing it with the analyze API shows that just the word skies has been excluded from stemming:

analyze API를 이용해 테스트해 보면, skies 라는 단어가 형태소 분석에서 제외되는 것을 볼 수 있다.

GET /my_index/_analyze?analyzer=my_english
sky skies skiing skis 

반환 값: skyskiesskiski

Tip

While the language analyzers allow us only to specify an array of words in thestem_exclusion parameter, the keyword_marker token filter also accepts akeywords_path parameter that allows us to store all of our keywords in a file. The file should contain one word per line, and must be present on every node in the cluster. See Updating Stopwords for tips on how to update this file.

language analyzer에서는 stem_exclusion 매개변수에 단어의 배열만을 지정할 수 있는 반면에, keyword_marker token filter에서는, 파일에 모든 keywords를 저장하여, 그 경로를 keywords_path 매개변수에 지정할 수 있다. 파일은 한 라인에 한 단어씩 있어야 하고, cluster의 모든 node에 있어야 한다. 이 파일을 업데이트하는 방법에 대한 팁은 Updating Stopwords를 참조하자.

Customizing Stemmingedit

In the preceding example, we prevented skies from being stemmed, but perhaps we would prefer it to be stemmed to sky instead. The stemmer_override token filter allows us to specify our own custom stemming rules. At the same time, we can handle some irregular forms like stemming miceto mouse and feet to foot:

위의 예제에서, skies 가 형태소 분석되는 것을 방지하였다. 그러나, 아마도 sky 로 대신 형태소 분석되는 것이 더 나을 것이다. stemmer_override token filter를 이용하여, 자기 자신의 사용자 정의 형태소 분석 규칙을 지정할 수 있다. 동시에, mice 가 mouse 로, feet 이 foot 으로 형태소 분석되는 것처럼, 몇 가지 불규칙적인 형태를 처리할 수 있다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "custom_stem": {
          "type": "stemmer_override",
          "rules": [ 
            "skies=>sky",
            "mice=>mouse",
            "feet=>foot"
          ]
        }
      },
      "analyzer": {
        "my_english": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "custom_stem", 
            "porter_stem"
          ]
        }
      }
    }
  }
}

GET /my_index/_analyze?analyzer=my_english
The mice came down from the skies and ran over my feet 

rules는 원본=>형태소 의 형식을 가진다.

stemmer_override filter는 반드시 형태소 분석기 이전에 위치해야 한다.

반환 값: themousecamedownfromtheskyandranovermyfoot.

Tip

Just as for the keyword_marker token filter, rules can be stored in a file whose location should be specified with the rules_path parameter.

keyword_marker token filter처럼, 규칙은 파일에 저장될 수 있다. 파일의 위치는 rules_path매개변수에 지정할 수 있다.


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

3-4-3. Hunspell Stemmer  (0) 2017.09.24
3-4-4. Choosing a Stemmer  (0) 2017.09.24
3-4-6. Stemming in situ  (0) 2017.09.24
3-5. Stopwords: Performance Versus Precision  (0) 2017.09.24
3-5-1. Pros and Cons of Stopwords  (0) 2017.09.24