스테밍

원본 보기

스테밍

스테밍은 단어를 어근 형태로 축약하는 과정입니다. 이를 통해 검색 시 단어의 변형형들이 서로 일치하게 됩니다.

예를 들어 walkingwalked는 동일한 어근 walk로 스테밍될 수 있습니다. 스테밍이 적용되면 두 단어 중 어느 쪽이 나타나든 검색에서 서로 일치합니다.

스테밍은 언어에 따라 다르지만, 대개 단어에서 접두사와 접미사를 제거하는 방식으로 이루어집니다.

경우에 따라 스테밍된 단어의 어근 형태가 실제 존재하는 단어가 아닐 수도 있습니다. 예를 들어 jumpingjumpiness는 모두 jumpi로 스테밍될 수 있습니다. jumpi는 실제 영어 단어가 아니지만 검색에서는 문제가 되지 않습니다. 한 단어의 모든 변형형이 동일한 어근 형태로 축약되기만 하면 올바르게 일치하기 때문입니다.

Elasticsearch에서 스테밍은 스테머 토큰 필터가 처리합니다. 이러한 토큰 필터는 단어를 스테밍하는 방식에 따라 다음과 같이 분류할 수 있습니다.

스테밍은 토큰을 변경하므로 인덱스 분석과 검색 분석에서 동일한 스테머 토큰 필터를 사용하는 것을 권장합니다.

알고리즘 스테머는 각 단어에 일련의 규칙을 적용해 어근 형태로 축약합니다. 예를 들어 영어용 알고리즘 스테머는 복수형 단어 끝의 -s-es 접미사를 제거할 수 있습니다.

알고리즘 스테머에는 몇 가지 장점이 있습니다.

  • 설정이 거의 필요 없고 대개 기본 상태로도 잘 동작합니다.
  • 메모리를 적게 사용합니다.
  • 일반적으로 사전 스테머보다 빠릅니다.

다만 대부분의 알고리즘 스테머는 단어의 기존 텍스트만 변형합니다. 따라서 다음과 같이 어근 형태를 포함하지 않는 불규칙 단어에는 잘 동작하지 않을 수 있습니다.

  • be, are, am
  • mousemice
  • footfeet

다음 토큰 필터들이 알고리즘 스테밍을 사용합니다.

  • stemmer: 여러 언어에 대한 알고리즘 스테밍을 제공하며, 일부 언어는 추가 변형을 지원합니다.
  • kstem: 알고리즘 스테밍과 내장 사전을 결합한 영어용 스테머입니다.
  • porter_stem: 영어에 권장하는 알고리즘 스테머입니다.
  • snowball: 여러 언어에 대해 Snowball 기반 스테밍 규칙을 사용합니다.

사전 스테머는 제공된 사전에서 단어를 찾아, 스테밍되지 않은 단어 변형형을 사전의 스테밍된 단어로 대체합니다.

이론적으로 사전 스테머는 다음에 적합합니다.

  • 불규칙 단어 스테밍

  • 철자는 비슷하지만 개념적으로는 관련이 없는 다음과 같은 단어들의 구분

    • organorganization
    • brokerbroken

하지만 실제로는 알고리즘 스테머가 사전 스테머보다 대체로 더 나은 성능을 보입니다. 사전 스테머에는 다음과 같은 단점이 있기 때문입니다.

  • 사전 품질
    사전 스테머의 품질은 사전의 품질을 넘지 못합니다. 잘 동작하려면 사전에 상당히 많은 단어가 포함되어야 하고, 정기적으로 갱신되며, 언어 추세에 맞춰 변화해야 합니다. 사전이 공개될 무렵이면 이미 불완전하고 일부 항목은 낡아 있는 경우가 많습니다.
  • 크기와 성능
    사전 스테머는 사전의 모든 단어, 접두사, 접미사를 메모리에 로드해야 합니다. 이는 상당한 양의 RAM을 사용할 수 있습니다. 품질이 낮은 사전은 접두사·접미사 제거 효율도 떨어져 스테밍 과정을 크게 느리게 만들 수 있습니다.

사전 스테밍을 수행하려면 hunspell 토큰 필터를 사용할 수 있습니다.

가능하다면 hunspell 토큰 필터를 사용하기 전에 해당 언어용 알고리즘 스테머를 먼저 시도해 보는 것을 권장합니다.

스테밍은 때때로 철자는 비슷하지만 개념적으로 관련이 없는 공통 어근을 만들어낼 수 있습니다. 예를 들어 스테머가 skiesskiing을 모두 동일한 어근 ski로 축약할 수 있습니다.

이를 방지하고 스테밍을 더 잘 제어하려면 다음 토큰 필터를 사용할 수 있습니다.

  • stemmer_override: 특정 토큰의 스테밍 규칙을 정의할 수 있습니다.
  • keyword_marker: 지정한 토큰을 키워드로 표시합니다. 키워드 토큰은 이후의 스테머 토큰 필터에서 스테밍되지 않습니다.
  • conditional: keyword_marker 필터와 유사하게 토큰을 키워드로 표시하는 데 사용할 수 있습니다.

내장 언어 분석기의 경우 stem_exclusion 파라미터를 사용해 스테밍하지 않을 단어 목록을 지정할 수도 있습니다.