2.X/3. Dealing with Human Language

3-5-6. common_grams Token Filter

drscg 2017. 9. 24. 12:54

The common_grams token filter is designed to make phrase queries with stopwords more efficient. It is similar to the shingles token filter (see Finding Associated Words), which creates bigrams out of every pair of adjacent words. It is most easily explained by example.

common_grams token filter는, 불용어를 사용하여, 보다 효율적으로 phrase query를 만들기 위해 설계되었다. 그것은 인접한 단어의 모든 쌍으로, bigram 을 생성(Finding Associated Words 참조)하는, shinglestoken filter와 유사하다. 예제를 보면 쉽게 알 수 있다.

The common_grams token filter produces different output depending on whether query_mode is set to false (for indexing) or to true (for searching), so we have to create two separate analyzers:

common_grams token filter는, query_mode(false: 색인을 위해서, true: 검색을 위해서)에 따라, 다른 출력을 만들어 낸다. 따라서, 두 개의 다른 analyzer를 생성해야 한다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "index_filter": { 
          "type":         "common_grams",
          "common_words": "_english_" 
        },
        "search_filter": { 
          "type":         "common_grams",
          "common_words": "_english_", 
          "query_mode":   true
        }
      },
      "analyzer": {
        "index_grams": { 
          "tokenizer":  "standard",
          "filter":   [ "lowercase", "index_filter" ]
        },
        "search_grams": { 
          "tokenizer": "standard",
          "filter":  [ "lowercase", "search_filter" ]
        }
      }
    }
  }
}

 

먼저, common_grams token filter를 기반으로 한 2개의 token filter를 생성한다. 색인을 위한 index_filter(query_mode 를 기본값인 false 로 설정), 검색을 위한 search_filter(query_mode 를 true 로 설정)

 

common_words 매개변수는 stopwords 매개변수와 동일한 옵션(Specifying Stopwords 참조)을 가진다. filter는 또한 흔한 단어의 목록을 가지는 파일을 전달하는, common_words_path 매개변수를 가진다.

 

그 다음에, 색인 시와 검색 시에 사용할 analyzer를 생성하기 위하여, 각각의 filter를 사용한다.

With our custom analyzers in place, we can create a field that will use the index_grams analyzer at index time:

사용자 정의 analyzer가 준비가 되면, 색인 시에, index_grams analyzer를 사용할 field를 생성할 수 있다.

PUT /my_index/_mapping/my_type
{
  "properties": {
    "text": {
      "type":            "string",
      "analyzer":  "index_grams", 
      "search_analyzer": "standard" 
    }
  }
}

 

text field는 색인 시에 index_grams analyzer를 사용한다. 그러나 검색 시에는 기본적으로 standard analyzer를 사용한다. 그 이유는 아래에서 설명할 것이다.

At Index Timeedit

If we were to analyze the phrase The quick and brown fox with shingles, it would produce these terms:

shingles로 The quick and brown fox 라는 구문을 분석하면, 아래 단어를 얻을 수 있다.

Pos 1: the_quick
Pos 2: quick_and
Pos 3: and_brown
Pos 4: brown_fox

Our new index_grams analyzer produces the following terms instead:

대신, 새로운 index_grams analyzer는 아래 단어를 얻을 수 있다.

Pos 1: the, the_quick
Pos 2: quick, quick_and
Pos 3: and, and_brown
Pos 4: brown
Pos 5: fox

All terms are output as unigrams—thequick, and so forth—but if a word is a common word or is followed by a common word, then it also outputs a bigram in the same position as the unigram—the_quickquick_andand_brown.

모든 단어는 unigrams(thequick 등)로 출력하지만, 단어가 흔한 단어이거나 흔한 단어 다음에 나오면, unigram과 동일한 위치에 bigram(the_quickquick_andand_brown 등)도 출력한다.

Unigram Queriesedit

Because the index contains unigrams, the field can be queried using the same techniques that we have used for any other field, for example:

index가 unigrams를 가지고 있기 때문에, 그 field는, 다른 모든 field에 사용했던 것과 동일한 기술을 사용하여, query될 수 있다. 예를 들자면,

GET /my_index/_search
{
  "query": {
    "match": {
      "text": {
        "query": "the quick and brown fox",
        "cutoff_frequency": 0.01
      }
    }
  }
}

The preceding query string is analyzed by the search_analyzer configured for the text field—the standard analyzer in this example—to produce the terms thequickandbrownfox.

위의 query string은, text field에 설정된 search_analyzer(이 예제에서는 standard analyzer)로 분석되어, 단어 thequickandbrownfox 를 만들어낸다.

Because the index for the text field contains the same unigrams as produced by the standardanalyzer, search functions as it would for any normal field.

text field에 대한 index는, standard analyzer로 만들어낸 것과 동일한 unigrams를 포함하고 있기 때문에, 검색 기능은 다른 일반적인 field에 대한 것과 같다.

Bigram Phrase Queriesedit

However, when we come to do phrase queries, we can use the specialized search_grams analyzer to make the process much more efficient:

그러나, phrase query에서는, 훨씬 더 효과적인 프로세스를 만들기 위해, 특별한 search_grams analyzer를 사용할 수 있다.

GET /my_index/_search
{
  "query": {
    "match_phrase": {
      "text": {
        "query":    "The quick and brown fox",
        "analyzer": "search_grams" 
      }
    }
  }
}

phrase query에 대해, default search_analyzer 를 무시하고, 대신 search_grams 를 사용한다.

The search_grams analyzer would produce the following terms:

search_grams analyzer에서는 다음 단어를 얻을 수 있다.

Pos 1: the_quick
Pos 2: quick_and
Pos 3: and_brown
Pos 4: brown
Pos 5: fox

The analyzer has stripped out all of the common word unigrams, leaving the common word bigrams and the low-frequency unigrams. Bigrams like the_quick are much less common than the single term the. This has two advantages:

흔한 bigrams 단어와 낮은 빈도의 unigrams는 남겨두고, 흔한 unigrams 단어 모두를 제거한다.the_quick 같은 bigrams는 하나의 단어 the 보다 훨씬 더 덜 흔하다. 이것은 두 가지 장점이 있다.

  • The positions data for the_quick is much smaller than for the, so it is faster to read from disk and has less of an impact on the filesystem cache.

    the_quick 의 위치 데이터는 the 에 대한 것보다 훨씬 더 적다. 따라서, 디스크에서 읽는 속도가 더 빠르고, file system cache에 미치는 영향이 더 적다.

  • The term the_quick is much less common than the, so it drastically decreases the number of documents that have to be examined.

    단어 the_quick 은 the 보다 훨씬 덜 흔하다. 따라서, 확인해야 할 document의 수가 대폭 줄어든다.

Two-Word Phrasesedit

There is one further optimization. By far the majority of phrase queries consist of only two words. If one of those words happens to be a common word, such as

최적화가 하나 더 있다. 지금까지 phrase query의 대부분은 두 단어로 구성되어 있다. 이들 단어 중 하나가, 다음과 같이, 흔한 단어라면,

GET /my_index/_search
{
  "query": {
    "match_phrase": {
      "text": {
        "query":    "The quick",
        "analyzer": "search_grams"
      }
    }
  }
}

then the search_grams analyzer outputs a single token: the_quick. This transforms what originally could have been an expensive phrase query for the and quick into a very efficient single-term lookup.

search_grams analyzer는 하나의 token(the_quick)을 출력한다. 이것은, 원래의 the 와 quick 에 대한 고비용의 phrase query를, 매우 효율적인 단일 단어 검색으로 변환한다.


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

3-5-4. Divide and Conquer  (0) 2017.09.24
3-5-5. Stopwords and Phrase Queries  (0) 2017.09.24
3-5-7. Stopwords and Relevance  (0) 2017.09.24
3-6. Synonyms  (0) 2017.09.24
3-6-1. Using Synonyms  (0) 2017.09.24