SlideShare a Scribd company logo
1 of 49
Download to read offline
파이썬으로 챗봇 만들기
(With Natural Language Interface)
2017.02.27
발표자 : 김성동
이름 : 김성동(@DSKSD)
연락처 : tjdehd1222@gmail.com
숭실대 경영/글로벌미디어 (졸업ㅜㅜ)
현재는 스타트업에서 챗봇을 개발중입니다:)
Hello !!
목차
1.Introduction
2.Main Components of Chatbot
3.Deep Learning for Chatbot
4.Conclusion
Introduction
“Facebook's future is in Chatbot”
2016.4, Mark Zuckerberg
Inspiration – 거창한 이유
Lock-In effect(고객 고착화)
Automation(비용 절감)
…
Introduction
Inspiration – 개인적인 이유
데이터 수집이 비교적 쉽다.(웹에는 텍스트 천지다.)
필요하다면 데이터를 만들어 낼 수도 있다. (Dialogue Design 일명 노가다)
아주 다양하고 범용한 응용 도메인 (언어는 어디서나 사용하니깐..!)
아직 미개척지가 많은 Challenging한 분야!! (잘하면 Pioneer가 될 지도..?)
언어(대화)에 문화적 특성이 녹아 있어서 구글에게 정복당할 확률이 그나마 낮은 분야
(자국어의 경우...)
Introduction
What is Chatbot?
챗봇 = 인공지능?
챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)
Introduction
What is Chatbot?
챗봇 = 인공지능?
챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)
User InterfaceUser Interface
Input Output
Answer Maker
Process
* 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음
Introduction
What is Chatbot?
챗봇 = 인공지능?
챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)
User InterfaceUser Interface
Input Output
Answer Maker
Process
상대방(유저)으로부터 입력을 받아들이는 부분
간단한 명령어/키워드(#시작)
버튼(후보 답변 중 선택)
자연어(Natural Language Understanding)
* 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음
풍부
단편
Introduction
What is Chatbot?
챗봇 = 인공지능?
챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)
User InterfaceUser Interface
Input Output
Answer Maker
Process
목적
Closed Domain(Goal based)
Open Domain(General Bot)
적절한 답변을 만들어내는 부분
Rule based
Retrieval
Inference
* 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음
풍부
단편
Introduction
What is Chatbot?
챗봇 = 인공지능?
챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)
User InterfaceUser Interface
Input Output
Answer Maker
Process
답변을 유저가 보기에 적절한 형태로 가공하여 전달
답변 검색(Database Retrieval) #심심이
템플릿(Entity/Information 끼워넣기)
자연어(Natural Language Generation)
* 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음
풍부
단편
Introduction
그래서 오늘 집중해서 소개하고 싶은 챗봇은 바로!! 요것
Natural Language
Interface
자연어로 입력을 받아서
Inference based
Answer Maker
(Closed domain)
가장 적절한 답변을 추론한다
Main Components of Chatbot
목적을 상기해보자
자연어로 입력 받아서 가장 적절한 답변을 추론한다.
상대방의 발화 의도 파악(Intent)
대화의 맥락도 고려(Context)
상대방의 발언 중 개체를 파악(Entity)
(답변을 추론(Inference))
이건 다음 챕터에서 ...!
* 이 Components도 명확히 구분 되는 것이 아님..!!
Main Components of Chatbot
Intent
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()
Main Components of Chatbot
Intent
가장 간단한 방법 : 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의 일종)
Main Components of Chatbot
Intent
좀더 나은 방법 : Intent Classifier
1. Raw text를 전처리하고 벡터화 (konlpy, genism)
2. Intent Classifier 트레이닝 (sklearn)
3. Classifier로부터 의도 파악
Raw text
Preprocessing
Vectorize Classifier
1
2
3
4
5
Main Components of Chatbot
Intent - Preprocessing
좀더 나은 방법 : Intent Classifier
from konlpy.tag import Twitter
tagger = 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
Main Components of Chatbot
Intent - Vectorize
좀더 나은 방법 : Intent Classifier
import gensim
def Vectorize(sentences):
Text를 모델에 Input으로 주기 위해 벡터로 표현한다. 여러 가지 방법 有
1> One-hot Vector
2> Bag-of-words
3> TFIDF
4> Word2Vec(Glove)
5> Paragraph2Vec (Doc2Vec) (link)
6> RNN Encoder
7> CNN for text (link)
8> FastText (link)
…
출처 : 한국어와 NLTK, Gensim의 만남, 박은정, 2015 Pycon
Main Components of Chatbot
Intent - Vectorize
좀더 나은 방법 : Intent Classifier
from gensim.models import doc2vec
# 트레이닝 과정 생략
doc_vectorizer = doc2vec.Doc2Vec.load('doc2vec.model') # trained model
def Vectorize(processed_sent):
return doc_vectorizer.infer_vector(processed_sent)
U: 오늘 날씨 어때?
Classifier
(Logistic Reg,
SVM,
Random Forest,
NN)
2 (AskWeather)
Main Components of Chatbot
Intent - 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)
Main Components of Chatbot
Entity
드디어 유저의 발화 의도를 알아냈다..!! 이제 답변을 하면 되는데..
U: 오늘 날씨 어때?
B: 어디요?
성공적인 응답을 하기 위해서는 '오늘'이라는 '날짜'에 관한 정보를 이해하고 오늘 특정 위치
(도시)의 날씨를 알려주어야 성공적인 응답이 될 것이다. 따라서 봇은 유저가 '위치'에 관한 정
보를 알려주지 않았다는 것을 캐치하고 위와 같이 되물어야 한다. (아직 문맥(Context) 고려 x)
2 (AskWeather)
Main Components of Chatbot
Entity
문장에서 개체(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)란?
Main Components of Chatbot
Entity
여기서도 가장 간단한 방법은 NER 사전으로 단어들을 검사하는 것.
하지만 NER 사전에 포함되어 있지 않은 단어들을 캐치해내지 못하고 신조어에도
약하다……! 역시나 시간과 비용의 이슈가 있다. 결국 사전 관리를 사람이 해야
하기 때문이다.
=> 이번에도 머신러닝을 이용해서 알아내잣!
# 수도 코드
Load NER_dict
for token in sent:
if token in NER_dict:
Check
Main Components of Chatbot
Entity
직접 데이터를 모아서 모델을 만들자!!!
아쉽게도 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 문일철 교수님]
Main Components of Chatbot
Entity
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
Main Components of Chatbot
Entity
Conditional Random Field for NER
http://homepages.inf.ed.ac.uk/csutton/publications/crftut-fnt.pdf
Main Components of Chatbot
Entity
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를 이용한 한국어 자동 띄어쓰기(설진석님 블로그)
Main Components of Chatbot
Entity
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 + CRF
https://github.com/rockingdingo/deepnlp
Main Components of Chatbot
Entity
유저의 발화의도와 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)
Main Components of Chatbot
Context
API Call을 통해 답변을 내놓고 나면 Context를 파악하지 못하고
다시 무로 돌아간다...!! (즉, 봇 자신이 방금 전까지 무슨 대화를 했었는지 알지 못함)
U: 오늘/Date 날씨 어때?
B: 어디요?
AskWeather(LOC, DATE=today)
U: 어디긴, 서울/Location이지 AskWeather(LOC=Seoul, DATE=today)
B: 오늘 서울 날씨는 맑음입니다.
U: 내일/Date은?
B: 네..?
Other()
Main Components of Chatbot
Context
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
Main Components of Chatbot
Context
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
Main Components of Chatbot
Context
가장 간단한 방법은 이전 대화 로그를 저장해두고 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
Deep Learning for Chatbot
이렇게 아주 간단한 Goal bot을 만드는 것만해도 상당한 노력이 들어간다...
또한 다양한 한계도 존재한다.
그러다 보니 봇 연구자들은 자연스럽게 End-to-End 방식을 갈구하게 된다!!
(질문과 답만 줄 테니 알아서 좀 해봐..)
실제로도 학계, 산업계에서 많은 실험이 진행되고 있다. (아직 그리 잘되진 않는 모양)
그 중에서는 답변을 Directly Inference하는 Deep Learning model, 혹은 앞서 소개한 여러 컴
포넌트와 Deep Learning을 혼재해서 사용하는 model 등 그 모양새도 다양..
이러한 Deep learning model들 중 대부분은 Machine Translation의 Seq2Seq 모델에 영감
받아 다양한 변형과 응용을 하고 있다.
Deep Learning for Chatbot
Sequence2Sequence 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!
Deep Learning for Chatbot
Sequence2Sequence model
시퀀스 모델의 한계점 :
1> 문법적 오류 존재
2> 여전히 대화의 맥락을 이해하지 못한다.(Context)
3> 다양성의 부재(확률적으로 '몰라요', '그렇군요' 등과 같은 일반적인 답변이 나올 가능성이 높다)
코드 : Goblin(김진중)님 Tensorflow tutorial 04. Chatbot 참고
Deep Learning for Chatbot
Hierarchical 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
Deep Learning for Chatbot
Hierarchical Recurrent Encoder Decoder
꽤나 그럴싸 하지만, 실은 I don't know나 I'm sorry와 같은 일반적인 답변을 많이 한다.
즉, 다양성이 부족..
1> data scarcity
2> token의 대부분이 대명사
3> triple 자체가 너무 짧다. {𝑈1, 𝑈2, 𝑈3}
https://arxiv.org/abs/1507.04808
Deep Learning for Chatbot
Attention
https://arxiv.org/abs/1507.04808
Seq2seq 모델의 큰 한계점 중 하나는 전체 정보가 고정된 길이의 vector(context)로 인코딩 돼야 한다는 것이다.
그렇기에 인풋 문장의 길이가 길어질 수록, 많은 정보들이 손실된다.
때문에 긴 문장을 잘 디코딩 못한다.
Attention 메커니즘은 디코더가 디코딩을 하는 동안 인풋 시퀀스 중 어디에 집중할지를 결정하여
디코딩에 반영하는 방법
Deep Learning for Chatbot
Dialogue 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
Deep Learning for Chatbot
Dialogue System as Reinforcement Learning
하지만 앞선 모델에 영감 받아 다양한 시도들이 있다. State와 Action은 딥러닝 모델을 이용하여
Directly Inference하되 이러한 모델의 주요 포인트는 Reward를 어떻게 주느냐..! (어떤 대답이 좋은
대답인지를 수치화 시켜야 하는 문제)
https://arxiv.org/abs/1601.04574
Deep Learning for Chatbot
Hybrid Model
기존의 머신러닝 방식과 딥러닝(RL) 방식의 장점을 융합하고 단점을 상호보완 하려 하는 시도들도 존재
https://arxiv.org/abs/1606.01269
https://arxiv.org/abs/1604.04562
Deep Learning for Chatbot
Memory Network
기존 RNN 기반 모델(LSTM Cell 포함)들은 아주 아주 긴 long term memory를 읽고 쓰는 능력이 부족
하다. 특히 특정 사실을 정확히 기억하고 있는 것을 못한다. (Memorization)
이러한 한계를 극복하기 위해 Memory Network는 외부 메모리에 정보를 적절하게 쓰고 읽는 법을
학습하여 답변 추론에 이용하는 모델이다.
https://arxiv.org/abs/1503.08895코드 : 김태훈님 MemN2N Tensorflow Implementation 참고
Deep Learning for Chatbot
Learning through Dialogue Interaction
Memory Network는 메모리에 적당한 정보가 없는 경우 답변을 제대로 하지 못한다. (상대방의 오타,
처음 보는 단어 등...) 이런 경우 상대방에게 질문을 던져 힌트를 얻는 방식으로 상호작용하며 대화를
이어나갈 수 있다. 이때 언제 질문을 던져야 할지 강화학습으로 학습한다.
https://arxiv.org/abs/1612.04936
Conclusion
정리
제목은 거창하게 지어놓고 막상 코드는 거의 날림으로... 큭..(죄송합니다.)
어찌됐건 오늘의 목적은 챗봇이란 무엇이며, 무엇이 중요한 Issue인지 전달하는 것.(전달이 되었나요..?)
사실은 이러한 봇을 편하게 만들도록 지원하는 여러 Bot Framework가 존재한다.
다만,
1> 돈이 든다.
2> 한국어? 잘 안된다.(사실 안 써봐서 몰라요..)
3> 스스로 개선시키기 어렵다
Conclusion
스스로 개선시키자 - 파이썬
파이썬은 자연어 처리를 하기에 매우 좋은 언어!!
문장을 토큰화하여 리스트에 담는 것으로부터 시작
start> NLP with Python [link]
또한 다양한 패키지를 지원한다.
nltk
spaCy
numpy
konlpy
gensim
python-crfsuite
특히, 쏟아져 나오고 있는 딥러닝 기반의 챗봇들도 구현해볼 수 있다.(과연?) (feat. Tensorflow)
https://github.com/datanada/Awesome-Korean-NLP
Conclusion
What is good conversation?
답변을 Inference(추론)하는 챗봇들을 쭉 살펴본 결과 어떤 대화가 좋은 대화인지에 대한 측정 기준이
미비하다. Ex> Perplexity, (Entity) F1-Score, BLEU, Task-complete, DSTC 등의 간접지표 사용
https://research.fb.com/downloads/babi/http://camdial.org/~mh521/dstc/
Conclusion
Future work
진정한 의미의 End-to-End Model은 아직은 미숙한 단계. 특히 상업용 봇의 경우 '실수하지 않는 것'
이 더욱 중요하기 때문에 전통적인 룰 기반, 머신러닝 방식과 딥러닝의 방식 등을 적절히 함께 사용
하는 것이 현재로선 최선.
개인적으로 앞으로는
Reinforcement Learning(Reward를 어떻게? 즉,
좋은 대화를 어떻게 측정할 것인지)
With
External Memory(Memory Network 류)
(메모리가 커진다면 어떻게?)의
연구를 눈 여겨 봐야 하지 않을까
생각이 듭니다.
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 Python
https://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
* 다른 레퍼런스들도 그때그때 링크를 걸어두었습니다!
Thank you for listening
https://github.com/DSKSD

More Related Content

What's hot

Dependency Parser, 의존 구조 분석기
Dependency Parser, 의존 구조 분석기Dependency Parser, 의존 구조 분석기
Dependency Parser, 의존 구조 분석기찬희 이
 
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기CONNECT FOUNDATION
 
NLTK - Natural Language Processing in Python
NLTK - Natural Language Processing in PythonNLTK - Natural Language Processing in Python
NLTK - Natural Language Processing in Pythonshanbady
 
DeBERTA : Decoding-Enhanced BERT with Disentangled Attention
DeBERTA : Decoding-Enhanced BERT with Disentangled AttentionDeBERTA : Decoding-Enhanced BERT with Disentangled Attention
DeBERTA : Decoding-Enhanced BERT with Disentangled Attentiontaeseon ryu
 
Solr - Indexação e Busca com ferramenta Open Source
Solr - Indexação e Busca com ferramenta Open SourceSolr - Indexação e Busca com ferramenta Open Source
Solr - Indexação e Busca com ferramenta Open SourceMarcelo Rodrigues
 
Natural Language processing
Natural Language processingNatural Language processing
Natural Language processingSanzid Kawsar
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)Seung-June Lee
 
Sk t academy lecture note
Sk t academy lecture noteSk t academy lecture note
Sk t academy lecture noteSusang Kim
 
[224] 번역 모델 기반_질의_교정_시스템
[224] 번역 모델 기반_질의_교정_시스템[224] 번역 모델 기반_질의_교정_시스템
[224] 번역 모델 기반_질의_교정_시스템NAVER D2
 
텍스트 마이닝 기본 정리(말뭉치, 텍스트 전처리 절차, TF, IDF 기타)
텍스트 마이닝 기본 정리(말뭉치, 텍스트 전처리 절차, TF, IDF 기타)텍스트 마이닝 기본 정리(말뭉치, 텍스트 전처리 절차, TF, IDF 기타)
텍스트 마이닝 기본 정리(말뭉치, 텍스트 전처리 절차, TF, IDF 기타)limdongjo 임동조
 
딥러닝 기반의 자연어처리 최근 연구 동향
딥러닝 기반의 자연어처리 최근 연구 동향딥러닝 기반의 자연어처리 최근 연구 동향
딥러닝 기반의 자연어처리 최근 연구 동향LGCNSairesearch
 
KorQuAD introduction
KorQuAD introductionKorQuAD introduction
KorQuAD introductionSeungyoungLim
 
A Simple Introduction to Word Embeddings
A Simple Introduction to Word EmbeddingsA Simple Introduction to Word Embeddings
A Simple Introduction to Word EmbeddingsBhaskar Mitra
 
자연어처리 소개
자연어처리 소개자연어처리 소개
자연어처리 소개Jin wook
 
Phrase Tagger, 구문 태거
Phrase Tagger, 구문 태거Phrase Tagger, 구문 태거
Phrase Tagger, 구문 태거찬희 이
 
기계독해를 위한 BERT 언어처리 모델 활용
기계독해를 위한 BERT 언어처리 모델 활용기계독해를 위한 BERT 언어처리 모델 활용
기계독해를 위한 BERT 언어처리 모델 활용Kenneth Jung
 
Natural Language Processing
Natural Language ProcessingNatural Language Processing
Natural Language ProcessingVeenaSKumar2
 
SSDC2022 - AI for Everyone 딥러닝 논문읽고 성장하는 모임이야기
SSDC2022 - AI for Everyone 딥러닝 논문읽고 성장하는 모임이야기SSDC2022 - AI for Everyone 딥러닝 논문읽고 성장하는 모임이야기
SSDC2022 - AI for Everyone 딥러닝 논문읽고 성장하는 모임이야기taeseon ryu
 
REST API 설계
REST API 설계REST API 설계
REST API 설계Terry Cho
 

What's hot (20)

Dependency Parser, 의존 구조 분석기
Dependency Parser, 의존 구조 분석기Dependency Parser, 의존 구조 분석기
Dependency Parser, 의존 구조 분석기
 
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
 
BERT introduction
BERT introductionBERT introduction
BERT introduction
 
NLTK - Natural Language Processing in Python
NLTK - Natural Language Processing in PythonNLTK - Natural Language Processing in Python
NLTK - Natural Language Processing in Python
 
DeBERTA : Decoding-Enhanced BERT with Disentangled Attention
DeBERTA : Decoding-Enhanced BERT with Disentangled AttentionDeBERTA : Decoding-Enhanced BERT with Disentangled Attention
DeBERTA : Decoding-Enhanced BERT with Disentangled Attention
 
Solr - Indexação e Busca com ferramenta Open Source
Solr - Indexação e Busca com ferramenta Open SourceSolr - Indexação e Busca com ferramenta Open Source
Solr - Indexação e Busca com ferramenta Open Source
 
Natural Language processing
Natural Language processingNatural Language processing
Natural Language processing
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)
 
Sk t academy lecture note
Sk t academy lecture noteSk t academy lecture note
Sk t academy lecture note
 
[224] 번역 모델 기반_질의_교정_시스템
[224] 번역 모델 기반_질의_교정_시스템[224] 번역 모델 기반_질의_교정_시스템
[224] 번역 모델 기반_질의_교정_시스템
 
텍스트 마이닝 기본 정리(말뭉치, 텍스트 전처리 절차, TF, IDF 기타)
텍스트 마이닝 기본 정리(말뭉치, 텍스트 전처리 절차, TF, IDF 기타)텍스트 마이닝 기본 정리(말뭉치, 텍스트 전처리 절차, TF, IDF 기타)
텍스트 마이닝 기본 정리(말뭉치, 텍스트 전처리 절차, TF, IDF 기타)
 
딥러닝 기반의 자연어처리 최근 연구 동향
딥러닝 기반의 자연어처리 최근 연구 동향딥러닝 기반의 자연어처리 최근 연구 동향
딥러닝 기반의 자연어처리 최근 연구 동향
 
KorQuAD introduction
KorQuAD introductionKorQuAD introduction
KorQuAD introduction
 
A Simple Introduction to Word Embeddings
A Simple Introduction to Word EmbeddingsA Simple Introduction to Word Embeddings
A Simple Introduction to Word Embeddings
 
자연어처리 소개
자연어처리 소개자연어처리 소개
자연어처리 소개
 
Phrase Tagger, 구문 태거
Phrase Tagger, 구문 태거Phrase Tagger, 구문 태거
Phrase Tagger, 구문 태거
 
기계독해를 위한 BERT 언어처리 모델 활용
기계독해를 위한 BERT 언어처리 모델 활용기계독해를 위한 BERT 언어처리 모델 활용
기계독해를 위한 BERT 언어처리 모델 활용
 
Natural Language Processing
Natural Language ProcessingNatural Language Processing
Natural Language Processing
 
SSDC2022 - AI for Everyone 딥러닝 논문읽고 성장하는 모임이야기
SSDC2022 - AI for Everyone 딥러닝 논문읽고 성장하는 모임이야기SSDC2022 - AI for Everyone 딥러닝 논문읽고 성장하는 모임이야기
SSDC2022 - AI for Everyone 딥러닝 논문읽고 성장하는 모임이야기
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 

Viewers also liked

챗봇 시작해보기
챗봇 시작해보기챗봇 시작해보기
챗봇 시작해보기성일 한
 
Developing Korean Chatbot 101
Developing Korean Chatbot 101Developing Korean Chatbot 101
Developing Korean Chatbot 101Jaemin Cho
 
챗봇 개발을 위한 네이버 랩스 api
챗봇 개발을 위한 네이버 랩스 api챗봇 개발을 위한 네이버 랩스 api
챗봇 개발을 위한 네이버 랩스 apiNAVER D2
 
사업계획서 알음알음 포스코기술투자
사업계획서 알음알음 포스코기술투자사업계획서 알음알음 포스코기술투자
사업계획서 알음알음 포스코기술투자Sangmo Kang
 
한양대학교 스마트창작터 사업계획서_중고거래 구매대행 서비스 Buying_오세훈
한양대학교 스마트창작터 사업계획서_중고거래 구매대행 서비스 Buying_오세훈한양대학교 스마트창작터 사업계획서_중고거래 구매대행 서비스 Buying_오세훈
한양대학교 스마트창작터 사업계획서_중고거래 구매대행 서비스 Buying_오세훈세훈 오
 
[트래블챗] Ai기반 챗봇 커머스 플랫폼 사업계획서 20170213_f
[트래블챗] Ai기반 챗봇 커머스 플랫폼 사업계획서 20170213_f[트래블챗] Ai기반 챗봇 커머스 플랫폼 사업계획서 20170213_f
[트래블챗] Ai기반 챗봇 커머스 플랫폼 사업계획서 20170213_fLee Hansub
 

Viewers also liked (6)

챗봇 시작해보기
챗봇 시작해보기챗봇 시작해보기
챗봇 시작해보기
 
Developing Korean Chatbot 101
Developing Korean Chatbot 101Developing Korean Chatbot 101
Developing Korean Chatbot 101
 
챗봇 개발을 위한 네이버 랩스 api
챗봇 개발을 위한 네이버 랩스 api챗봇 개발을 위한 네이버 랩스 api
챗봇 개발을 위한 네이버 랩스 api
 
사업계획서 알음알음 포스코기술투자
사업계획서 알음알음 포스코기술투자사업계획서 알음알음 포스코기술투자
사업계획서 알음알음 포스코기술투자
 
한양대학교 스마트창작터 사업계획서_중고거래 구매대행 서비스 Buying_오세훈
한양대학교 스마트창작터 사업계획서_중고거래 구매대행 서비스 Buying_오세훈한양대학교 스마트창작터 사업계획서_중고거래 구매대행 서비스 Buying_오세훈
한양대학교 스마트창작터 사업계획서_중고거래 구매대행 서비스 Buying_오세훈
 
[트래블챗] Ai기반 챗봇 커머스 플랫폼 사업계획서 20170213_f
[트래블챗] Ai기반 챗봇 커머스 플랫폼 사업계획서 20170213_f[트래블챗] Ai기반 챗봇 커머스 플랫폼 사업계획서 20170213_f
[트래블챗] Ai기반 챗봇 커머스 플랫폼 사업계획서 20170213_f
 

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

Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안
Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안
Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안Clova Platform
 
chatbot-seminar-1806
chatbot-seminar-1806chatbot-seminar-1806
chatbot-seminar-1806juneyoungdev
 
Open domain dialogue Chatbot(잡담봇 삽질기)
Open domain dialogue Chatbot(잡담봇 삽질기)Open domain dialogue Chatbot(잡담봇 삽질기)
Open domain dialogue Chatbot(잡담봇 삽질기)NAVER Engineering
 
비영리 섹터를 위한 챗봇 발표
비영리 섹터를 위한 챗봇 발표비영리 섹터를 위한 챗봇 발표
비영리 섹터를 위한 챗봇 발표Hong Min Kim
 
카카오 봇 플랫폼 소개
카카오 봇 플랫폼 소개카카오 봇 플랫폼 소개
카카오 봇 플랫폼 소개if kakao
 
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:SeoulJunseong Kim
 
반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게Sungju Jin
 
댓글 감성 분석 상용화 개발기(Ver. 2)
댓글 감성 분석 상용화 개발기(Ver. 2)댓글 감성 분석 상용화 개발기(Ver. 2)
댓글 감성 분석 상용화 개발기(Ver. 2)Jeffrey Kim
 
131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원NAVER D2
 
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기Daehee Kim
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기Changwan Jun
 
Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기성일 한
 
왓슨 컨버세이션으로 챗봇 만들기 ! WCS 활용법
왓슨 컨버세이션으로 챗봇 만들기 ! WCS 활용법왓슨 컨버세이션으로 챗봇 만들기 ! WCS 활용법
왓슨 컨버세이션으로 챗봇 만들기 ! WCS 활용법HyeonJeong Jo
 
Ibm bluemix cloud 에서 chatbot 만들기
Ibm bluemix cloud 에서 chatbot 만들기Ibm bluemix cloud 에서 chatbot 만들기
Ibm bluemix cloud 에서 chatbot 만들기Shaun LEE
 

Similar to 20170227 파이썬으로 챗봇_만들기 (20)

Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안
Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안
Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안
 
챗봇 스터디
챗봇 스터디챗봇 스터디
챗봇 스터디
 
chatbot-seminar-1806
chatbot-seminar-1806chatbot-seminar-1806
chatbot-seminar-1806
 
Open domain dialogue Chatbot(잡담봇 삽질기)
Open domain dialogue Chatbot(잡담봇 삽질기)Open domain dialogue Chatbot(잡담봇 삽질기)
Open domain dialogue Chatbot(잡담봇 삽질기)
 
비영리 섹터를 위한 챗봇 발표
비영리 섹터를 위한 챗봇 발표비영리 섹터를 위한 챗봇 발표
비영리 섹터를 위한 챗봇 발표
 
카카오 봇 플랫폼 소개
카카오 봇 플랫폼 소개카카오 봇 플랫폼 소개
카카오 봇 플랫폼 소개
 
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
 
반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게
 
댓글 감성 분석 상용화 개발기(Ver. 2)
댓글 감성 분석 상용화 개발기(Ver. 2)댓글 감성 분석 상용화 개발기(Ver. 2)
댓글 감성 분석 상용화 개발기(Ver. 2)
 
131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원
 
파이썬을 활용한 자연어 분석
파이썬을 활용한 자연어 분석파이썬을 활용한 자연어 분석
파이썬을 활용한 자연어 분석
 
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
 
서울 R&D 캠퍼스 자연어 수업자료
서울 R&D 캠퍼스 자연어 수업자료서울 R&D 캠퍼스 자연어 수업자료
서울 R&D 캠퍼스 자연어 수업자료
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기
 
메이크챗봇 자연어기초
메이크챗봇 자연어기초메이크챗봇 자연어기초
메이크챗봇 자연어기초
 
Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기
 
파이썬을 활용한 자연어분석 기초
파이썬을 활용한 자연어분석 기초파이썬을 활용한 자연어분석 기초
파이썬을 활용한 자연어분석 기초
 
왓슨 컨버세이션으로 챗봇 만들기 ! WCS 활용법
왓슨 컨버세이션으로 챗봇 만들기 ! WCS 활용법왓슨 컨버세이션으로 챗봇 만들기 ! WCS 활용법
왓슨 컨버세이션으로 챗봇 만들기 ! WCS 활용법
 
Ibm bluemix cloud 에서 chatbot 만들기
Ibm bluemix cloud 에서 chatbot 만들기Ibm bluemix cloud 에서 chatbot 만들기
Ibm bluemix cloud 에서 chatbot 만들기
 

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

  • 1. 파이썬으로 챗봇 만들기 (With Natural Language Interface) 2017.02.27 발표자 : 김성동
  • 2. 이름 : 김성동(@DSKSD) 연락처 : tjdehd1222@gmail.com 숭실대 경영/글로벌미디어 (졸업ㅜㅜ) 현재는 스타트업에서 챗봇을 개발중입니다:) Hello !!
  • 3. 목차 1.Introduction 2.Main Components of Chatbot 3.Deep Learning for Chatbot 4.Conclusion
  • 4. Introduction “Facebook's future is in Chatbot” 2016.4, Mark Zuckerberg Inspiration – 거창한 이유 Lock-In effect(고객 고착화) Automation(비용 절감) …
  • 5. Introduction Inspiration – 개인적인 이유 데이터 수집이 비교적 쉽다.(웹에는 텍스트 천지다.) 필요하다면 데이터를 만들어 낼 수도 있다. (Dialogue Design 일명 노가다) 아주 다양하고 범용한 응용 도메인 (언어는 어디서나 사용하니깐..!) 아직 미개척지가 많은 Challenging한 분야!! (잘하면 Pioneer가 될 지도..?) 언어(대화)에 문화적 특성이 녹아 있어서 구글에게 정복당할 확률이 그나마 낮은 분야 (자국어의 경우...)
  • 6. Introduction What is Chatbot? 챗봇 = 인공지능? 챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…)
  • 7. Introduction What is Chatbot? 챗봇 = 인공지능? 챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…) User InterfaceUser Interface Input Output Answer Maker Process * 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음
  • 8. Introduction What is Chatbot? 챗봇 = 인공지능? 챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…) User InterfaceUser Interface Input Output Answer Maker Process 상대방(유저)으로부터 입력을 받아들이는 부분 간단한 명령어/키워드(#시작) 버튼(후보 답변 중 선택) 자연어(Natural Language Understanding) * 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음 풍부 단편
  • 9. Introduction What is Chatbot? 챗봇 = 인공지능? 챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…) User InterfaceUser Interface Input Output Answer Maker Process 목적 Closed Domain(Goal based) Open Domain(General Bot) 적절한 답변을 만들어내는 부분 Rule based Retrieval Inference * 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음 풍부 단편
  • 10. Introduction What is Chatbot? 챗봇 = 인공지능? 챗봇 = 사용자와 대화(Chat)를 나눌 수 있는 컴퓨터 프로그램(그 안이 어떻게 구성되었건…) User InterfaceUser Interface Input Output Answer Maker Process 답변을 유저가 보기에 적절한 형태로 가공하여 전달 답변 검색(Database Retrieval) #심심이 템플릿(Entity/Information 끼워넣기) 자연어(Natural Language Generation) * 아래 3가지 모듈은 예시이며 모든 케이스를 포함하지 않음 풍부 단편
  • 11. Introduction 그래서 오늘 집중해서 소개하고 싶은 챗봇은 바로!! 요것 Natural Language Interface 자연어로 입력을 받아서 Inference based Answer Maker (Closed domain) 가장 적절한 답변을 추론한다
  • 12. Main Components of Chatbot 목적을 상기해보자 자연어로 입력 받아서 가장 적절한 답변을 추론한다. 상대방의 발화 의도 파악(Intent) 대화의 맥락도 고려(Context) 상대방의 발언 중 개체를 파악(Entity) (답변을 추론(Inference)) 이건 다음 챕터에서 ...! * 이 Components도 명확히 구분 되는 것이 아님..!!
  • 13. Main Components of Chatbot Intent 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()
  • 14. Main Components of Chatbot Intent 가장 간단한 방법 : 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의 일종)
  • 15. Main Components of Chatbot Intent 좀더 나은 방법 : Intent Classifier 1. Raw text를 전처리하고 벡터화 (konlpy, genism) 2. Intent Classifier 트레이닝 (sklearn) 3. Classifier로부터 의도 파악 Raw text Preprocessing Vectorize Classifier 1 2 3 4 5
  • 16. Main Components of Chatbot Intent - Preprocessing 좀더 나은 방법 : Intent Classifier from konlpy.tag import Twitter tagger = 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
  • 17. Main Components of Chatbot Intent - Vectorize 좀더 나은 방법 : Intent Classifier import gensim def Vectorize(sentences): Text를 모델에 Input으로 주기 위해 벡터로 표현한다. 여러 가지 방법 有 1> One-hot Vector 2> Bag-of-words 3> TFIDF 4> Word2Vec(Glove) 5> Paragraph2Vec (Doc2Vec) (link) 6> RNN Encoder 7> CNN for text (link) 8> FastText (link) … 출처 : 한국어와 NLTK, Gensim의 만남, 박은정, 2015 Pycon
  • 18. Main Components of Chatbot Intent - Vectorize 좀더 나은 방법 : Intent Classifier from gensim.models import doc2vec # 트레이닝 과정 생략 doc_vectorizer = doc2vec.Doc2Vec.load('doc2vec.model') # trained model def Vectorize(processed_sent): return doc_vectorizer.infer_vector(processed_sent) U: 오늘 날씨 어때? Classifier (Logistic Reg, SVM, Random Forest, NN) 2 (AskWeather)
  • 19. Main Components of Chatbot Intent - 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)
  • 20. Main Components of Chatbot Entity 드디어 유저의 발화 의도를 알아냈다..!! 이제 답변을 하면 되는데.. U: 오늘 날씨 어때? B: 어디요? 성공적인 응답을 하기 위해서는 '오늘'이라는 '날짜'에 관한 정보를 이해하고 오늘 특정 위치 (도시)의 날씨를 알려주어야 성공적인 응답이 될 것이다. 따라서 봇은 유저가 '위치'에 관한 정 보를 알려주지 않았다는 것을 캐치하고 위와 같이 되물어야 한다. (아직 문맥(Context) 고려 x) 2 (AskWeather)
  • 21. Main Components of Chatbot Entity 문장에서 개체(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)란?
  • 22. Main Components of Chatbot Entity 여기서도 가장 간단한 방법은 NER 사전으로 단어들을 검사하는 것. 하지만 NER 사전에 포함되어 있지 않은 단어들을 캐치해내지 못하고 신조어에도 약하다……! 역시나 시간과 비용의 이슈가 있다. 결국 사전 관리를 사람이 해야 하기 때문이다. => 이번에도 머신러닝을 이용해서 알아내잣! # 수도 코드 Load NER_dict for token in sent: if token in NER_dict: Check
  • 23. Main Components of Chatbot Entity 직접 데이터를 모아서 모델을 만들자!!! 아쉽게도 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 문일철 교수님]
  • 24. Main Components of Chatbot Entity 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
  • 25. Main Components of Chatbot Entity Conditional Random Field for NER http://homepages.inf.ed.ac.uk/csutton/publications/crftut-fnt.pdf
  • 26. Main Components of Chatbot Entity 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를 이용한 한국어 자동 띄어쓰기(설진석님 블로그)
  • 27. Main Components of Chatbot Entity 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 + CRF https://github.com/rockingdingo/deepnlp
  • 28. Main Components of Chatbot Entity 유저의 발화의도와 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)
  • 29. Main Components of Chatbot Context API Call을 통해 답변을 내놓고 나면 Context를 파악하지 못하고 다시 무로 돌아간다...!! (즉, 봇 자신이 방금 전까지 무슨 대화를 했었는지 알지 못함) U: 오늘/Date 날씨 어때? B: 어디요? AskWeather(LOC, DATE=today) U: 어디긴, 서울/Location이지 AskWeather(LOC=Seoul, DATE=today) B: 오늘 서울 날씨는 맑음입니다. U: 내일/Date은? B: 네..? Other()
  • 30. Main Components of Chatbot Context 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
  • 31. Main Components of Chatbot Context 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
  • 32. Main Components of Chatbot Context 가장 간단한 방법은 이전 대화 로그를 저장해두고 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
  • 33. Deep Learning for Chatbot 이렇게 아주 간단한 Goal bot을 만드는 것만해도 상당한 노력이 들어간다... 또한 다양한 한계도 존재한다. 그러다 보니 봇 연구자들은 자연스럽게 End-to-End 방식을 갈구하게 된다!! (질문과 답만 줄 테니 알아서 좀 해봐..) 실제로도 학계, 산업계에서 많은 실험이 진행되고 있다. (아직 그리 잘되진 않는 모양) 그 중에서는 답변을 Directly Inference하는 Deep Learning model, 혹은 앞서 소개한 여러 컴 포넌트와 Deep Learning을 혼재해서 사용하는 model 등 그 모양새도 다양.. 이러한 Deep learning model들 중 대부분은 Machine Translation의 Seq2Seq 모델에 영감 받아 다양한 변형과 응용을 하고 있다.
  • 34. Deep Learning for Chatbot Sequence2Sequence 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!
  • 35. Deep Learning for Chatbot Sequence2Sequence model 시퀀스 모델의 한계점 : 1> 문법적 오류 존재 2> 여전히 대화의 맥락을 이해하지 못한다.(Context) 3> 다양성의 부재(확률적으로 '몰라요', '그렇군요' 등과 같은 일반적인 답변이 나올 가능성이 높다) 코드 : Goblin(김진중)님 Tensorflow tutorial 04. Chatbot 참고
  • 36. Deep Learning for Chatbot Hierarchical 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
  • 37. Deep Learning for Chatbot Hierarchical Recurrent Encoder Decoder 꽤나 그럴싸 하지만, 실은 I don't know나 I'm sorry와 같은 일반적인 답변을 많이 한다. 즉, 다양성이 부족.. 1> data scarcity 2> token의 대부분이 대명사 3> triple 자체가 너무 짧다. {𝑈1, 𝑈2, 𝑈3} https://arxiv.org/abs/1507.04808
  • 38. Deep Learning for Chatbot Attention https://arxiv.org/abs/1507.04808 Seq2seq 모델의 큰 한계점 중 하나는 전체 정보가 고정된 길이의 vector(context)로 인코딩 돼야 한다는 것이다. 그렇기에 인풋 문장의 길이가 길어질 수록, 많은 정보들이 손실된다. 때문에 긴 문장을 잘 디코딩 못한다. Attention 메커니즘은 디코더가 디코딩을 하는 동안 인풋 시퀀스 중 어디에 집중할지를 결정하여 디코딩에 반영하는 방법
  • 39. Deep Learning for Chatbot Dialogue 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
  • 40. Deep Learning for Chatbot Dialogue System as Reinforcement Learning 하지만 앞선 모델에 영감 받아 다양한 시도들이 있다. State와 Action은 딥러닝 모델을 이용하여 Directly Inference하되 이러한 모델의 주요 포인트는 Reward를 어떻게 주느냐..! (어떤 대답이 좋은 대답인지를 수치화 시켜야 하는 문제) https://arxiv.org/abs/1601.04574
  • 41. Deep Learning for Chatbot Hybrid Model 기존의 머신러닝 방식과 딥러닝(RL) 방식의 장점을 융합하고 단점을 상호보완 하려 하는 시도들도 존재 https://arxiv.org/abs/1606.01269 https://arxiv.org/abs/1604.04562
  • 42. Deep Learning for Chatbot Memory Network 기존 RNN 기반 모델(LSTM Cell 포함)들은 아주 아주 긴 long term memory를 읽고 쓰는 능력이 부족 하다. 특히 특정 사실을 정확히 기억하고 있는 것을 못한다. (Memorization) 이러한 한계를 극복하기 위해 Memory Network는 외부 메모리에 정보를 적절하게 쓰고 읽는 법을 학습하여 답변 추론에 이용하는 모델이다. https://arxiv.org/abs/1503.08895코드 : 김태훈님 MemN2N Tensorflow Implementation 참고
  • 43. Deep Learning for Chatbot Learning through Dialogue Interaction Memory Network는 메모리에 적당한 정보가 없는 경우 답변을 제대로 하지 못한다. (상대방의 오타, 처음 보는 단어 등...) 이런 경우 상대방에게 질문을 던져 힌트를 얻는 방식으로 상호작용하며 대화를 이어나갈 수 있다. 이때 언제 질문을 던져야 할지 강화학습으로 학습한다. https://arxiv.org/abs/1612.04936
  • 44. Conclusion 정리 제목은 거창하게 지어놓고 막상 코드는 거의 날림으로... 큭..(죄송합니다.) 어찌됐건 오늘의 목적은 챗봇이란 무엇이며, 무엇이 중요한 Issue인지 전달하는 것.(전달이 되었나요..?) 사실은 이러한 봇을 편하게 만들도록 지원하는 여러 Bot Framework가 존재한다. 다만, 1> 돈이 든다. 2> 한국어? 잘 안된다.(사실 안 써봐서 몰라요..) 3> 스스로 개선시키기 어렵다
  • 45. Conclusion 스스로 개선시키자 - 파이썬 파이썬은 자연어 처리를 하기에 매우 좋은 언어!! 문장을 토큰화하여 리스트에 담는 것으로부터 시작 start> NLP with Python [link] 또한 다양한 패키지를 지원한다. nltk spaCy numpy konlpy gensim python-crfsuite 특히, 쏟아져 나오고 있는 딥러닝 기반의 챗봇들도 구현해볼 수 있다.(과연?) (feat. Tensorflow) https://github.com/datanada/Awesome-Korean-NLP
  • 46. Conclusion What is good conversation? 답변을 Inference(추론)하는 챗봇들을 쭉 살펴본 결과 어떤 대화가 좋은 대화인지에 대한 측정 기준이 미비하다. Ex> Perplexity, (Entity) F1-Score, BLEU, Task-complete, DSTC 등의 간접지표 사용 https://research.fb.com/downloads/babi/http://camdial.org/~mh521/dstc/
  • 47. Conclusion Future work 진정한 의미의 End-to-End Model은 아직은 미숙한 단계. 특히 상업용 봇의 경우 '실수하지 않는 것' 이 더욱 중요하기 때문에 전통적인 룰 기반, 머신러닝 방식과 딥러닝의 방식 등을 적절히 함께 사용 하는 것이 현재로선 최선. 개인적으로 앞으로는 Reinforcement Learning(Reward를 어떻게? 즉, 좋은 대화를 어떻게 측정할 것인지) With External Memory(Memory Network 류) (메모리가 커진다면 어떻게?)의 연구를 눈 여겨 봐야 하지 않을까 생각이 듭니다.
  • 48. 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 Python https://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 * 다른 레퍼런스들도 그때그때 링크를 걸어두었습니다!
  • 49. Thank you for listening https://github.com/DSKSD