62
PHP로 Slack Bot 만들기 전창완 PHP로 어디까지 개발해봤니

PHP로 Slack Bot 만들기

Embed Size (px)

Citation preview

Page 1: PHP로 Slack Bot 만들기

PHP로 Slack Bot 만들기

전창완

PHP로 어디까지 개발해봤니

Page 2: PHP로 Slack Bot 만들기

전창완

- Oponiti & Allbus 서버 개발자

- Wandu Framework

발표자 소개

Page 3: PHP로 Slack Bot 만들기

Slack Bot

Page 4: PHP로 Slack Bot 만들기

Slack?

Slack Bot

1. 슬랙은 회사 업무용 메신저.

2. 이 안에 다양한 API를 제공.

3. 그 중에 Bot을 위한 RTM(Real Time Messaging) API가 존재.

Page 5: PHP로 Slack Bot 만들기

Slack Bot?

Slack Bot

Page 6: PHP로 Slack Bot 만들기

Slack Bot?

Slack Bot

1. RTM(Real Time Messaging) API 를 통해서 원하는 형태의 봇을 제작 가능.

2. 최소한의 Input/Output 로직을 제공.

3. 너무 간단하게 사용할 수 있어서 사실상 모든 언어에서 다 사용 가능.(PHP가 되면 다 된다고 보면 됨)

Page 7: PHP로 Slack Bot 만들기

왜 시작하게 되었나요?

Slack Bot

1. 업무에 필요한 로직들을 누구나 실행할 수 있었으면..

2. 배포도 해주었으면..

3. 야근할 때 떠들 사람이 필요해서.. (저희 회사는 야근을 하지 않습니다. 진짜로.)

Page 8: PHP로 Slack Bot 만들기

왜 PHP로 만들었어요?

Slack Bot

1. RTM API는 비동기로직이라 Node.js로 작성하면 훨씬 만들기 편해요.

2. 자연어 처리나 인공지능은 Python, Java으로 하면 훨씬 좋아요.

3. 그런데 왜 PHP로…

Page 9: PHP로 Slack Bot 만들기

왜 PHP로 만들었어요?

Slack Bot

1. RTM API는 비동기로직이라 Node.js로 작성하면 훨씬 만들기 편해요.

2. 자연어 처리나 인공지능은 Python, Java으로 하면 훨씬 좋아요.

3. 그런데 왜 PHP로…

여기가 Modern PUG 잖아요.

Page 10: PHP로 Slack Bot 만들기

왜 PHP로 만들었어요?

Slack Bot

1. RTM API는 비동기로직이라 Node.js로 작성하면 훨씬 만들기 편해요.

2. 자연어 처리나 인공지능은 Python, Java으로 하면 훨씬 좋아요.

3. 그런데 왜 PHP로…

언어는 도구일 뿐

Page 11: PHP로 Slack Bot 만들기

Slack RTM API

Page 12: PHP로 Slack Bot 만들기

동작원리

Slack RTM API

1. Socket으로 통신. (아주 단순)

2. https://api.slack.com/rtm

Page 13: PHP로 Slack Bot 만들기

동작원리

Slack RTM API

1. 채널에 봇을 초대합니다.

2. 그 채널에 메시지가 올라옵니다.

3. Slack이 메시지를 Client로 전송합니다. (API)

4. Client에서 프로그램 로직이 동작합니다.

5. Slack Server로 응답을 보냅니다. (API)Client

SlackServer

채널에서 들은 모든 글

응답

Page 14: PHP로 Slack Bot 만들기

동작원리

Slack RTM API

1. 채널에 봇을 초대합니다.

2. 그 채널에 메시지가 올라옵니다.

3. Slack이 메시지를 Client로 전송합니다. (API)

4. Client에서 프로그램 로직이 동작합니다.

5. Slack Server로 응답을 보냅니다. (API)Client

SlackServer

채널에서 들은 모든 글

응답

PHP로 소켓을 제어할 수 있어요…?

Page 15: PHP로 Slack Bot 만들기

잊을만 하면 나오는 라이브러리

Page 16: PHP로 Slack Bot 만들기

React PHP

Slack RTM API

1. Event Driven PHP Library.

2. Promise Pattern 사용.

3. 어 왠지 비동기 스러울 것 같다..

Page 17: PHP로 Slack Bot 만들기

됐고, 그냥 일단 만들어 봅시다.

Page 18: PHP로 Slack Bot 만들기

Slack API 관리페이지

Slack RTM API

1. https://api.slack.com/bot-users

2. Bot을 추가합니다.

Page 19: PHP로 Slack Bot 만들기

Composer Package

Slack RTM API

1. coderstephen/slack-client 패키지 사용.(https://github.com/sagebind/slack-client)

2. composer의 minimal-stability 설정을 dev로 설정.

Page 20: PHP로 Slack Bot 만들기

<?phpuse React\EventLoop\Factory;use Slack\Payload;use Slack\RealTimeClient;require __DIR__ . '/vendor/autoload.php';$loop = Factory::create();$client = new RealTimeClient($loop);$client->setToken(‘xoxb-...’);$client->connect()->then(function () use ($client) { $client->on('message', function (Payload $payload) { print_r($payload); });});$loop->run();

빠르게�작성해봅시다.

Page 21: PHP로 Slack Bot 만들기

결과

Slack RTM API

Page 22: PHP로 Slack Bot 만들기

말하기

Slack RTM API

1. 이제 듣는 법을 알았으니 말하는 법도 익혀봅시다.

2. Payload에 text는 봇이 듣게된 말입니다.

3. Payload에 channel은 봇이 말을 듣게된 채널입니다.

Page 23: PHP로 Slack Bot 만들기

<?phpuse React\EventLoop\Factory;use Slack\ChannelInterface;use Slack\Payload;use Slack\RealTimeClient;require __DIR__ . '/vendor/autoload.php';$loop = Factory::create();$client = new RealTimeClient($loop);$client->setToken('xoxb-...');$client->connect()->then(function () use ($client) { $client->on('message', function (Payload $payload) use ($client) { if ($payload['text'] === '마늘아') { $client->getChannelGroupOrDMByID($payload['channel']) ->then(function (ChannelInterface $channel) use ($client) { $client->send("넹", $channel); }); } });});$loop->run();

Page 24: PHP로 Slack Bot 만들기

말하기

Slack RTM API

Page 25: PHP로 Slack Bot 만들기

정리

Slack RTM API

1. 이 두가지를 잘 응용해봅시다.

Page 26: PHP로 Slack Bot 만들기

정리

Slack RTM API

마늘아

마늘아 뭐하니

마늘아 밥 추천좀

마늘아 오늘의 날씨

놀고 있어요

스파게티 어때요?

맑아요

“마늘아 밥 추천좀”

Page 27: PHP로 Slack Bot 만들기

정리

Slack RTM API

마늘아

마늘아 뭐하니

마늘아 밥 추천좀

마늘아 오늘의 날씨

놀고 있어요

스파게티 어때요?

맑아요

“마늘아 밥 추천좀”

=

Page 28: PHP로 Slack Bot 만들기

전부 “===“로 비교할 순 없잖아요..

Page 29: PHP로 Slack Bot 만들기

그래서 하나 더

Page 30: PHP로 Slack Bot 만들기

자연어 처리 쬐끔

Page 31: PHP로 Slack Bot 만들기

어떻게 접근해 볼 수 있을까

자연어처리

1. 알다시피, “===“를 통해 비교하면 우리의 봇은 우리가 오타라도 나면 벙어리가 됩니다.

2. 제대로 NLP(Natural Language Processing)를 하려면 굉장히 어렵습니다.

3. 그치만 조금만 다르게 생각해봅시다. 어쩌면 우린 이미 답을 알고 있을 수도 있습니다.

Page 32: PHP로 Slack Bot 만들기

조금만 다르게 생각해봅시다.

자연어처리

봇사용자

질문

대답

Page 33: PHP로 Slack Bot 만들기

조금만 다르게 생각해봅시다.

자연어처리

검색엔진사용자

질의

검색결과

Page 34: PHP로 Slack Bot 만들기

조금만 다르게 생각해봅시다.

자연어처리

검색엔진사용자

질의

응답

검색엔진을 응용하면문제를 해결할 수 있겠다!

Page 35: PHP로 Slack Bot 만들기

검색엔진을 알아보자

자연어처리

1. 검색엔진을 깔아서 사브작사브작하면 문제 해결이 됩니다.

2. 그치만, 검색엔진이 해결하는 문제와 우리가 해결하는 문제는 다릅니다.

3. 검색엔진은 긴 문장들로 이루어진 문서들을 찾습니다.

4. 봇은 기존에 알고있는 문장을 찾습니다.(왠지 더 쉬울 것 같다!)

마늘아

마늘아 뭐하니

마늘아 밥 추천좀

마늘아 오늘의 날씨

“마늘아 밥 추천좀”

그림. 쿼리를 가지고 알고있는 문장을 찾습니다.

Page 36: PHP로 Slack Bot 만들기

검색엔진을 알아보자

자연어처리

1. 검색엔진을 깔아서 사브작사브작하면 문제 해결이 됩니다.

2. 그치만, 검색엔진이 해결하는 문제와 우리가 해결하는 문제는 다릅니다.

3. 검색엔진은 긴 문장들로 이루어진 문서들을 찾습니다.

4. 봇은 기존에 알고있는 문장을 찾습니다.(왠지 더 쉬울 것 같다!)

마늘아

마늘아 뭐하니

마늘아 밥 추천좀

마늘아 오늘의 날씨

“마늘아 밥 추천좀”

그림. 쿼리를 가지고 알고있는 문장을 찾습니다.

검색엔진은 여기가 문서

Page 37: PHP로 Slack Bot 만들기

검색엔진을 알아보자

자연어처리

1. 검색엔진의 구조를 살짝 들여다 봅시다.

2. 대충 찾아보니 형태소 분석기라는 녀석을 사용해서 토큰화 시키고, 클러스터링이 어쩌구 저쩌구… 문서 유사도가 어쩌구 저쩌구

3. 3가지 키워드를 알아야 합니다. 형태소 분석기 / 유사도 / 클러스터링

Page 38: PHP로 Slack Bot 만들기

형태소 분석기

Page 39: PHP로 Slack Bot 만들기

한글 형태소 분석기

형태소 분석기

1. http://konlpy-ko.readthedocs.io/ko/v0.4.3/

2. KoNLPY… 또 파이썬이냐…

Page 40: PHP로 Slack Bot 만들기

한글 형태소 분석기

형태소 분석기

1. 한나눔 형태소 분석기 (https://kldp.net/hannanum / C, Java)

2. 꼬꼬마 한글 형태소 분석기 (http://kkma.snu.ac.kr/documents / Java)

3. 로제타 (https://shleekr.github.io / Python)

4. 루씬 한글 분석기 아리랑 (https://sourceforge.net/projects/lucenekorean / Java?)

5. 은전한닢 Mecab Ko (https://bitbucket.org/eunjeon/mecab-ko / C)

Page 41: PHP로 Slack Bot 만들기

한글 형태소 분석기

형태소 분석기

1. 한나눔 형태소 분석기 (https://kldp.net/hannanum / C, Java)

2. 꼬꼬마 한글 형태소 분석기 (http://kkma.snu.ac.kr/documents / Java)

3. 로제타 (https://shleekr.github.io / Python)

4. 루씬 한글 분석기 아리랑 (https://sourceforge.net/projects/lucenekorean / Java?)

5. 은전한닢 Mecab Ko (https://bitbucket.org/eunjeon/mecab-ko / C)

Page 42: PHP로 Slack Bot 만들기

한글 형태소 분석기

형태소 분석기

1. OSX에서 brew에 php56-mecab(또는 php70-mecab)이 이미 있습니다. 그냥 다운받으세요.

2. mecab-ko-dic을 설치합니다. (https://bitbucket.org/eunjeon/mecab-ko-dic)mecab-ko는 필요없습니다. mecab-ko-dic만 설치하시면 됩니다.

Page 43: PHP로 Slack Bot 만들기

MeCab

형태소 분석기

Page 44: PHP로 Slack Bot 만들기

MeCab

형태소 분석기

1. MeCab은 일본어 라이브러리라서 문서가 다 일본어로 나와요.

2. php5.x와 7.x의 동작방식이 달라요.

3. https://github.com/wandu/mecab (제가 이미 다 해놨습니다.)

• MeCab Wrapping Library.

Page 45: PHP로 Slack Bot 만들기

<?phpuse Wandu\Mecab\Mecab;require __DIR__ .'/vendor/autoload.php';$mecab = new Mecab('/usr/local/lib/mecab/dic/mecab-ko-dic');print_r($mecab->parseToString('흠. 한글 형태소 분석기는 어떻게 동작할까요.'));

Page 46: PHP로 Slack Bot 만들기

MeCab

형태소 분석기

https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit?usp=sharing

Page 47: PHP로 Slack Bot 만들기

유사도

Page 48: PHP로 Slack Bot 만들기

어떻게 개선될까요?

유사도

마늘아

마늘아 뭐하니

마늘아 밥 추천좀

마늘아 오늘의 날씨

놀고 있어요

스파게티 어때요?

맑아요

“마늘아 오늘의 추천 메뉴”

Page 49: PHP로 Slack Bot 만들기

어떻게 개선될까요?

유사도

마늘아

마늘아 뭐하니

마늘아 밥 추천좀

마늘아 오늘의 날씨

“마늘아 오늘의 추천 메뉴” = 마늘 + 아 + 오늘 + 의 + 추천 + 메뉴

= 마늘 + 아 + 밥 + 추천 + 좀

형태소 분석기 사용 시..

= 마늘 + 아 + 오늘 + 의 + 날씨

= 마늘 + 아 + 뭐 + 하 + 니

= 마늘 + 아

Page 50: PHP로 Slack Bot 만들기

어떻게 개선될까요?

유사도

마늘아

마늘아 뭐하니

마늘아 밥 추천좀

마늘아 오늘의 날씨

“마늘아 오늘의 추천 메뉴” = 마늘 + 아 + 오늘 + 의 + 추천 + 메뉴

= 마늘 + 아 + 밥 + 추천 + 좀

“마늘아 밥 추천좀”과 매우 유사해 보입니다.

= 마늘 + 아 + 오늘 + 의 + 날씨

= 마늘 + 아 + 뭐 + 하 + 니

= 마늘 + 아

Page 51: PHP로 Slack Bot 만들기

어떻게 개선될까요?

유사도

1. 유사하다는 말은 사람만 이해할 수 있는 말입니다.

2. 이 유사한 기준을 수치로 바꿔야 컴퓨터가 이해할 수 있습니다.

3. 그래서 유사도 함수를 사용합니다.

Page 52: PHP로 Slack Bot 만들기

유사도(Similarity) 함수

유사도

1. 유클리디안 거리

2. 피어슨 상관계수

3. 자카드 계수

4. 타니모토 계수

Page 53: PHP로 Slack Bot 만들기

Jaccard Similarity

유사도

1. 우린 “Jaccard Similarity” 방식을 이용할 겁니다.

2. 그냥 두 집합의 유사도를 구할 수 있다고 생각하면 됩니다.

Page 54: PHP로 Slack Bot 만들기

Jaccard Similarity

유사도

1. 또 집합이 많아지면 유사도를 계산하는데 엄청나게 많은 시간을 소요합니다.(봇한테 말을 걸었는데 10분후에 답장이 오는 그런 사태..)

2. 이 시간을 줄이기 위해 MinHash라는 기법을 사용합니다.

3. 일종의 클러스터링기법.

4. 블로그에 자세히 설명해놨습니다. (http://blog.wani.kr/posts/2016/11/24/minhash)

Page 55: PHP로 Slack Bot 만들기

뭐라는 거지…

Page 56: PHP로 Slack Bot 만들기

Jaccard Similarity

유사도

1. 그냥 이런게 있다 정도만 알아두시고, 실제로 써보실 땐 코드로 작성해놨으니 가져다 쓰세요.

2. https://github.com/ModernPUG/garlicbot/blob/master/src/Math/JaccardSimilarity.php

3. https://github.com/ModernPUG/garlicbot/blob/master/src/Math/MinHashCalculator.php

Page 57: PHP로 Slack Bot 만들기

하여간 지금까지 이야기한걸대충 소스에 녹여봅시다.

Page 58: PHP로 Slack Bot 만들기

실습(https://github.com/modernpug/garlicbot)

Page 59: PHP로 Slack Bot 만들기

실제 봇의 처리과정

마무리

1. Pre-Processing

•오타 보정과 같은 일을 함.

2. Feature Engineering

•Tokenizing (n-gram/ skipgram / word2vec 등 활용 가능)

3. Modeling

•결과 도출 (tf-idf / neural net 활용 가능)

4. Post Processing

•사용자에 맞춰서 결과를 가공함.

Page 60: PHP로 Slack Bot 만들기

정리

마무리

1. 우리는 Feature Engineering과 Modeling의 극히 일부를 구현한 것 뿐입니다.

2. 제대로 하려면 아직도 갈길이 많습니다.

Page 61: PHP로 Slack Bot 만들기

더 공부하고 싶다면..

마무리

1. [발표] 코끼리 냉장고에 집어넣기 : 실시간 추천엔진을 노트북에서 돌게 만들어보자 - 하용호(http://www.numberworks.io/blog/2015/9/17/--1)

2. [도서] 집단지성 프로그래밍 - 토비 세가란(http://www.yes24.com/24/goods/2917663)

Page 62: PHP로 Slack Bot 만들기

Q & A ?