엘라스틱 서치를 쓰면서 기존에 형태소 분석기를 아리랑, 은전한닢, open korea등을 사용했었다.


근데 이번에 6.4버전이 출시 되면서 Elasticsearch에서 기본으로 제공하는 한글 형태소 분석기가 나왔다. 이름은 nori(노리)이다. 

노리는 놀이라는 뜻에서 가져왔으며 mecab-ko-dic 사전을 이용하지만 사전을 압축하므로 기존 형태소 분석기와 비교하여 메모리를 적게 쓰고 훨씬 빠르다.


그럼 Docker에 엘라스틱서치 6.4와 Kibana 6.4를 설치하고 Nori 플러그인을 설치해서 한글 형태소분석기를 사용해보자.


Docker에 Elasticsearch와 Kibana 설치

1
2
docker run --9200:9200 -9300:9300 --name elastic -"discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.4.0
docker run ---link elastic:elastic-url -"ELASTICSEARCH_URL=http://elastic-url:9200" -5601:5601 --name kibana docker.elastic.co/kibana/kibana:6.4.0
cs

설치를 완료하고 docker process를 확인하여 정상 동작하는지 확인한다.



Elasticsearch에 Nori 플러그인 설치

엘라스틱서치 bash셀에 접근해서 anaysis-nori를 설치한다.

1
2
3
4
5
6
// elasticsearch의 bash셀 접근
docker exec -it elastic /bin/bash
 
 
// 노리 플러그인 설치
bin/elasticsearch-plugin install analysis-nori
cs


설치가 완료되면 elasticsearch 프로세스를 재 시작 한다. 그러면서 프로세스가 올라올때 Nori 플러그인이 정상적으로 올라오는지 확인해보자.

1
[2018-10-13T01:26:05,498][INFO ][o.e.p.PluginsService     ] [dFC4eSy] loaded plugin [analysis-nori]
cs


그리고 Kibana를 사용해서 분석 플러그인 동작을 확인하자

1
2
3
4
5
6
7
GET _analyze
{
  "analyzer": "nori",
  "text" : "안녕 나는 바보 위들이야."
}
 
 
cs




사전 추가하기

위에 결과를 보면 위들이라는건 하나의 대명사로써 내 별칭인데 '들'이라는 조사를 제거하고 보여주느라 위들이라는 단어가 사라졌다. 이를 해결하기위해 사전을 만들어서 위들을 추가해보자.


먼저 사전에 사용될 사전은 mecab-ko-dic을 사용한다. 플러그인 설치했던것처럼 Elasticsearch에 접속하여 config/userdict_ko.txt를 생성한다. 그리고 그 txtx파일에 "위들"을 추가한다.


그리고 해당 사전을 사용하도록 anaylzer를 생성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PUT nori_sample
{
  "settings": {
    "index": {
      "analysis": {
        "tokenizer": {
          "nori_user_dict": {
            "type": "nori_tokenizer",
            "decompound_mode": "mixed",
            "user_dictionary": "userdict_ko.txt"
          }
        },
        "analyzer": {
          "my_analyzer": {
            "type": "custom",
            "tokenizer": "nori_user_dict"
          }
        }
      }
    }
  }
}
cs


그리고 다시한번 조회해보자.

1
2
3
4
5
6
GET nori_sample/_analyze
{
  "analyzer": "my_analyzer",
  "text" : "안녕 나는 바보 위들이야."
}
 
cs

결과를 확인해보면 정상적으로 위들이 형태소분석기에 의해 잘 나누어지는 것을 볼 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{
  "tokens": [
    {
      "token": "안녕",
      "start_offset": 0,
      "end_offset": 2,
      "type": "word",
      "position": 0
    },
    {
      "token": "나",
      "start_offset": 3,
      "end_offset": 4,
      "type": "word",
      "position": 1
    },
    {
      "token": "는",
      "start_offset": 4,
      "end_offset": 5,
      "type": "word",
      "position": 2
    },
    {
      "token": "바보",
      "start_offset": 6,
      "end_offset": 8,
      "type": "word",
      "position": 3
    },
    {
      "token": "위들",
      "start_offset": 9,
      "end_offset": 11,
      "type": "word",
      "position": 4
    },
    {
      "token": "이",
      "start_offset": 11,
      "end_offset": 12,
      "type": "word",
      "position": 5
    },
    {
      "token": "야",
      "start_offset": 12,
      "end_offset": 13,
      "type": "word",
      "position": 6
    }
  ]
}
cs



참고

https://www.elastic.co/guide/en/elasticsearch/plugins/6.4/analysis-nori.html

https://www.elastic.co/kr/blog/nori-the-official-elasticsearch-plugin-for-korean-language-analysis

https://www.elastic.co/guide/en/elasticsearch/plugins/6.4/analysis-nori-tokenizer.html

http://book.naver.com/bookdb/book_detail.php?bid=8377266


빅데이터의 다음 단계는 예측 분석이다
국내도서
저자 : 에릭 시겔(Eric Sigel) / 고한석역
출판 : 이지스퍼블리싱 2014.11.26
상세보기




회사에 책꽂이에 있던 책중에 어떤책을 읽을까 고민하다가, 데이터분석을 복수전공하면서 읽어보려다가 읽지 못한 "빅데이터의 다음단계는 예측분석이다"라는 책을 골랐다.

책의 내용은 다양한 시행착오를 통해서 예측분석을 성공시킨 사례들과
어떤 원리로 예측분석을 진행하는 것이 좋은지 소개하고 있다.

간단하게 내가 본 내용을 정리했다.

예측 분석을 위해서는 먼저 무엇을 예측하려고 하는지 고르고 무엇을 얻고자 하는지 목표를 정확히 세워야 한다.

그 다음 주어진 데이터를 이용하여 다양한 방법으로 예측 모델을 학습시킨다.
가장 인상적으로 보았던 모델 학습 방법은 서로 각기 다른 모델을 사용하여 앙상블 모델을 만드는 부분이였다.

서로의 부족한 부분을 보완해주는 부분에서 사람들 더 나은 사람이 되기 위해서 서로에 보완이 될 수 있는 사람이 필요하다는 이야기와 일맥상통한 부분이 있어 인상깊었다.

무조건적인 데이터 학습이 과연 좋은걸까?
정답을 지향하는 데이터 학습은 오히려 데이터에 편향적인 과적합(overfitting)이 될 수 있다.

과적합을 예방하기 위해서 학습 데이터와 테스트 데이터를 랜덤하게 나누어서 모델의 정합성을 확인 해 보는 등의 작업이 필요하다.

그리고 적합하지 않은 학습 방법은 방법과 데이터를 바꾸어서 다양하게 학습을 시켜야한다.
힘든과정을 통해서 추출한 데이터에서 금을 찾아내는 것은 모델을 만드는 것 이상으로 힘들다.

그 이유를 예를들어 확인해보자.

데이터 분석을 통해
아이스크림 판매량이 늘었을 때, 상어에 물려죽는 사람들이 많다는 결과를 도출했다고 가정하자.

이를 다음과 같이 결론을 도출했다고 새각해보자.
아이스크림을 취식한 사람의 냄새가 상어를 부른다. ->그러므로 아이스크림을 먹고 수영하지 말자

과연 정답일까? 일반적인 사람이라면 정답이 아니라고 바로 생각할 것이다.

그럼 어떻게 생각을 할 수 있을까?
아이스크림 판매량이 많다. -> 날씨가 덥다 -> 수영을 많이한다. -> 상어에 물릴 가능성이 늘어난다.

이렇게 결론을 도출하면 조금더 그럴듯하게 생각할 수 있다.

4차산업 시대가 도래하면서 수백만의 데이터가 초단위로 생성된다. 이를 처리하는 하둡, 스파크와 같은 맵리듀스 기술과 데이터에서 가치를 찾는 통계, 데이터사이언티스트에 대한 관심도 높아지고 있다.

이런 시대에서 다양하게 수집되는 데이터를 단순하게 통계 그래프로만 출력한다면 이는 20세기에 머무르는 프로그램이라는 생각이 든다. 물론 어떤 프로그램이냐에 차이가 있다.

하지만 정말 궁금함이 많고 더 진취적인 사람이라면 과연 이 데이터를 통해 무엇을 할 수 있는지 생각해 볼 수 있어야 한다는 의견이다.

결국
금도 금광의 위치를 볼줄아는 사람이 캐는것이다.
나도 완벽한 사람은 아니지만 금을 이쁘게 포장하는 사람이 아니라 흙속에서 금을 찾을 수 있는 연금술사 같은 개발자가 되기 위해 더욱 더 노력해야겠다.


+ Recent posts