검색엔진/Opensearch / / 2025. 3. 28. 10:30

OpenSearch를 활용한 형태소 분석과 중복 단어 제거

 

검색 품질을 높이기 위해서는 텍스트의 정확한 분석이 필수입니다.

특히 한국어는 띄어쓰기만으로 의미를 구분하기 어렵기 때문에 형태소 분석이 중요합니다.

이번 글에서는 OpenSearch의 내장 분석기인 nori_analyzer를 사용하여 형태소 분석과 중복 단어 제거를 효율적으로 처리하는 방법을 소개합니다.


형태소 분석기: Nori Analyzer

Nori Analyzer는 Elasticsearch와 OpenSearch에서 기본 제공하는 한국어 형태소 분석기로, 텍스트를 의미 단위(형태소)로 쪼개줍니다.


1. 중복 단어 제거 필요성

형태소 분석 과정에서 특정 위치에서 중복된 토큰이 생성될 수 있습니다. 예를 들어, 동의어 필터와 함께 사용하면 동일한 의미를 갖는 단어들이 같은 위치에서 중복 생성될 수 있습니다. 이러한 중복 토큰은 검색 정확도를 떨어뜨릴 수 있어 중복 제거 과정이 필요합니다.

2. 설정 방법

다음은 OpenSearch에서 형태소 분석과 중복 단어 제거를 위한 인덱스 설정 예시입니다.

PUT /my-index
{
  "settings": {
    "analysis": {
      "filter": {
        "nori_unique": {
          "type": "unique",
          "only_on_same_position": false
        }
      },
      "analyzer": {
        "nori_custom": {
          "type": "custom",
          "tokenizer": "nori_tokenizer",
          "filter": [
            "lowercase",
            "nori_unique"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "goods": {
        "type": "text",
        "analyzer": "nori_custom"
      }
    }
  }
}
  • nori_tokenizer: 한국어 형태소 분석을 수행합니다.
  • lowercase: 분석된 형태소를 소문자로 변환하여 통일합니다.
  • nori_unique 필터: 동일 위치에서 생성된 중복 토큰을 제거합니다.

 

3. only_on_same_position 옵션의 차이

  • only_on_same_position: true
    • 동일한 위치(offset)에서 발생한 중복 토큰만 제거합니다.
    • 예시 입력: 동의어 확장 후 동일 위치에서 생성된 토큰 "아이폰 애플폰 아이폰"
    • 결과: "아이폰 애플폰"
  • only_on_same_position: false
    • 위치에 관계없이 필드 내 모든 중복된 토큰을 제거합니다.
    • 예시 입력: "아이폰 아이폰 출시 아이폰"
    • 결과: "아이폰 출시"


특히 쇼핑몰과 같이 검색 점수에 민감한 환경에서는 판매자의 키워드 반복 입력으로 인한 비정상적인 점수 왜곡을 방지하여 공정한 검색 환경을 유지하는 데 큰 도움이 됩니다.

 

 

[실습]


위에서 설명한대로 인덱스를 하나 만들었습니다.

아래쪽에 있는 similarity_no_idf 와 norms는 IDF와 문자길이에 대한 점수 영향을  제거하기위한 스크립트입니다.
오늘 실습할 것에는 영향을 미치지 않습니다.

단, 문자의 길이와 IDF로 인한 점수 차이가 발생할 수 있어, 정말 중복 단어가 잘 적용되었는지 점수를 깔끔하게 보여드리기 위해 추가하였습니다.

 

만든 스크립트를 content 필드에 적용시켜 mappings를 만들었습니다.

 

이제 문서를 삽입하겠습니다.

 

 

첫번째 문서부터 "아이폰" 단어 1개로 시작하여,

세번째 문서는 총 3개의 "아이폰" 단어가 들어간 문장이 삽입되었다는 것을 알 수 있습니다.

 

 

3개의 문서가 잘 삽입되었습니다.

 

이제 조회해보겠습니다.

 

 

 

모든 문서가 1점으로 동일하게 계산된 것을 알 수 있습니다.

 

정말 잘 된게 맞는지 nori_unique 를 제거하고 다시 문서를 삽입해보겠습니다.

 

 

 

결과입니다. 중복 단어로 인해 점수 차등이 생긴 것을 알 수 있습니다.

 

 

'검색엔진 > Opensearch' 카테고리의 다른 글

[opensearch] 인덱스 snapshop 뜨는 방법  (0) 2025.01.20
오픈서치 기본 설치  (0) 2024.09.24
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유