Ordinary day

Elastic Search & mecab-ko 본문

Study/NLP

Elastic Search & mecab-ko

minung14 2017. 2. 24. 10:51

Elastic Search (엘라스틱 서치)

  • 루씬 기반의 검색서버
  • 기본적으로 토크나이저가 공백이나 특수문자만으로 단어들을 분리하기 때문에,
    "아버지가 방에 들어가신다" 라는 문장을 검색할 때는 검색어로 '아버지' 가 아니라 '아버지가' 여야만 검색 결과를 얻을 수 있다.
  • 따라서 한글 검색 관련해서는 형태소 분석과 같은 지원이 필요하다.
  • 데이터 구조 비교

관계 DB

 엘라스틱 서치

 Database

 Index

Table

 Type

 Row

 Document

 Column

 Field

 Schema

 Mapping


  • 기본 문법

데이터 입력

    curl -XPUT host:port/인덱스/타입/id 'json 형태 데이터'
데이터 수정 - 동일한 인텍스, 타입, id로 수정
    curl -XPUT host:port/인덱스/타입/id 'json 형태 데이터'
데이터 확인
    curl -XGET host:port/인덱스/타입/id
데이터 삭제
    curl -XDELETE host:port/인덱스/타입/id
데이터 검색
    curl -XGET host:port/인덱스/타입/id_search?q=검색어


도커에서 엘라스틱서치와 한글 형태소 분석기 설치

위에서 언급했던 검색 관련 문제를 해결하기 위해서는 n-gram 분석이나, 형태소 분석과 같은 인덱스를 추가로 지원해야한다.

여기에서는 은전한잎(mecab-ko)를 설치하여 사용할 것이다.


한꺼번에 설치할 수 있는 도커

docker run -d -p 9200:9200 -p 9300:9300 n42corp/elasticsearch:2.3.1.0


설치 후 빌드

docker build -t n42corp/elasticsearch:2.3.1.0 .


기본 한글 분석기로 데이터 확인

기본 분석기로 문장을 분석해보면 공백으로 각 단어가 나눠지는 것을 볼 수 있다.



데이터 입력 후 검색 해보기 - 형태소 분석기가 적용되어 있지 않은 인덱스

우선 임의로 인덱스에 테스트를 할 데이터를 넣어서 검색을 해보자.


데이터가 들어가있는 것을 확인한 후에 '아버지'라는 단어로 검색을 하게 되면 찾은 데이터가 없는 것을 볼 수 있다.

반면 '아버지가' 라는 단어로 검색을 하면 '아버지가 방에 들어가신다'라는 문장이 검색된다.


형태소 분석기가 적용된 인덱스에서 검색 - mecab_ko_standard_tokenizer가 적용된 인덱스를 생성

curl -XPUT http://192.168.99.100:9200/min_korean/ -d '{

  "settings" : {

    "index":{

      "analysis":{

        "analyzer":{

          "korean":{

            "type":"custom",

            "tokenizer":"mecab_ko_standard_tokenizer"

          }

        }

      }

    }

  },

  "mappings": {

    "text" : {

      "properties" : {

        "text" : {

          "type" : "string",

          "analyzer": "korean"

        }

      }

    }

  }

}'


형태소 분석기가 정상적으로 작동하는 지 확인하기 위해 우선 기본 분석기를 통해서 문장을 분석해보기

아래 그림을 보면 "아버지가 방에 들어가신다" 라는 문장에서 '아버지'와 '방' 이 명사로 추출된 것을 확인할 수 있다.


같은 방식으로 데이터를 넣고 '아버지'라는 단어로 검색을 해보면 아래와 같이 '아버지가 방에 들어가신다'라는 문장이 검색되는 것을 확인할 수 있다.



동의어 필터 추가하기

사용자 사전과 동의어 필터를 추가하려면 직접 도커파일을 만들면 된다.

도커파일을 만들고, 정의된 사전과 필터를 추가한 후에 위와 동일한 방식으로 빌드한 후 실행하면 된다.

이후, 임시 인덱스를 만들고, 필터를 추가하면 된다.


확인해보면 'samsung' 이라는 단어를 분석하면 결과값은 '삼성' 이라는 동의어가 출력되는 것을 확인할 수 있다.


'Study > NLP' 카테고리의 다른 글

2. Word Vector  (0) 2017.08.14
1. Introduction  (0) 2017.08.06
Comments