2.X/2. Search in Depth

2-5-8. Ngrams for Compound Words

drscg 2017. 9. 24. 20:55

Finally, let’s take a look at how n-grams can be used to search languages with compound words.German is famous for combining several small words into one massive compound word in order to capture precise or complex meanings. For example:

마지막으로, n-grams가 복합 단어를 가진 언어를 검색하는데 사용될 수 있는 방법을 살펴보자. 독일어는, 정확하거나 복잡한 의미를 나타내기 위해, 다수의 작은 단어를 대규모 복합 단어로 조합하기로 유명하다. 예를 들면,

Aussprachewörterbuch
발음 기호 사전(Pronunciation dictionary)
Militärgeschichte
군대 역사(Military history)
Weißkopfseeadler
하얀 머리 바다 독수리(White-headed sea eagle) 또는 대머리 독수리(bald eagle)
Weltgesundheitsorganisation
세계 보건 기구(World Health Organization)
Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz
소고기의 표시나 label을 위한 소의 감독 업무에 대한 업무 위임에 관한 법

Somebody searching for "Wörterbuch" (dictionary) would probably expect to see "Aussprachewörtebuch" in the results list. Similarly, a search for "Adler" (eagle) should include "Weißkopfseeadler".

"Wörterbuch"(사전)을 찾는 어떤 이는, 아마도 결과 목록에서, "Aussprachewörtebuch" 를 볼 수 있을 거라 기대할 것이다. 유사하게, "Adler"(독수리)를 검색하면 "Weißkopfseeadler" 를 볼 수 있을 거라 기대할 것이다.

One approach to indexing languages like this is to break compound words into their constituent parts using the compound word token filter. However, the quality of the results depends on how good your compound-word dictionary is.

이와 같은 언어를 색인하는 한가지 방법은, compound word token filter를 사용하여, 복합어를 그들의 구성 요소로 나누는 것이다. 그러나, 결과의 질은 복합 단어 사전의 질에 달려 있다.

Another approach is just to break all words into n-grams and to search for any matching fragments—the more fragments that match, the more relevant the document.

또 다른 방법은, 단지 모든 단어를 n-grams로 나누고, 모든 일치하는 조각들을 검색하는 것이다. 일치하는 조각이 많을수록, document는 더 많은 관련성을 가진다.

Given that an n-gram is a moving window on a word, an n-gram of any length will cover all of the word. We want to choose a length that is long enough to be meaningful, but not so long that we produce far too many unique terms. A trigram (length 3) is probably a good starting point:

n-grams는 단어에 따라 움직이는 윈도우(a moving window on a word)라는 상황에 처하면, 임의의 길이의 n-gram은 단어 모두를 다룰 것이다. 충분히 의미 있는 길이로, 그러나 너무 많은 유일한 단어를 만들어내는 것이 아닌, 길이를 선택하기를 바란다. 아마도, trigram (길이 3)이 좋은 출발점이 될 것이다.

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "trigrams_filter": {
                    "type":     "ngram",
                    "min_gram": 3,
                    "max_gram": 3
                }
            },
            "analyzer": {
                "trigrams": {
                    "type":      "custom",
                    "tokenizer": "standard",
                    "filter":   [
                        "lowercase",
                        "trigrams_filter"
                    ]
                }
            }
        }
    },
    "mappings": {
        "my_type": {
            "properties": {
                "text": {
                    "type":     "string",
                    "analyzer": "trigrams" 
                }
            }
        }
    }
}

text field는, 내용을 길이가 3인 n-grams으로 색인 하기 위해, trigrams analyzer를 사용한다.

Testing the trigrams analyzer with the analyze API

analyze API로 trigrams analyzer를 테스트해 보자.

GET /my_index/_analyze?analyzer=trigrams
Weißkopfseeadler

returns these terms:

아래 단어를 반환한다.

wei, eiß, ißk, ßko, kop, opf, pfs, fse, see, eea,ead, adl, dle, ler

We can index our example compound words to test this approach:

이 방법을 테스트하기 위해, 복합 단어의 예제를 색인하자.

POST /my_index/my_type/_bulk
{ "index": { "_id": 1 }}
{ "text": "Aussprachewörterbuch" }
{ "index": { "_id": 2 }}
{ "text": "Militärgeschichte" }
{ "index": { "_id": 3 }}
{ "text": "Weißkopfseeadler" }
{ "index": { "_id": 4 }}
{ "text": "Weltgesundheitsorganisation" }
{ "index": { "_id": 5 }}
{ "text": "Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz" }

A search for "Adler" (eagle) becomes a query for the three terms adldle, and ler:

"Adler" (독수리)에 대한 검색은 3개의 단어 adldleler 에 대한 query가 된다.

GET /my_index/my_type/_search
{
    "query": {
        "match": {
            "text": "Adler"
        }
    }
}

which correctly matches "Weißkopfsee-adler":

이는 "Weißkopfsee-adler" 와 정확하게 일치한다.

{
  "hits": [
     {
        "_id": "3",
        "_score": 3.3191128,
        "_source": {
           "text": "Weißkopfseeadler"
        }
     }
  ]
}

A similar query for "Gesundheit" (health) correctly matches "Welt-gesundheit-sorganisation", but it also matches "Militär-ges-chichte" and "Rindfleischetikettierungsüberwachungsaufgabenübertragungs-ges-etz", both of which also contain the trigram ges.

"Gesundheit" (보건)을 검색하는 유사한 query는, "Welt-gesundheit-sorganisation" 와 정확하게 일치한다. 그러나 또한, trigram ges 를 포함하는 두 단어 "Militär-ges-chichte" 그리고 "Rindfleischetikettierungsüberwachungsaufgabenübertragungs-ges-etz" 모두와 정확하게 일치한다.

Judicious use of the minimum_should_match parameter can remove these spurious results by requiring that a minimum number of trigrams must be present for a document to be considered a match:

minimum_should_match 매개변수의 신중한 사용은, 일치하는 것으로 간주될 document에 대해, trigrams의 최소 숫자는 존재해야 한다고 요구함으로써, 이러한 그럴싸한 결과들을 제거할 수 있다.

GET /my_index/my_type/_search
{
    "query": {
        "match": {
            "text": {
                "query":                "Gesundheit",
                "minimum_should_match": "80%"
            }
        }
    }
}

This is a bit of a shotgun approach to full-text search and can result in a large inverted index, but it is an effective generic way of indexing languages that use many compound words or that don’t use whitespace between words, such as Thai.

이것은 full-text 검색에게는 약간 무차별적인 방법이고, 큰 inverted index로 나타날 수 있다. 그러나 이런 방식은, 많은 복합어를 사용하는 언어나, 태국어처럼 단어 사이에 공백을 사용하지 않는 언어를 색인하는, 효과적이고 일반적인 방식이다.

This technique is used to increase recall—the number of relevant documents that a search returns. It is usually used in combination with other techniques, such as shingles (see Finding Associated Words) to improve precision and the relevance score of each document.

이 기술은 recall (검색이 반환하는 관련된 document의 수)을 증가시키는데 사용된다. 일반적으로, 각 document의 정확성, relevance score를 증가시키기 위하여, shingles(Finding Associated Words 참조) 같은 다른 기술과 조합하여 사용된다.