2.X/3. Dealing with Human Language

3-6-4. Synonyms and The Analysis Chain

drscg 2017. 9. 24. 12:40

The example we showed in Formatting Synonyms, used u s a as a synonym. Why did we use that instead of U.S.A.? The reason is that the synonym token filter sees only the terms that the previous token filter or tokenizer has emitted.

Formatting Synonyms에서 보여준 예제에서, 동의어로서 u s a 를 사용했다. 왜 U.S.A. 대신 저것을 사용했을까? 그 이유는 synonym token filter 만이 직전의 token filter나 tokenizer가 출력한 단어를 알기 때문이다.

Imagine that we have an analyzer that consists of the standard tokenizer, with the lowercase token filter followed by a synonym token filter. The analysis process for the text U.S.A. would look like this:

lowercase token filter 다음에 synonym token filter를 가진, standard analyzer로 구성된 analyzer를 가지고 있다고 가정해 보자. U.S.A. 에 대한 분석 프로세스는 아래와 같다.

original string                   "U.S.A."
standard           tokenizer      (U),(S),(A)
lowercase          token filter   (u),(s),(a)
synonym            token filter   (usa)

If we had specified the synonym as U.S.A., it would never match anything because, by the time my_synonym_filter sees the terms, the periods have been removed and the letters have been lowercased.

U.S.A. 를 동의어로 지정했다면, period(.)는 제거되고, 소문자로 변경되었기 때문에, my_synonym_filter가 단어를 확인할 때까지, 아무것도 일치하지 않을 것이다.

This is an important point to consider. What if we want to combine synonyms with stemming, so that jumpsjumpedjumpleapsleaped, and leap are all indexed as the single term jump? We could place the synonyms filter before the stemmer and list all inflections:

이것은 고려해야 할 중요한 포인트이다. jumpsjumpedjumpleapsleaped 그리고 leap 모두를 하나의 단어 jump 로 색인 하기 위해, 동의어와 형태소 분석을 조합해야 한다면 어떻게 해야 할까? 형태소 분석기 이전에 synonyms filter를 배치하고, 모든 변형된 단어를 나열할 수 있다.

"jumps,jumped,leap,leaps,leaped => jump"

But the more concise way would be to place the synonyms filter after the stemmer, and to list just the root words that would be emitted by the stemmer:

그러나, 더 간결한 방법은 형태소 분석기 다음에 synonyms filter를 배치하는 것이다. 그리고 형태소 분석기에 의해 출력될 원형만을 나열하는 것이다.

"leap => jump"

Case-Sensitive Synonymsedit

Normally, synonym filters are placed after the lowercase token filter and so all synonyms are written in lowercase, but sometimes that can lead to odd conflations. For instance, a CAT scan and a cat are quite different, as are PET (positron emission tomography) and a pet. For that matter, the surname Little is distinct from the adjective little (although if a sentence starts with the adjective, it will be uppercased anyway).

보통, synonym filter는 lowercase token filter 다음에 배치된다. 그리고, 모든 동의어는 소문자로 쓴다. 그러나, 가끔씩 그것이 이상한 혼란을 초래할 수 있다. 예를 들어, CAT scan(CT 촬영, 컴퓨터 엑스선 체축(體軸) 단층 촬영)과 cat 은, PET(양전자 방사 단층 촬영)과 pet 처럼, 완전히 다르다. 마찬가지로, 성(姓) Little 과 형용사 little(형용사로 시작하는 문장이라면, 대문자일 것이다)은 완전히 다르다.

If you need use case to distinguish between word senses, you will need to place your synonym filter before the lowercase filter. Of course, that means that your synonym rules would need to list all of the case variations that you want to match (for example, Little,LITTLE,little).

단어의 의미를 구분하는 사용 사례가 필요하다면, synonym filter를 lowercase filter 이전에 배치해야 한다. 즉, 동의어 규칙은 일치하려는 다양한 경우 모두를 나열해야 한다. (예: Little,LITTLE,little)

Instead of that, you could have two synonym filters: one to catch the case-sensitive synonyms and one for all the case-insensitive synonyms. For instance, the case-sensitive rules could look like this:

그 대신, 2개의 synonym filter를 가질 수 있다. 하나는 대소문자를 구분하여 동의어를 찾고, 다른 하나는 대소문자 구분 없는 동의어 모두에 대한 것이다. 예를 들어, 대소문자를 구분하는 규칙은 아래와 같다.

"CAT,CAT scan           => cat_scan"
"PET,PET scan           => pet_scan"
"Johnny Little,J Little => johnny_little"
"Johnny Small,J Small   => johnny_small"

And the case-insensitive rules could look like this:

그리고, 대소문자 구분 없는 규칙은 아래와 같다.

"cat                    => cat,pet"
"dog                    => dog,pet"
"cat scan,cat_scan scan => cat_scan"
"pet scan,pet_scan scan => pet_scan"
"little,small"

The case-sensitive rules would CAT scan but would match only the CAT in CAT scan. For this reason, we have the odd-looking rule cat_scan scan in the case-insensitive list to catch bad replacements.

대소문자를 구분하는 규칙은 CAT scan 이지만, CAT scan 에 있는 CAT 에만 일치할 것이다. 이런 이유때문에, 대소문자 구분 없는 규칙 목록에서, 잘못된 대체를 수정하기 위해, 이상하게 보이는 규칙 cat_scan scan 을 가지고 있다.

Tip

You can see how quickly it can get complicated. As always, the analyze API is your friend—use it to check that your analyzers are configured correctly. See Testing Analyzers.

무척 빠르게 복잡해진다. analyze API는 언제나 여러분의 친구이다. analyzer가 올바르게 설정되었는지 확인하기 위해, analyze API를 사용해 확인하자. Testing Analyzers를 참조하자.


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

3-6-2. Formatting Synonyms  (0) 2017.09.24
3-6-3. Expand or contract  (0) 2017.09.24
3-6-5. Multiword Synonyms and Phrase Queries  (0) 2017.09.24
3-6-6. Symbol Synonyms  (0) 2017.09.24
3-7. Typoes and Mispelings  (0) 2017.09.24