2.X/3. Dealing with Human Language

3-5-2. Using Stopwords

drscg 2017. 9. 24. 13:03

The removal of stopwords is handled by the stop token filter which can be used when creating a custom analyzer (see Using the stop Token Filter). However, some out-of-the-box analyzers come with the stop filter pre-integrated:

불용어의 제거는, 사용자 정의(custom) analyzer(Using the stop Token Filter 참조)를 생성하는 경우 사용될 수 있는, stop token filter에 의해 처리된다. 그러나, 몇몇 내장된 analyzer는 stop filter가 이미 통합되어 들어 있다.

Language analyzers

Each language analyzer defaults to using the appropriate stopwords list for that language. For instance, the english analyzer uses the _english_ stopwords list.

각 language analyzer는, 해당 언어에 대해, 적절한 불용어 목록을 사용하는 것이 기본이다. 예를 들어, english analyzer는 _english_ 불용어 목록을 사용한다.

standard analyzer

Defaults to the empty stopwords list: _none_, essentially disabling stopwords.

비어 있는 불용어 목록 _none_ 이 기본값이다. 기본적으로 불용어는 비활성화되어 있다.

pattern analyzer

Defaults to _none_, like the standard analyzer.

standard analyzer와 마찬가지로, _none_ 이 기본값이다.

Stopwords and the Standard Analyzeredit

To use custom stopwords in conjunction with the standard analyzer, all we need to do is to create a configured version of the analyzer and pass in the list of stopwords that we require:

standard analyzer와 함께 사용자 정의 불용어를 사용하기 위해서, analyzer의 설정을 가진 버전을 생성하고, 필요한 불용어 의 목록을 넘겨야 한다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": { 
          "type": "standard", 
          "stopwords": [ "and", "the" ] 
        }
      }
    }
  }
}

이것은 my_analyzer 라 불리는 사용자 정의 analyzer이다.

이 analyzer는 사용자 정의 설정을 가지는 standard analyzer이다.

걸러낼 불용어는 and 와 the 이다.

Tip

This same technique can be used to configure custom stopword lists for any of the language analyzers.

이 같은 기술은, 사용자 정의 불용어 목록을 설정하기 위해, 모든 language analyzer에 사용될 수 있다.

Maintaining Positionsedit

The output from the analyze API is quite interesting:

analyze API에서 나온 출력이 흥미롭다.

GET /my_index/_analyze?analyzer=my_analyzer
The quick and the dead
{
   "tokens": [
      {
         "token":        "quick",
         "start_offset": 4,
         "end_offset":   9,
         "type":         "<ALPHANUM>",
         "position":     1 
      },
      {
         "token":        "dead",
         "start_offset": 18,
         "end_offset":   22,
         "type":         "<ALPHANUM>",
         "position":     4 
      }
   ]
}

 

각 token의 position 을 유심히 보자.

The stopwords have been filtered out, as expected, but the interesting part is that the position of the two remaining terms is unchanged: quick is the second word in the original sentence, and deadis the fifth. This is important for phrase queries—if the positions of each term had been adjusted, a phrase query for quick dead would have matched the preceding example incorrectly.

기대했던 대로, 불용어는 걸러졌다. 그러나 흥미로운 부분은, 2개의 남아 있는 단어의 position 이 변하지 않았다는 점이다. 원래의 문장에서 quick 은 두 번째 단어이고, dead 는 다섯 번째 단어이다. 이것은 phrase query에서 중요하다. 각 단어의 위치가 보정된다면, quick dead 에 대한 phrase query는 이전의 예제와 올바르지 않게 일치할 것이다.

Specifying Stopwordsedit

Stopwords can be passed inline, as we did in the previous example, by specifying an array:

앞의 예에서 보았듯이, 불용어는 배열을 지정하여, inline으로 전달될 수 있다.

"stopwords": [ "and", "the" ]

The default stopword list for a particular language can be specified using the _lang_ notation:

특정 언어에 대한 기본 불용어 목록은 _lang_ 표기법을 이용하여 지정할 수 있다.

"stopwords": "_english_"
Tip

The predefined language-specific stopword lists available in Elasticsearch can be found in the stop token filter documentation.

Elasticsearch에서 이용할 수 있는, 미리 정의된 언어별 불용어 목록은 stop token filter에서 찾을 수 있다.

Stopwords can be disabled by specifying the special list: _none_. For instance, to use the englishanalyzer without stopwords, you can do the following:

불용어는 특별한 목록 _none_ 을 지정하여, 비활성화될 수 있다. 예를 들어, 불용어 없는 english analyzer를 사용하려면, 아래와 같이 할 수 있다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english": {
          "type":      "english", 
          "stopwords": "_none_" 
        }
      }
    }
  }
}

my_english analyzer는 english analyzer를 기반으로 한다.

그러나, 불용어는 비활성화 한다.

Finally, stopwords can also be listed in a file with one word per line. The file must be present on all nodes in the cluster, and the path can be specified with the stopwords_path parameter:

마지막으로, 불용어는 한 라인에 한 단어씩 작성된 파일에 나열할 수도 있다. 파일은 cluster의 모든 node에 있어야 한다. 그리고, 그 경로는 stopwords_path 매개변수에 지정할 수 있다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english": {
          "type":           "english",
          "stopwords_path": "stopwords/english.txt" 
        }
      }
    }
  }
}

불용어 파일의 경로, Elasticsearch config directory에 대한 상대 경로.

Using the stop Token Filteredit

The stop token filter can be combined with a tokenizer and other token filters when you need to create a custom analyzer. For instance, let’s say that we wanted to create a Spanish analyzer with the following:

stop token filter는, 사용자 정의(custom) analyzer를 생성할 경우, tokenizer와 다른 token filter를 조합될 수 있다. 예를 들어, 다음과 같은 요구 사항을 가지는, 스페인어(Spanish) analyzer를 생성한다고 가정해 보자.

  • A custom stopwords list

    사용자 정의 불용어 목록

  • The light_spanish stemmer

    light_spanish 형태소 분석기

  • The asciifolding filter to remove diacritics

    발음 구별 부호를 제거하기 위한 asciifolding filter

We could set that up as follows:

아래처럼 설정할 수 있다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "spanish_stop": {
          "type":        "stop",
          "stopwords": [ "si", "esta", "el", "la" ]  
        },
        "light_spanish": { 
          "type":     "stemmer",
          "language": "light_spanish"
        }
      },
      "analyzer": {
        "my_spanish": {
          "tokenizer": "spanish",
          "filter": [ 
            "lowercase",
            "asciifolding",
            "spanish_stop",
            "light_spanish"
          ]
        }
      }
    }
  }
}

stop token filter는 standard analyzer와 동일한 stopwords 와 stopwords_path 매개변수를 가진다.

Algorithmic Stemmers를 참고하자.

token filter의 순서가 중요하다. 아래에서 설명하겠다.

We have placed the spanish_stop filter after the asciifolding filter. This means that estaésta, and está will first have their diacritics removed to become just esta, which will then be removed as a stopword. If, instead, we wanted to remove esta and ésta, but not está, we would have to put the spanish_stop filter before the asciifolding filter, and specify both words in the stopwords list.

asciifolding filter 다음에 spanish_stop filter를 두었다. 즉, estaésta 그리고 está 는 먼저 발음 구별 부호가 제거되어, esta 가 된다. 그 다음에 불용어로 제거된다. estaésta 는 제거되고 está 는 그렇지 않기를 원한다면, asciifolding filter 전에 spanish_stop filter를 두어야 한다. 그리고 두 단어 모두를 불용어 목록에 지정해야 한다.

Updating Stopwordsedit

A few techniques can be used to update the list of stopwords used by an analyzer. Analyzers are instantiated at index creation time, when a node is restarted, or when a closed index is reopened.

analyzer에 의해 사용되는 불용어 목록을 업데이트하기 위해, 몇 가지 기술이 사용될 수 있다. analyzer는 index 생성시에, node가 다시 시작되거나, index를 닫았다가 다시 열 때 인스턴스화 된다.

If you specify stopwords inline with the stopwords parameter, your only option is to close the index and update the analyzer configuration with the update index settings API, then reopen the index.

불용어를 stopwords 매개변수에 inline으로 지정했다면, index를 닫고, update index settings API를 이용해 analyzer 설정을 업데이트하고, index를 다시 여는 것이 유일한 방법이다.

Updating stopwords is easier if you specify them in a file with the stopwords_path parameter. You can just update the file (on every node in the cluster) and then force the analyzers to be re-created by either of these actions:

stopwords_path 매개변수를 이용해, 파일에 불용어를 지정했다면, 업데이트하는 것은 더 쉽다. (cluster의 모든 node에) 단지 파일을 업데이트하고, 아래 두 가지 방법 중 하나로, analyzer를 강제로 다시 생성하면 된다.

  • Closing and reopening the index (see open/close index), or

    index를 닫았다가 다시 연다. (open/close index 참조), 또는

  • Restarting each node in the cluster, one by one

    cluster의 각 node를 차례로 다시 시작한다.

Of course, updating the stopwords list will not change any documents that have already been indexed. It will apply only to searches and to new or updated documents. To apply the changes to existing documents, you will need to reindex your data. See Reindexing Your Data.

물론, 불용어 목록을 업데이트하는 것이 이미 색인된 document를 변경하는 것은 아니다. 그것은 검색이나 새로운 혹은 업데이트된 document에게만 적용된다. 기존 document에 변경 사항을 적용하기 위해서는, 데이터를 다시 색인 해야 한다. Reindexing Your Data을 참고하자.