[개발] Node & Steem #10 - 형태소 분석을 해보자. - mecab, mecab-ya 활용

가장 최근의 Node & Steem 시리즈는 약 6~7개월 전에 9편을 마지막으로 연재를 끝냈었는데 뭔가 다시 할게 생겨서 연재를 이어가봅니다. 🤓10편은 형태소 분석기 도입입니다. 지난번 @anpigon님께서도 댓글로 node.js에서의 형태소 분석 사용방법도 꽤나 궁금해하셨고 저도 안그래도 쓸일이 있어서 미루다 미루다 진행을 해봤습니다.

#1 형태소 분석이 뭐에요?

문장을 의미가 있는 가장 작은 단위로 나누는 것이죠. 예를 들어 '아버지가방에들어가신다.' 라고 있다면 ['아버지', '가', '방','에','들어가신다'] 머 이런식으로 나눈다는 거죠. 가방은 어미의 '가'와 '방'으로 나뉠수도 있고 '가방'으로 분리될 수도 있는거구요. 얼마전 @anpigon 님이 '단어구름 만들기'란 포스팅으로 재밌게 보여준바 있습니다.

스크린샷 2018-09-16 오후 8.05.47.png

#2 그래서 뭘 할건가요?

저자 별 제목의 형태소 분석을 통해 유사도가 높은 제목을 시리즈로 묶어보는 작업을 진행할 겁니다. 이 기능은 수개월 전(;;;) @forhappywomen님께서 댓글로 저자의 이전 시리즈 글을 달아주는 봇 서비스 제안을 하셨고 나름 어떻게 만들면 좋을까란 생각을 했고 제목을 명사 위주의 단어로 분리해낸 뒤 유사도, 생성일로 묶어 내면 시리즈를 나름 정확 비스무리하게 묶어낼수 있지 않을까란 생각으로 형태소 분석을 시작해보게 되었습니다.

물론 포스팅 제목을 일관되게 작성해주셔야 되는 조건이 붙을 것 같습니다.

예)

개발일기 - 자바 1편
개발일기 - 자바 2편
개발일기 - 자바 3편
...
...

이런 일관된 제목을 인식해서 묶어주고 싶었던 거죠. 코딩쪽에서 보면 좀 무식하게 팩토리얼 돌려서 문자열이 같은지 비교하는 방법도 쓸 수 있겠으나....

#3 바로 실전드갑시다. 형태소 분리부터 해보자!

스크린샷 2018-09-16 오후 8.12.31.png

오랜만이라서 쌩뚱맞겠지만 말입니다. 이전 시리즈에서 node.js의 기본적인 설정은 다 마쳤단 말입니다. 그래서 바로 형태소 분석에 들어갑니다.

우선 한글 형태소 분석기는 여러가지가 있는데 mecab-ko, 한나눔, 꼬꼬마, 루씬(아리랑), KoNLPy( @anpigon님이 사용하신 거죠), KLT, 초고속 한국어 형태소 분석기 MACH, KOMORAN 와 이것저것 많이 있네요. 저는 넷상에서 평가가 괜찮아보이는 mecab-ko를 이용해보기로 했습니다.

mecab-ko는 일본어 형태소 분석기인 MeCab을 기반으로 개발된 한국어 형태소 분석기 입니다.

1. 뭘로 사용할지 정했으면 처음엔 설치지요~

1-1 Mac 설치

brew install mecab-ko
brew install mecab-ko-dic

해주니 지혼자 다운받고 설치까지 해줍디다. 맥은 참 편리하군요.

설치가 완료되면 이렇게 확인을 해주고...

mecab 아버지가방에들어가신다

1-2 리눅스 설치

$ wget https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz
$ wget https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.0.1-20150920.tar.gz
$ gzip -d .gz
$ tar xvf mecab
.tar

$ cd mecab-[version]
$ ./configure
$ make
$ make install

$ cd mecab-ko-dic-[version]
$ ./autogen.sh mecab
$ ./configure
$ make
$ make install

1-3 윈도우는 공식적으로는 지원하지 않음.

하지만 넷상에 검색해보니 이미 윈도우용 빌드 환경 프로젝트를 구성해서 성공했다는 글이 몇몇 보이니 그대로 따라 진행해보면 될듯 합니다.

2. 설치가 끝났으니 프로젝트 내에서 형태소 분석기를 사용할 수 있는 라이브러리 설치.

한국 능력자분이신것 같은데 https://github.com/golbin/node-mecab-ya 이런 좋은 라이브러리를 만들어두셨다. 기쁜 마음으로 가져다가 사용하자. 깃헙에 사용방법까지 친절하게 설명해주니 좋게 좋게 따라가자. 아장아장~

npm install mecab-ya

그다음 엔진과 언어팩 같은것을 설치한다.

$ node_modules/mecab-ya/bin/install-mecab
$ node_modules/mecab-ya/bin/install-mecab ko

여기서 mecab를 설치하는 것 보니 앞서 mecab를 설치하지 않아도 동작이 잘 될것이라 생각이 드는 군요. 사실 mecab-ffi 라이브러리를 쓰려다 실패하고 mecab-ya로 건너왔습니다요.

3. 세상 간단한 샘플 만들기.

var mecab = require('mecab-ya');
var text = '아버지가방에들어가신다';
mecab.pos(text, function (err, result) {
    console.log(result);
});

mecab.morphs(text, function (err, result) {
    console.log(result);
});

mecab.nouns(text, function (err, result) {
    console.log(result);
});

요래 해놓고 실행을 하면...?

오...올...꽤나 보람차구만... 이번 글 제목으로 바꿔서도 한번 해봅시다.

스크린샷 2018-09-16 오후 10.39.20.png

요렇게... 텍스트만 바꾸고 다시 돌리면...?

흠 ... 아무래도 스팀 api를 접목시키고 마무리 지어야겠다는 생각이 듭니다. 시리즈물을 발생하는 계정을 모셔서 최근글 제목을 뽑아서 형태소 분석하는 것을 만들고 이번 글을 끝마치도록 합시다.

이번 글에서는 시리즈물을 연재하는 대표적 계정 중 하나인 @keepit의 글 제목을 형태소 분석처리해보도록 하겄습니다.

//일단 콜백 탈출을 위해  fiber로 한번 싸주고...
function pos(text){
    var result = await(mecab.pos(text, defer()));
    return result;
}


var steem = require("./test_steem.js")();
var author = 'keepit';
function getDiscussionsByAuthorBeforeDate(author){
  steem.api.getDiscussionsByAuthorBeforeDate(author, null, '2100-01-01T00:00:00', 30, function(err, result ){
    //console.log(err, result);
    fiber(function() {
      for(var i = 0; i < result.length;i++){
        var resultMecab = pos(result[i].title);
        console.log(result[i].title, resultMecab);
      }
    }); // end fiber..
  });
}

getDiscussionsByAuthorBeforeDate(author);
  • @keepit 최신 글 30개의 제목과 형태소 분석 결과를 출력하는 샘플.

이제 이것들 제목들을 디비화 시키고 형태소 화 시킨 것들의 유사도를 측정해보고 문서 생성일자 등을 조합하여 시리즈 물 별로 묶을 수 있으면 될것 같은데. 케이스가 너무 많아서 잘 될지 안될지 아직 잘 모르겠네요.


오랜만에 기능 홍보합니다.

@steem.apps 봇에는 구글 검색 기능이 내장되어있다.

  • '@검색 검색어' 댓글을 아무곳에서 입력한다해도 결과를 댓글로 달아줍니다. ㅎㅎ

image.png

계정을 만드는 쉬운 방법 3가지

  • 제가 신경쓰지 않더라도 수수료 없이 아직도 계정을 열심히 만들고 있네요.수수료 내지 마시고 만드시길 바랍니다~
    스크린샷 2018-09-17 오전 12.46.16.png

Node & Steem - 지난 회차 살펴보기
1편 - nodejs 개발환경을 구성해보자. 윈도우 개발 + Github 저장소 + 리눅스 운영
2편 - 콜백 지옥을 탈출해보자. - synchronize.js 편
3편 - 로깅 처리와 DB(mysql)설치 및 설정
4편 - DB 설정과 운영서버까지 설정 마무으리!
5편 리스팀 알림 봇을 만들어볼까? #1
6편 리스팀 알림 봇을 만들어볼까? #2 whitelist 데이터 수집
7편 리스팀 댓글 알림 봇 #3 시범오픈과 구현 마무으리!
8편 - 간단한 서버 관리 다섯가지 팁 - 쉘 접속과 alias 지정 등
9편 - 스팀 노드 서비스 연결이 끓어질 때 해결방법 + 리스팀 목록 확인 명령 추가



참고 글
https://proinlab.com/archives/1935
http://www.ministory.net/xe/229029
https://github.com/golbin/node-mecab-ya


H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now