20170227 파이썬으로 챗봇_만들기

49
파이썬으로 챗봇 만들기 (With Natural Language Interface) 2017.02.27 발표자 : 김성동

Upload: kim-sungdong

Post on 12-Apr-2017

7.420 views

Category:

Software


6 download

TRANSCRIPT

Page 1: 20170227 파이썬으로 챗봇_만들기

파이썬으로 챗봇 만들기(With Natural Language Interface)

2017.02.27

발표자 : 김성동

Page 2: 20170227 파이썬으로 챗봇_만들기

이름 : 김성동(@DSKSD)

연락처 : [email protected]

숭실대 경영/글로벌미디어 (졸업ㅜㅜ)

현재는 스타트업에서 챗봇을 개발중입니다:)

Hello !!

Page 3: 20170227 파이썬으로 챗봇_만들기

목차

1. Introduction

2.Main Components of Chatbot

3.Deep Learning for Chatbot

4.Conclusion

Page 4: 20170227 파이썬으로 챗봇_만들기

Introduction

“Facebook's future is in Chatbot” 2016.4, Mark Zuckerberg

Inspiration – 거창한 이유

Lock-In effect(고객 고착화)

Automation(비용 절감)

Page 5: 20170227 파이썬으로 챗봇_만들기

IntroductionInspiration – 개인적인 이유

데이터 수집이 비교적 쉽다.(웹에는 텍스트 천지다.)

필요하다면 데이터를 만들어 낼 수도 있다. (Dialogue Design 일명 노가다)

아주 다양하고 범용한 응용 도메인 (언어는 어디서나 사용하니깐..!)

아직 미개척지가 많은 Challenging한 분야!! (잘하면 Pioneer가 될 지도..?)

언어(대화)에 문화적 특성이 녹아 있어서 구글에게 정복당할 확률이 그나마 낮은 분야(자국어의 경우...)

Page 6: 20170227 파이썬으로 챗봇_만들기

IntroductionWhat is Chatbot?

챗봇 = 인공지능?

챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)

Page 7: 20170227 파이썬으로 챗봇_만들기

IntroductionWhat is Chatbot?

챗봇 = 인공지능?

챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)

User InterfaceUser Interface

Input Output

Answer Maker

Process

* 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음

Page 8: 20170227 파이썬으로 챗봇_만들기

IntroductionWhat is Chatbot?

챗봇 = 인공지능?

챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)

User InterfaceUser Interface

Input Output

Answer Maker

Process

상대방(유저)으로부터 입력을 받아들이는 부분

간단한 명령어/키워드(#시작)버튼(후보 답변 중 선택)

자연어(Natural Language Understanding)

* 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음

풍부

단편

Page 9: 20170227 파이썬으로 챗봇_만들기

IntroductionWhat is Chatbot?

챗봇 = 인공지능?

챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)

User InterfaceUser Interface

Input Output

Answer Maker

Process

목적

Closed Domain(Goal based)Open Domain(General Bot)

적절한 답변을 만들어내는 부분

Rule basedRetrievalInference

* 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음

풍부

단편

Page 10: 20170227 파이썬으로 챗봇_만들기

IntroductionWhat is Chatbot?

챗봇 = 인공지능?

챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)

User InterfaceUser Interface

Input Output

Answer Maker

Process

답변을 유저가 보기에 적절한 형태로 가공하여 전달

답변 검색(Database Retrieval) #심심이템플릿(Entity/Information 끼워넣기)

자연어(Natural Language Generation)

* 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음

풍부

단편

Page 11: 20170227 파이썬으로 챗봇_만들기

Introduction

그래서 오늘 집중해서 소개하고 싶은 챗봇은 바로!! 요것

Natural LanguageInterface

자연어로 입력을 받아서

Inference basedAnswer Maker

(Closed domain)

가장 적절한 답변을 추론한다

Page 12: 20170227 파이썬으로 챗봇_만들기

Main Components of Chatbot목적을 상기해보자

자연어로 입력 받아서 가장 적절한 답변을 추론한다.

상대방의 발화 의도 파악(Intent)

대화의 맥락도 고려(Context)

상대방의 발언 중 개체를 파악(Entity)

(답변을 추론(Inference))이건 다음 챕터에서 ...!

* 이 Components도 명확히 구분 되는 것이 아님..!!

Page 13: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotIntent

U: 안녕B: 안녕하세요.U: 오늘 날씨 어때?B: 어디요?U: 어디긴, 서울이지B: 오늘 서울 날씨는 맑음입니다.U: 고마워B: 이용해주셔서 감사합니다.

1. Greeting()

2. AskWeather()

2. AskWeather()

아주 간단한 Goal Bot(날씨 알려주는 봇)을 만들어 보며 각 Component들을 살펴보자 ~이를 위해 Intent는 총 5가지로 정의한다.

3. Appreciate()

4. Bye() 5. Other()

Page 14: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotIntent

가장 간단한 방법 : Keyword Matching

def Greeting(sentence):

# 인사 Intent를 캐치하기 위한 키워드들GREETING_KEYWORDS = ["ㅎㅇ", "하이", "안녕", "안뇽", "하잉“]

# 후보 답변GREETING_RESPONSES = ["ㅎㅇ", "하이","안뇽", "안녕하세요"]

# 키워드를 캐치하면 답변을 한다.for word in sentence:

if word.lower() in GREETING_KEYWORDS:return random.choice(GREETING_RESPONSES)

유저의 어휘는 이것보다 훨씬 풍부할 수 있는데, 미리 키워드가 정의되어 있지않으면 Intent를 캐치할 수 없다. 확실하지만 시간과 노력이 많이 든다. (Rule based의 일종)

Page 15: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotIntent

좀더 나은 방법 : Intent Classifier

1. Raw text를 전처리하고 벡터화 (konlpy, genism)2. Intent Classifier 트레이닝 (sklearn)3. Classifier로부터 의도 파악

Raw textPreprocessing

Vectorize Classifier

1

2

3

4

5

Page 16: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotIntent - Preprocessing

좀더 나은 방법 : Intent Classifier

from konlpy.tag import Twittertagger = Twitter()

def Preprocessing(sentences):"""raw_text를 토큰화하고 간단한 전처리(숫자-><NUM>) """result = []for sent in sentences:

processed_sent = []pos_tagged = tagger.pos(sent) # 안녕ㅋㅋ -> [('안녕', 'Noun'), ('ㅋㅋ', 'KoreanParticle')]

for token in pos_tagged:if token[0].isdigit():

token[0] = '<NUM>' processed_sent.append(token[0]+'/'+token[1])

result.append(processed_sent)return result

Page 17: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotIntent - Vectorize

좀더 나은 방법 : Intent Classifier

import gensim

def Vectorize(sentences):

Text를 모델에 Input으로 주기 위해 벡터로 표현한다. 여러 가지 방법 有

1> One-hot Vector2> Bag-of-words3> TFIDF4> Word2Vec(Glove)5> Paragraph2Vec (Doc2Vec) (link)6> RNN Encoder7> CNN for text (link)8> FastText (link)

출처 : 한국어와 NLTK, Gensim의 만남, 박은정, 2015 Pycon

Page 18: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotIntent - Vectorize

좀더 나은 방법 : Intent Classifier

from gensim.models import doc2vec

# 트레이닝 과정 생략

doc_vectorizer = doc2vec.Doc2Vec.load('doc2vec.model') # trained modeldef Vectorize(processed_sent):

return doc_vectorizer.infer_vector(processed_sent)

U: 오늘 날씨 어때?

Classifier(Logistic Reg,

SVM,Random Forest,

NN)

2 (AskWeather)

Page 19: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotIntent - Classifier

좀더 나은 방법 : Intent Classifier

from sklearn.linear_model import LogisticRegression

classifier = LogisticRegression(random_state=1234)

# classifier.fit(train_x, train_y) # 트레이닝 과정 생략

intent = classifier.predict(vectorized_sent)

U: 오늘 날씨 어때?

Classifier(Logistic Reg,

SVM,Random Forest,

NN)

2 (AskWeather)

Page 20: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotEntity

드디어 유저의 발화 의도를 알아냈다..!! 이제 답변을 하면 되는데..

U: 오늘 날씨 어때?

B: 어디요?

성공적인 응답을 하기 위해서는 '오늘'이라는 '날짜'에 관한 정보를 이해하고 오늘 특정 위치(도시)의 날씨를 알려주어야 성공적인 응답이 될 것이다. 따라서 봇은 유저가 '위치'에 관한 정보를 알려주지 않았다는 것을 캐치하고 위와 같이 되물어야 한다. (아직 문맥(Context) 고려 x)

2 (AskWeather)

Page 21: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotEntity

문장에서 개체(Entity)를 알아내자! (Named Entity Recognition)

A named entity is a collection of rigidly designated chunks of text that refer to exactly one or multiple identical, real or abstract concept instances.

Person, Location, Organization, Date, Time, ...

Ex)오늘/Date 날씨 좀 알려줘오늘 이대/Location에서 보아즈/Organization 전체세션 합니다.담주/Date 제주도/Location 날씨 좀 알려줘!

개체(Entity)란?

Page 22: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotEntity

여기서도 가장 간단한 방법은 NER 사전으로 단어들을 검사하는 것.하지만 NER 사전에 포함되어 있지 않은 단어들을 캐치해내지 못하고 신조어에도약하다……! 역시나 시간과 비용의 이슈가 있다. 결국 사전 관리를 사람이 해야하기 때문이다.

=> 이번에도 머신러닝을 이용해서 알아내잣!

# 수도 코드Load NER_dict

for token in sent:if token in NER_dict:

Check

Page 23: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotEntity

직접 데이터를 모아서 모델을 만들자!!!아쉽게도 NER 태거는 공개된 코퍼스가 없다..

Sequence Labeling Model (HMM, CRF, RNN, ...) for POS, NER Tagging

𝑧1 𝑧2 𝑧3

𝑥1 𝑥2 𝑥3관찰열(Observation Sequence)

내재 변수 (Latent state)전이 확률(T) 전이 확률(T)

배출 확률(E) 배출 확률(E) 배출 확률(E)

https://github.com/krikit/annie

* ANNIE [2016 국어 정보 처리 시스템 – 개체명 인식 시스템]

Hidden Markov Model[Kaist 문일철 교수님]

Page 24: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotEntity

BIO 태그 for NER Model

데이터에 태깅(레이블링) 할 때, 단순하게 토큰마다 태깅을 하면 문제가 있다.두 개 이상의 토큰이 하나의 Entity를 구성하는 경우가 많기 때문이다.

Ex> <웨인 루니>/Person, <경기도 성남시 분당구>/Location

이러한 이슈를 해결하기 위한 트릭으로 BIO 태그를 사용한다.B : Entity의 시작 토큰, I : B 뒤로 이어지는 Entity 토큰, O : Other

Ex>

웨인/B-PER 루니/I-PER, 경기도/B-LOC 성남시/I-LOC 분당구/I-LOC

Page 25: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotEntity

Conditional Random Field for NER

http://homepages.inf.ed.ac.uk/csutton/publications/crftut-fnt.pdf

Page 26: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotEntity

Conditional Random Field for NER

import pycrfsuite # pip install python-crfsuite

def word2features(sent, i):1> 자신의 앞뒤로 -2~2의 형태소2> 자신의 앞뒤로 -2~2의 POS 태그3> 자신의 접미사4> 형태소의 길이5> 숫자 여부6> 기호, 구두점 여부7> 형태소의 어절 내 위치…return features

CRF를 이용한 한국어 자동 띄어쓰기(설진석님 블로그)

Page 27: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotEntity

Conditional Random Field for NER

import pycrfsuite # pip install python-crfsuite

# 트레이닝 과정 생략

tagger = pycrfsuite.Tagger()tagger.open('myner.crfsuite') # trained model

Predict = tagger.tag(sent2features(example_sent))

# 오늘 서울 날씨 어때 ?# B-DATE B-LOC O O O

CRF를 이용한 한국어 자동 띄어쓰기(설진석님 블로그)

cf. 모델의 검증은 Classification의 지표인Precision/Recall/F1-Score로 하는 것이 일반적.

한국어의 경우 보통 F1-Score로 80 전후가 나온다... 20퍼센트의 오차가 비즈니스를 망칠 수도..?!

현재 state-of-the-art의 성능을 보이는Bidirectional LSTM + CRFhttps://github.com/rockingdingo/deepnlp

Page 28: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotEntity

유저의 발화의도와 Entity까지 알아낼 수 있다. 답변을 한다!

U: 오늘/Date 날씨 어때?

B: 어디요?

AskWeather(LOC, DATE=today)

U: 어디긴, 서울/Location이지 AskWeather(LOC=Seoul, DATE=today)

B: 오늘 서울 날씨는 맑음입니다.

현재 이 간단한 날씨봇은 답변을 directly Inference 하기 보단 Intent를 파악하고답변에 필요한 Entity가 모두 충족되면 API Call을 하는 방식으로 동작하고 있다.(Slot filling)(현재는 이러한 Process 자체가 Inference)

Page 29: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotContext

API Call을 통해 답변을 내놓고 나면 Context를 파악하지 못하고다시 무로 돌아간다...!! (즉, 봇 자신이 방금 전까지 무슨 대화를 했었는지 알지 못함)

U: 오늘/Date 날씨 어때?

B: 어디요?

AskWeather(LOC, DATE=today)

U: 어디긴, 서울/Location이지 AskWeather(LOC=Seoul, DATE=today)

B: 오늘 서울 날씨는 맑음입니다.

U: 내일/Date은?

B: 네..?

Other()

Page 30: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotContext

API Call을 통해 답변을 내놓고 나면 Context를 파악하지 못하고다시 무로 돌아간다...!! (즉, 봇 자신이 방금 전까지 무슨 대화를 했었는지 알지 못함)

EX> 레스토랑 Slot filling (이상적인 대화)

B> 안녕하세요. 무엇을 도와드릴까요?U> 오늘 저녁 7시에 6명으로 이탈리안 레스토랑 찾고 있어요.B> 알겠습니다. 가격대는 어느 정도로 생각하고 계세요?U> 1인당 2만원 이하요.B> 위치는 강남이 맞나요?U> 네 맞아요.B> 알겠습니다. 더 추가할 사항은 없으신가요?U> 네 없어요.B> API CALL

LOCATION : 강남

PRICE_RANGE : 2만원

NUM_OF_PEAPLE : 6

TYPE_OF_CUISINE : 이탈리안

TIME : 오늘 저녁 7시

Entities

Page 31: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotContext

API Call을 통해 답변을 내놓고 나면 Context를 파악하지 못하고다시 무로 돌아간다...!! (즉, 봇 자신이 방금 전까지 무슨 대화를 했었는지 알지 못함)

Entities

EX> 레스토랑 Slot filling (Context 관리 안될 경우)

B> 안녕하세요. 무엇을 도와드릴까요?U> 오늘 저녁 7시에 6명으로 이탈리안 레스토랑 찾고 있어요.B> 알겠습니다. 가격대는 어느 정도로 생각하고 계세요?U> 1인당 2만원 이하요.B> 시간대를 알려주시겠어요?U> 오늘 저녁 7시라니깐요..B> 알겠습니다. 더 추가할 사항은 없으신가요?U> 위치는 어디로 하시려구요?B> 죄송해요. 못찾겠어요.U> ;;

LOCATION : NULL

PRICE_RANGE : 2만원

NUM_OF_PEAPLE : 6

TYPE_OF_CUISINE : 이탈리안

TIME : NULL

Page 32: 20170227 파이썬으로 챗봇_만들기

Main Components of ChatbotContext

가장 간단한 방법은 이전 대화 로그를 저장해두고 Intent와 Entity를 자연스럽게참조하는 것.

def weatherBotEngine(User,userSay):

context = stack(User).pop() # 수도코드, 이전 대화의 로그를 참조한다entities = tagger.tag(sent2features(example_sent))entities.extend(context['entities'])sent_vector = Vectorize(Processing(userSay)) intent = intentClassifier.predict(sent_vector)pre_intent = context[‘intent‘]

# 최종 Answer making# 쪼꼼 복잡한 로직 ~_~

return reply

Page 33: 20170227 파이썬으로 챗봇_만들기

Deep Learning for Chatbot

이렇게 아주 간단한 Goal bot을 만드는 것만해도 상당한 노력이 들어간다... 또한 다양한 한계도 존재한다.

그러다 보니 봇 연구자들은 자연스럽게 End-to-End 방식을 갈구하게 된다!! (질문과 답만 줄 테니 알아서 좀 해봐..)

실제로도 학계, 산업계에서 많은 실험이 진행되고 있다. (아직 그리 잘되진 않는 모양)그 중에서는 답변을 Directly Inference하는 Deep Learning model, 혹은 앞서 소개한 여러 컴포넌트와 Deep Learning을 혼재해서 사용하는 model 등 그 모양새도 다양..

이러한 Deep learning model들 중 대부분은 Machine Translation의 Seq2Seq 모델에 영감받아 다양한 변형과 응용을 하고 있다.

Page 34: 20170227 파이썬으로 챗봇_만들기

Deep Learning for ChatbotSequence2Sequence model

Encoder와 Decoder라고 하는 2개의 RNN(LSTM)으로 이루어진 구조.

Encoder : 문장(sequence)를 인풋으로 받는데 각 timestep 당 하나의 word(token)으로 받아 처리를 한다. 이는words의 시퀀스를 고정된 사이즈의 feature vector로 변환한다.

* 이 feature vector는 인풋에 관한 중요한 정보만 담고 불필요한 정보들은 까먹는다! 이러한 feature vector는input sequence의 요약을 가지고 있다고 볼 수 있으며 context or thought vector라고 부른다.

Decoder : 디코더는 thought vector를 넘겨받아 아웃풋 sequence를 generate한다. Vocab을 target으로 Softmax!

Page 35: 20170227 파이썬으로 챗봇_만들기

Deep Learning for ChatbotSequence2Sequence model

시퀀스 모델의 한계점 :

1> 문법적 오류 존재

2> 여전히 대화의 맥락을 이해하지 못한다.(Context)

3> 다양성의 부재(확률적으로 '몰라요', '그렇군요' 등과 같은 일반적인 답변이 나올 가능성이 높다)

코드 : Goblin(김진중)님 Tensorflow tutorial 04. Chatbot 참고

Page 36: 20170227 파이썬으로 챗봇_만들기

Deep Learning for ChatbotHierarchical Recurrent Encoder Decoder

HRED는 Seq2Seq2 모델이 2계층으로 이루어져있다.

하나는 word level의 sequence

하나는 Dialogue level의 sequence

* Context hidden state : m번째 발언까지의 context들을 내포하고 있음!

𝑼𝒎+𝟏 예측에 사용

(Context를 답변 추론에 녹이기 위한 방법)

Context hidden state

https://arxiv.org/abs/1507.04808

Page 37: 20170227 파이썬으로 챗봇_만들기

Deep Learning for ChatbotHierarchical Recurrent Encoder Decoder

꽤나 그럴싸 하지만, 실은 I don't know나 I'm sorry와 같은 일반적인 답변을 많이 한다. 즉, 다양성이 부족..

1> data scarcity2> token의 대부분이 대명사3> triple 자체가 너무 짧다. {𝑈1, 𝑈2, 𝑈3}

https://arxiv.org/abs/1507.04808

Page 38: 20170227 파이썬으로 챗봇_만들기

Deep Learning for ChatbotAttention

https://arxiv.org/abs/1507.04808

Seq2seq 모델의 큰 한계점 중 하나는 전체 정보가 고정된 길이의 vector(context)로 인코딩 돼야 한다는 것이다. 그렇기에 인풋 문장의 길이가 길어질 수록, 많은 정보들이 손실된다.

때문에 긴 문장을 잘 디코딩 못한다.

Attention 메커니즘은 디코더가 디코딩을 하는 동안 인풋 시퀀스 중 어디에 집중할지를 결정하여디코딩에 반영하는 방법

Page 39: 20170227 파이썬으로 챗봇_만들기

Deep Learning for ChatbotDialogue System as Reinforcement Learning

POMDP(Partially Observable Markov Decision Process)와 Reinforcement learning을 이용해Task(Goal) Oriented Bot 문제를 풀려고 했던 시도가 있었으나 action과 state space를 모두 hand-written (룰)에 기반하여 디자인했었기에 불안정한 모델이었음..!! (not scalable)

http://mi.eng.cam.ac.uk/~sjy/papers/ygtw13.pdf

Page 40: 20170227 파이썬으로 챗봇_만들기

Deep Learning for ChatbotDialogue System as Reinforcement Learning

하지만 앞선 모델에 영감 받아 다양한 시도들이 있다. State와 Action은 딥러닝 모델을 이용하여Directly Inference하되 이러한 모델의 주요 포인트는 Reward를 어떻게 주느냐..! (어떤 대답이 좋은대답인지를 수치화 시켜야 하는 문제)

https://arxiv.org/abs/1601.04574

Page 41: 20170227 파이썬으로 챗봇_만들기

Deep Learning for ChatbotHybrid Model

기존의 머신러닝 방식과 딥러닝(RL) 방식의 장점을 융합하고 단점을 상호보완 하려 하는 시도들도 존재

https://arxiv.org/abs/1606.01269

https://arxiv.org/abs/1604.04562

Page 42: 20170227 파이썬으로 챗봇_만들기

Deep Learning for ChatbotMemory Network

기존 RNN 기반 모델(LSTM Cell 포함)들은 아주 아주 긴 long term memory를 읽고 쓰는 능력이 부족하다. 특히 특정 사실을 정확히 기억하고 있는 것을 못한다. (Memorization)이러한 한계를 극복하기 위해 Memory Network는 외부 메모리에 정보를 적절하게 쓰고 읽는 법을학습하여 답변 추론에 이용하는 모델이다.

https://arxiv.org/abs/1503.08895코드 : 김태훈님 MemN2N Tensorflow Implementation 참고

Page 43: 20170227 파이썬으로 챗봇_만들기

Deep Learning for ChatbotLearning through Dialogue Interaction

Memory Network는 메모리에 적당한 정보가 없는 경우 답변을 제대로 하지 못한다. (상대방의 오타,처음 보는 단어 등...) 이런 경우 상대방에게 질문을 던져 힌트를 얻는 방식으로 상호작용하며 대화를이어나갈 수 있다. 이때 언제 질문을 던져야 할지 강화학습으로 학습한다.

https://arxiv.org/abs/1612.04936

Page 44: 20170227 파이썬으로 챗봇_만들기

Conclusion정리

제목은 거창하게 지어놓고 막상 코드는 거의 날림으로... 큭..(죄송합니다.)

어찌됐건 오늘의 목적은 챗봇이란 무엇이며, 무엇이 중요한 Issue인지 전달하는 것.(전달이 되었나요..?)

사실은 이러한 봇을 편하게 만들도록 지원하는 여러 Bot Framework가 존재한다.다만,

1> 돈이 든다.2> 한국어? 잘 안된다.(사실 안 써봐서 몰라요..)

3> 스스로 개선시키기 어렵다

Page 45: 20170227 파이썬으로 챗봇_만들기

Conclusion스스로 개선시키자 - 파이썬

파이썬은 자연어 처리를 하기에 매우 좋은 언어!!

문장을 토큰화하여 리스트에 담는 것으로부터 시작

start> NLP with Python [link]

또한 다양한 패키지를 지원한다.

nltkspaCynumpykonlpygensimpython-crfsuite

특히, 쏟아져 나오고 있는 딥러닝 기반의 챗봇들도 구현해볼 수 있다.(과연?) (feat. Tensorflow)

https://github.com/datanada/Awesome-Korean-NLP

Page 46: 20170227 파이썬으로 챗봇_만들기

ConclusionWhat is good conversation?

답변을 Inference(추론)하는 챗봇들을 쭉 살펴본 결과 어떤 대화가 좋은 대화인지에 대한 측정 기준이미비하다. Ex> Perplexity, (Entity) F1-Score, BLEU, Task-complete, DSTC 등의 간접지표 사용

https://research.fb.com/downloads/babi/http://camdial.org/~mh521/dstc/

Page 47: 20170227 파이썬으로 챗봇_만들기

ConclusionFuture work

진정한 의미의 End-to-End Model은 아직은 미숙한 단계. 특히 상업용 봇의 경우 '실수하지 않는 것'이 더욱 중요하기 때문에 전통적인 룰 기반, 머신러닝 방식과 딥러닝의 방식 등을 적절히 함께 사용하는 것이 현재로선 최선.

개인적으로 앞으로는

Reinforcement Learning(Reward를 어떻게? 즉,좋은 대화를 어떻게 측정할 것인지)WithExternal Memory(Memory Network 류)(메모리가 커진다면 어떻게?)의연구를 눈 여겨 봐야 하지 않을까

생각이 듭니다.

Page 48: 20170227 파이썬으로 챗봇_만들기

Reference모두를 위한 머신러닝/딥러닝[홍콩과기대 김성훈 교수님]http://hunkim.github.io/ml/

CS-224d : Deep learning for NLP[Richard socher]http://cs224d.stanford.edu/syllabus.html

Chatbot Fundamentals An interactive guide to writing bots in Pythonhttps://apps.worldwritable.com/tutorials/chatbot/

Building AI Chat bot using Python 3 & TensorFlow[신정규 님]https://speakerdeck.com/inureyes/building-ai-chat-bot-using-python-3-and-tensorflow

Developing Korean Chatbot 101 [조재민 님]https://www.slideshare.net/JaeminCho6/developing-korean-chatbot-101-71013451

Deeplearning for Chatbot [Denny Britz]http://www.wildml.com/2016/04/deep-learning-for-chatbots-part-1-introduction/

자연어처리를 위한 기계학습 [강원대 이창기 교수님]https://www.slideshare.net/deview/f2-14341235

* 다른 레퍼런스들도 그때그때 링크를 걸어두었습니다!

Page 49: 20170227 파이썬으로 챗봇_만들기

Thank you for listening

https://github.com/DSKSD