가장 최근의 Node & Steem 시리즈는 약 6~7개월 전에 9편을 마지막으로 연재를 끝냈었는데 뭔가 다시 할게 생겨서 연재를 이어가봅니다. 🤓10편은 형태소 분석기 도입입니다. 지난번 @anpigon님께서도 댓글로 node.js에서의 형태소 분석 사용방법도 꽤나 궁금해하셨고 저도 안그래도 쓸일이 있어서 미루다 미루다 진행을 해봤습니다.
#1 형태소 분석이 뭐에요?
'단어구름 만들기'란 포스팅으로 재밌게 보여준바 있습니다.문장을 의미가 있는 가장 작은 단위로 나누는 것이죠. 예를 들어 '아버지가방에들어가신다.' 라고 있다면 ['아버지', '가', '방','에','들어가신다'] 머 이런식으로 나눈다는 거죠. 가방은 어미의 '가'와 '방'으로 나뉠수도 있고 '가방'으로 분리될 수도 있는거구요. 얼마전 @anpigon 님이
#2 그래서 뭘 할건가요?
저자 별 제목의 형태소 분석을 통해 유사도가 높은 제목을 시리즈로 묶어보는 작업을 진행할 겁니다. 이 기능은 수개월 전(;;;) @forhappywomen님께서 댓글로 저자의 이전 시리즈 글을 달아주는 봇 서비스 제안을 하셨고 나름 어떻게 만들면 좋을까란 생각을 했고 제목을 명사 위주의 단어로 분리해낸 뒤 유사도, 생성일로 묶어 내면 시리즈를 나름 정확 비스무리하게 묶어낼수 있지 않을까란 생각으로 형태소 분석을 시작해보게 되었습니다.
물론 포스팅 제목을 일관되게 작성해주셔야 되는 조건이 붙을 것 같습니다.
예)
개발일기 - 자바 1편
개발일기 - 자바 2편
개발일기 - 자바 3편
...
...
이런 일관된 제목을 인식해서 묶어주고 싶었던 거죠. 코딩쪽에서 보면 좀 무식하게 팩토리얼 돌려서 문자열이 같은지 비교하는 방법도 쓸 수 있겠으나....
#3 바로 실전드갑시다. 형태소 분리부터 해보자!
오랜만이라서 쌩뚱맞겠지만 말입니다. 이전 시리즈에서 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 리눅스 설치
$ gzip -d .gz
$ tar xvf mecab.tar$ 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
$ 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);
});
요래 해놓고 실행을 하면...?
오...올...꽤나 보람차구만... 이번 글 제목으로 바꿔서도 한번 해봅시다.
요렇게... 텍스트만 바꾸고 다시 돌리면...?
흠 ... 아무래도 스팀 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 봇에는 구글 검색 기능이 내장되어있다.
- '@검색 검색어' 댓글을 아무곳에서 입력한다해도 결과를 댓글로 달아줍니다. ㅎㅎ
- 제가 신경쓰지 않더라도 수수료 없이 아직도 계정을 열심히 만들고 있네요.수수료 내지 마시고 만드시길 바랍니다~
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
으아! 드디어!! :)
많이 게을렀습니다. ㅎㅎㅎ 헌데 수기 등록 없이 자동으로 묶어주게 하는 기능을 만드는거라 잘될지 모르겠습니다 ㅎㅎ
오랜만에 개발 글 쓰셨군요. 풀봇!!
감사합니다.~
형태소분석기까지 스팀잇에서 보는 날이 왔군요!ㅜㅜ 감동입니다. ㅜㅜ
자바스크립트로 형태소 분석이라니 놀랍습니다.
이렇게 좋은 라이브러리가 많으니 정말 코딩은 거들뿐인것 같네요 ㅎㅎ
좋은 라이브러리를 개발해주시는 능력자들 덕분에, 저처럼 코딩만 할 줄 아는 개발자는 편하게 개발할 수 있습니다. 그리고 저에게는 어려웠던 node.js 환경셋팅을 쉽게 하시는 것을 보면 @nhj12311님도 능력자입니다.
으엌. 이런말은... 하면 안되는 말씀입니다...
제가 모르고 개발자들한테는 금기어에 해당하는 말을 말해 버렸네요.
죄송합니다.🙀
형태소분석기? 생소한 용어네요.
문장을 잘게 뜯는거라 별거 없는거 같습니당. 세부적으로는 엄청 복잡하지만...
오 이거 Steem Word Clouds 랑 비슷한거 같아요
형태소 분석기 만드는 법을 알려주시다니 감사합니다~
마침 리눅스 서버도 운영하고 있는지라 저도 배워보고 싶은데 시간이 문제로군요
pairplay 가 kr-dev 컨텐츠를 응원합니다! :)