20 λΆ„ μ†Œμš”

챗봇에 λŒ€ν•΄μ„œβ€¦

챗봇은 μš°λ¦¬κ°€ ν”νžˆ μ•Œκ³  μžˆλ“―μ΄ 인곡지λŠ₯ κΈ°μˆ μ„ 톡해 λŒ€ν™”λ₯Ό μ£Όκ³  받읋 수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€.
챗봇에 λŒ€ν•΄ κ³΅λΆ€ν•˜λ©΄μ„œ μ•Œκ²Œλœ 것듀과 μ‚¬μš©λ˜λŠ” κΈ°μˆ λ“€μ— λŒ€ν•΄μ„œ μ μ–΄λ³ΌκΉŒ ν•œλ‹€!
β€œν•œλΉ›λ„€νŠΈμ›Œν¬-처음 λ°°μš°λŠ” λ”₯λŸ¬λ‹ 챗봇”을 톡해 κ³΅λΆ€ν•œ λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ 챕터 λ³„λ‘œ μ •λ¦¬ν–ˆμŒ

이에 κ΄€λ ¨λœ μ½”λ“œλ“€κ³Ό 챕터 별 λ‚΄μš©(.md파일)듀은 μ•„λž˜ 링크에 μžˆλ‹€.
https://github.com/hellojunho/chatbot

이 μ±…μ—μ„œλŠ” 1μž₯μ—μ„œλŠ” μ±—λ΄‡μ˜ μ†Œκ°œ 및 사둀, 2μž₯μ—μ„œλŠ” 파이썬 κΈ°λ³Έ 문법에 λŒ€ν•΄μ„œ 닀루고, 3μž₯λΆ€ν„° 본격적인 챗봇 개발 κ΄€λ ¨ λ‚΄μš©μ΄λ‹€.
이 ν¬μŠ€νŒ…μ€ 이 μ±…μ˜ 전체 λ‚΄μš©μ„ 닀룬닀.
λ‚΄κ°€ 이 책을 읽으며 μ‹€μŠ΅ν–ˆλ˜ μ½”λ“œμ™€ κ·Έ κ°œλ…λ“€μ„ 챕터 λ³„λ‘œ κΈ°λ‘ν•˜λ©° κ³΅λΆ€ν–ˆλ˜ λ‚΄μš©λ“€μ„ ν•œ λ²ˆμ— 담은 것이라 맀우 κΈΈλ‹€.
μ±… ν•œκΆŒμ˜ λΆ„λŸ‰μ΄ λ“€μ–΄κ°€ μžˆλ‹€.

뢀둝 A. 개발 ν™˜κ²½ ꡬ좕

개인적으둜 μ‹œκ°„μ΄ κ°€μž₯ 많이 걸렸던 뢀뢄이닀.
μ•„λ‚˜μ½˜λ‹€, 파이썬, κ°€μƒν™˜κ²½μ„ μ‚¬μš©ν•΄μ„œ κ΅¬μΆ•ν•œλ‹€.

A.1 파이썬 μ„€μΉ˜ν•˜κΈ°

[macOS]

brew install python@3.7

[windows]
www.python.org에 μ ‘μ†ν•΄μ„œ 파이썬 λ‹€μš΄λ‘œλ“œ ν›„ μ„€μΉ˜

A.2 μ•„λ‚˜μ½˜λ‹€ μ„€μΉ˜ν•˜κΈ°

https://www.anaconda.com/products/distribution 에 μ ‘μ†ν•΄μ„œ μš΄μ˜μ²΄μ œμ— λ§žλŠ” 버전 μ„€μΉ˜

  • μ•„λ‚˜μ½˜λ‹€ μ‹€ν–‰ 확인 [macOS]

    conda list

[windows]

conda list

A.3 CLI ν™˜κ²½μ—μ„œ μ½˜λ‹€λ‘œ 가상 ν™˜κ²½ λ§Œλ“€κΈ°

κ°€μƒν™˜κ²½μ€ λ°”κ΅¬λ‹ˆλΌκ³  생각할 수 μžˆμ„ 것 κ°™λ‹€.
ν•œ λ°”κ΅¬λ‹ˆ μ•ˆμ— νŒ¨ν‚€μ§€λ₯Ό λ‹΄μœΌλ©΄(μ„€μΉ˜ν•˜λ©΄) λ‹€λ₯Έ λ°”κ΅¬λ‹ˆμ™€λŠ” μ„žμ΄μ§€ μ•ŠλŠ”λ‹€.
κ·Έλž˜μ„œ λ‹€λ₯Έ ν™˜κ²½κ³Ό νŒ¨ν‚€μ§€ μΆ©λŒμ„ μΌμœΌν‚€μ§€ μ•Šκ²Œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.

[κ°€μƒν™˜κ²½ 생성]

conda create -n [κ°€μƒν™˜κ²½ 이름] python=[파이썬 버전]

κ°€μƒν™˜κ²½ 이름을 chatbot, 파이썬 버전은 3.7둜 ν•˜λ©΄,

conda create -n chatbot python=3.7

[κ°€μƒν™˜κ²½ ν™œμ„±ν™”]

conda activate [κ°€μƒν™˜κ²½ 이름]

ν™œμ„±ν™”λ˜λ©΄, μ½˜μ†” 창에 μ•„λž˜μ™€ 같이 λ‚˜μ˜¬ 것이닀.

(base) # conda activate chatbot
(chatbot) #

[κ°€μƒν™˜κ²½ λΉ„ν™œμ„±ν™”]

conda deactivate

A.4 기타 νŒ¨ν‚€μ§€ μ„€μΉ˜ν•˜κΈ°

pipλͺ…λ Ήμ–΄λ‘œ μ•„λž˜ νŒ¨ν‚€μ§€λ“€μ„ μ„€μΉ˜ν•΄λ³΄μž!

  1. tensorflow

    pip install tensorflow==2.1

  2. konlpy

    pip install konlpy

  3. PyKomoran

    pip install PyKomoran

  4. gensim

    pip install gensim

  5. sklearn

    pip install sklearn

  6. seqeval

    pip install seqeval

  7. PyMySQL

    pip install PyMySQL

  8. openxl

    pip install openxl

  9. pandas, xlrd

    pip install pandas, xlrd

  10. matplotlib

    pip install matplotlib

  11. flask

    pip install flask

  12. requests

    pip install requests

3μž₯. ν† ν¬λ‚˜μ΄μ§•

컴퓨터가 μžμ—°μ–΄ 의미λ₯Ό 뢄석해 컴퓨터가 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•˜λŠ” 일을 μžμ—°μ–΄ 처리라고 ν•œλ‹€.

μžμ—°μ–΄ μ²˜λ¦¬λž€

μžμ—°μ–΄ μ²˜λ¦¬λž€, Natural Language Processing의 μ•½μžλ‘œ NLP라고 λΆ€λ₯Έλ‹€.
챗봇도 μžμ—°μ–΄ 처리의 ν•œ λΆ„μ•Όμž„!

μ–΄λ–€ λ°©μ‹μœΌλ‘œ μžμ—°μ–΄λ₯Ό μ»΄ν“¨ν„°μ—κ²Œ ν•™μŠ΅μ‹œν‚¬κΉŒ?
λ¨Όμ € λ¬Έμž₯을 μΌμ •ν•œ μ˜λ―Έκ°€ μžˆλŠ” κ°€μž₯ μž‘μ€ λ‹¨μ–΄λ“€λ‘œ λ‚˜λˆ„μ–΄, κ·Έ 단어듀을 μ΄μš©ν•΄ λΆ„μ„ν•œλ‹€.
μ—¬κΈ°μ„œ κ°€μž₯ μž‘μ€ 단어가 λ°”λ‘œ 토큰(token)이닀!!

ν† ν¬λ‚˜μ΄μ§•

μœ„μ—μ„œ 토큰이 무엇인지 μ•Œμ•„λ΄€λŠ”λ°, ν† ν¬λ‚˜μ΄μ§•μ€ 말 κ·ΈλŒ€λ‘œ ν† ν°ν™”ν•˜λŠ” 과정이라고 μ΄ν•΄ν–ˆλ‹€!
μ—¬κΈ°μ„œλŠ” KoNLPy(μ½”μ—”μ—˜νŒŒμ΄) 라이브러리λ₯Ό μ‚¬μš©ν–ˆμŒ!!

3.2. KoNLPy

KoNLPyλŠ” 기본적인 ν•œκ΅­μ–΄ μžμ—°μ–΄ 처리λ₯Ό μœ„ν•œ 파이썬 λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€.
μ—¬κΈ°μ„œλŠ” ν•œκ΅­μ–΄ λ¬Έμž₯을 ν† ν¬λ‚˜μ΄μ§• μž‘μ—…μ„ 제일 λ¨Όμ € μˆ˜ν–‰ν• κ±΄λ°, 토큰 λ‹¨μœ„λ₯Ό ν˜•νƒœμ†Œλ₯Ό 기본으둜 ν•˜μ—¬ 토큰화 ν•  것이닀.

3.2.1 Kkma

KkmaλŠ” 꼬꼬마라고 뢀름!
꼬꼬마 ν˜•νƒœμ†Œ 뢄석기λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ konlpy.tagνŒ¨ν‚€μ§€μ˜ Kkmaλͺ¨λ“ˆμ„ λΆˆλŸ¬μ™€μ•Ό 함.

Kkma λͺ¨λ“ˆ ν•¨μˆ˜

morphs(pharse) : 인자둜 μž…λ ₯ν•œ λ¬Έμž₯을 ν˜•νƒœμ†Œ λ‹¨μœ„λ‘œ ν† ν¬λ‚˜μ΄μ§•ν•¨. ν† ν¬λ‚˜μ΄μ§•λœ ν˜•νƒœμ†Œλ“€μ€ 리슀트 ν˜•νƒœλ‘œ λ°˜ν™˜.
nouns(pharse) : 인자둜 μž…λ ₯ν•œ λ¬Έμž₯μ—μ„œ λͺ…사인 ν† ν°λ§Œ μΆ”μΆœ.
pos(pharse, flatten=True) : POS tagge라고 ν•˜λ©°, 인자둜 μž…λ ₯ν•œ λ¬Έμž₯μ—μ„œ ν˜•νƒœμ†Œλ₯Ό μΆ”μΆœν•œ λ’€, ν’ˆμ‚¬ νƒœκΉ…μ„ 함. νŠœν”Œν˜•νƒœλ‘œ λ¬Άμ—¬μ„œ λ¦¬μŠ€νŠΈν˜•νƒœλ‘œ λ°˜ν™˜.
sentences(pharse) : 인자둜 μž…λ ₯ν•œ μ—¬λŸ¬ λ¬Έμž₯을 λΆ„λ¦¬ν•΄μ€Œ. 리슀트 ν˜•νƒœλ‘œ λ°˜ν™˜.

[Kkma ν’ˆμ‚¬ νƒœκ·Έ]
NNG : 일반 λͺ…사
JKS : 주격 쑰사
JKM : 뢀사격 쑰사
VV : 동사
EFN : ν‰μ„œν˜• μ’…κ²° μ–΄λ―Έ
SF : λ§ˆμΉ¨ν‘œ, λ¬ΌμŒν‘œ, λŠλ‚Œν‘œ

3.2.2 Komoran

Komoran은 μžλ°”λ‘œ κ°œλ°œν•œ ν•œκ΅­μ–΄ ν˜•νƒœμ†Œ 뢄석기이닀.
μ½”λͺ¨λž€μ΄λΌκ³  λΆ€λ₯΄κ³ , λ‹€λ₯Έ λΆ„μ„κΈ°μ™€λŠ” λ‹€λ₯΄κ²Œ 곡백이 ν¬ν•¨λœ ν˜•νƒœμ†Œλ‹¨μœ„λ‘œλ„ 뢄석 κ°€λŠ₯ν•΄ 자주 μ“°μž„!!
이걸 μ“°λ €λ©΄ μ½”λͺ¨λž€ λͺ¨λ“ˆμ„ λΆˆλŸ¬μ™€μ•Ό 함!

from konlpy.tag import Komoran

Komoran λͺ¨λ“ˆμ˜ ν•¨μˆ˜ μ„€λͺ…

morphs(pharse) : 인자둜 μž…λ ₯ν•œ λ¬Έμž₯을 ν˜•νƒœμ†Œ λ‹¨μœ„λ‘œ ν† ν¬λ‚˜μ΄μ§•ν•¨. λ¦¬μŠ€νŠΈν˜•νƒœλ‘œ λ°˜ν™˜.
nouns(pharse) : 인자둜 μž…λ ₯ν•œ λ¬Έμž₯μ—μ„œ λͺ…μ‚¬λ“€λ§Œ μΆ”μΆœ.
pos(pharse, flatten=True) : POS tagge라고 ν•˜λ©°, 인자둜 μž…λ ₯ν•œ λ¬Έμž₯μ—μ„œ ν˜•νƒœμ†Œλ₯Ό μΆ”μΆœν•œ λ’€, ν’ˆμ‚¬ νƒœκΉ…μ„ 함. νŠœν”Œν˜•νƒœλ‘œ λ¬Άμ—¬μ„œ λ¦¬μŠ€νŠΈν˜•νƒœλ‘œ λ°˜ν™˜.

3.2.3 Okt

OktλŠ” νŠΈμœ„ν„°μ—μ„œ κ°œλ°œν•œ ν•œκ΅­μ–΄ μ²˜λ¦¬κΈ°μ΄λ‹€.
μ–˜λ„ μ“°λ €λ©΄ Oktλͺ¨λ“ˆμ„ λΆˆλŸ¬μ™€μ•Ό 함.

from konlpy.tag import Okt

Oktλͺ¨λ“ˆμ˜ ν•¨μˆ˜

morphs(pharse)
nouns(pharse)
pos(pharse, stem=Falsem join=False)
nomalize(pharse) : μž…λ ₯ν•œ λ¬Έμž₯을 μ •κ·œν™”ν•¨. ex) μ‚¬λž‘ν–Œγ…‹ -> μ‚¬λž‘ν•΄ γ…‹γ…‹
pharses(pharse) : μž…λ ₯ν•œ λ¬Έμž₯μ—μ„œ 어ꡬλ₯Ό μΆ”μΆœν•¨. ex) 였늘 날씨가 μ’‹μ•„μš”. -> [β€˜μ˜€λŠ˜β€™, β€˜μ˜€λŠ˜ 날씨’, β€˜λ‚ μ”¨β€™]

Okt ν’ˆμ‚¬ νƒœκ·Έ ν‘œ

Noun : λͺ…사
Verb : 동사
Adjective : ν˜•μš©μ‚¬
Josa : 쑰사
Punctuation : ꡬ두점

4μž₯. μž„λ² λ”©

μ»΄ν“¨ν„°λŠ” μžμ—°μ–΄λ₯Ό μ§μ ‘μ μœΌλ‘œ μ²˜λ¦¬ν•  수 μ—†μŒ!
μˆ˜μΉ˜μ—°μ‚°λ§Œ κ°€λŠ₯ν•΄μ„œ μžμ—°μ–΄λ₯Ό μˆ«μžλ‚˜ 벑터 ν˜•νƒœλ‘œ λ³€ν™˜ν•΄μ•Ό ν•˜λŠ”λ°, 이런 과정을 μž„λ² λ”©μ΄λΌκ³  함.
즉, λ‹¨μ–΄λ‚˜ λ¬Έμž₯을 μˆ˜μΉ˜ν™”ν•΄ 벑터 κ³΅κ°„μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 과정을 말함.
μž„λ² λ”© κΈ°λ²•μ—λŠ” λ¬Έμž₯ μž„λ² λ”©κ³Ό 단어 μž„λ² λ”©μ΄ 있음!

4.2. 단어 μž„λ² λ”©

단어 μž„λ² λ”©μ€ λ§λ­‰μΉ˜μ—μ„œ 각각의 단어λ₯Ό λ²‘ν„°λ‘œ λ³€ν™˜ν•˜λŠ” 기법을 말함.
단어 μž„λ² λ”©μ€ μ˜λ―Έμ™€ 문법적 정보λ₯Ό μ§€λ‹ˆκ³  있음.

4.2.1 원-ν•« 인코딩

원-ν•«-인코딩은 단어λ₯Ό 숫자 λ²‘ν„°λ‘œ λ³€ν™˜ν•˜λŠ” κ°€μž₯ 기본적인 λ°©λ²•μž„.
μš”μ†Œλ“€ 쀑 단 ν•˜λ‚˜μ˜ κ°’λ§Œ 1이고 λ‚˜λ¨Έμ§€ μš”μ†Ÿκ°’μ€ 0인 인코딩을 μ˜λ―Έν•¨.
원-ν•«-μΈμ½”λ”©μœΌλ‘œ λ‚˜μ˜¨ κ²°κ³Όλ₯Ό 원-ν•«-벑터라고 ν•˜κ³ , 전체 μš”μ†Œ 쀑 단 ν•˜λ‚˜λ§Œ 1이기 λ•Œλ¬Έμ— ν¬μ†Œ 벑터라고 함!

4.2.2 ν¬μ†Œ ν‘œν˜„κ³Ό λΆ„μ‚° ν‘œν˜„

단어가 ν¬μ†Œλ²‘ν„°λ‘œ ν‘œν˜„λ˜λŠ” 방식을 ν¬μ†Œ ν‘œν˜„μ΄λΌκ³  ν•œλ‹€.
ν¬μ†Œ ν‘œν˜„μ€ 각각의 차원이 독립적인 정보λ₯Ό μ§€λ‹ˆκ³  μžˆμ–΄ μ‚¬λžŒμ΄ μ΄ν•΄ν•˜κΈ°μ— 직관적인 μž₯점, 단어 κ°„μ˜ 연관성이 μ „ν˜€ μ—†μ–΄ 의미λ₯Ό 담을 수 μ—†κ³ , 단어 μ‚¬μ „μ˜ 크기가 컀질 수둝 λ©”λͺ¨λ¦¬ 낭비와 계산 λ³΅μž‘λ„κ°€ μ»€μ§€λŠ” 단점.

μžμ—°μ–΄ 처리λ₯Ό μž˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” κΈ°λ³Έ 토큰이 λ˜λŠ” λ‹¨μ–΄μ˜ μ˜λ―Έμ™€ μ£Όλ³€ 단어 κ°„μ˜ 관계가 단어 μž„λ² λ”©μ— ν‘œν˜„λ˜μ–΄μ•Ό 함.
이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 단어 κ°„μ˜ μœ μ‚¬μ„±μ„ 잘 ν‘œν˜„ν•˜λ©΄μ„œλ„ 벑터 곡간을 μ ˆμ•½ν•  수 μžˆλŠ” 방법을 κ³ μ•ˆν–ˆλŠ”λ°, 이λ₯Ό λΆ„μ‚° ν‘œν˜„μ΄λΌκ³  함!

4.2.3 Word2Vec

원-ν•«-μΈμ½”λ”©μ˜ κ²½μš°μ—λŠ” κ΅¬ν˜„μ΄ κ°„λ‹¨ν•˜μ§€λ§Œ, μ±—λ΄‡μ˜ κ²½μš°μ—λŠ” λ‹¨μ–΄κ°„μ˜ μœ μ‚¬λ„λ₯Ό 계산할 수 μžˆμ–΄μ•Ό 쒋은 μ„±λŠ₯을 λ‚Έλ‹€λŠ” 단점이 μžˆλ‹€.
κ·Έλž˜μ„œ μ±—λ΄‡μ˜ κ²½μš°μ—λŠ” 원-ν•«-인코딩은 쒋은 기법은 μ•„λ‹ˆλ‹€.
κ·Έλ ‡κΈ° λ•Œλ¬Έμ—! λΆ„μ‚° ν‘œν˜„ ν˜•νƒœμ˜ 단어 μž„λ² λ”© λͺ¨λΈμ„ μ‚¬μš©ν•  것이닀.
λŒ€ν‘œμ μΈ λͺ¨λΈλ‘œλŠ” Word2Vecλͺ¨λΈμ΄ μžˆλ‹€.

5μž₯. ν…μŠ€νŠΈ μœ μ‚¬λ„

Word2Vec은 인곡 신경망을 μ΄μš©ν–ˆλ‹€.
μ΄λ²ˆμ—” 톡계적인 방법을 μ΄μš©ν•΄ μœ μ‚¬λ„λ₯Ό κ³„μ‚°ν•΄λ³΄μž.

5.1. n-gram μœ μ‚¬λ„

n-gram은 주어진 λ¬Έμž₯μ—μ„œ n개의 연속적인 단어 μ‹œν€€μŠ€λ₯Ό μ˜λ―Έν•œλ‹€.
n-gram은 λ¬Έμž₯μ—μ„œ n개의 단어λ₯Ό ν† ν°μœΌλ‘œ μ‚¬μš©ν•œλ‹€.
이 것은 μ΄μ›ƒν•œ λ‹¨μ–΄μ˜ μΆœν˜„ 횟수λ₯Ό ν†΅κ³„μ μœΌλ‘œ ν‘œν˜„ν•΄ ν…μŠ€νŠΈμ˜ μœ μ‚¬λ„λ₯Ό κ³„μ‚°ν•˜λŠ” 방법이닀.

[n에 λ”°λ₯Έ n-gram]

'1661λ…„' '6μ›”' '뉴턴'은 'μ„ μƒλ‹˜'의 'μ œμ•ˆ'으둜 'νŠΈλ¦¬λ‹ˆν‹°'에 'μž…ν•™'ν•˜μ˜€λ‹€.  

n=1 (unigram) : 1661λ…„/6μ›”/뉴턴/μ„ μƒλ‹˜/μ œμ•ˆ/νŠΈλ¦¬λ‹ˆν‹°/μž…ν•™  
n=2 (bigram) : 1661λ…„ 6μ›”/6μ›” 뉴턴/뉴턴 μ„ μƒλ‹˜/μ„ μƒλ‹˜ μ œμ•ˆ/... /νŠΈλ¦¬λ‹ˆν‹° μž…ν•™  
...
n=4 (4-gram) : 1661λ…„ 6μ›” 뉴턴 μ„ μƒλ‹˜/6μ›” 뉴턴 μ„ μƒλ‹˜ μ œμ•ˆ/뉴턴 μ„ μƒλ‹˜ μ œμ•ˆ νŠΈλ¦¬λ‹ˆν‹°/../μ„ μƒλ‹˜ μ œμ•ˆ νŠΈλ¦¬λ‹ˆν‹° μž…ν•™  
n=7 : 1661λ…„ 6μ›” 뉴턴 μ„ μƒλ‹˜ μ œμ•ˆ νŠΈλ¦¬λ‹ˆν‹° μž…ν•™

n=1 : unigram, n=2 : bigram, n=3 : trigram, n=4 : 4-gram …

λ¬Έμž₯ A와 Bκ°€ μžˆλ‹€κ³  ν•˜μž.
λ¬Έμž₯ Bκ°€ A와 μ–Όλ§ˆλ‚˜ μœ μ‚¬ν• κΉŒ?
similarity = tf(A, B)/tokens(A)

  • n-gram μœ μ‚¬λ„ 곡식
    • tf(A, b) : A와 Bμ—μ„œ λ™μΌν•œ ν† ν°μ˜ μΆœν˜„ λΉˆλ„
    • tokens()λŠ” ν•΄λ‹Ή λ¬Έμž₯이 전체 토큰 수

[2-gram을 μ΄μš©ν•œ μ˜ˆμ‹œ]
A: 6월에 뉴턴은 μ„ μƒλ‹˜μ˜ μ œμ•ˆμœΌλ‘œ νŠΈλ¦¬λ‹ˆν‹°μ— μž…ν•™ν–ˆλ‹€.
B: 6월에 뉴턴은 μ„ μƒλ‹˜μ˜ μ œμ•ˆμœΌλ‘œ λŒ€ν•™κ΅μ— μž…ν•™ν–ˆλ‹€.

  • λ¬Έμž₯ Aμ—μ„œλŠ” 6개의 토큰이 μ „λΆ€ λ‚˜μ˜¨λ‹€.
  • λ¬Έμž₯ Bμ—μ„œλŠ” λ™μΌν•œ 토큰이 4개 카운트 λ˜μ—ˆλ‹€.
  • 즉, n-gram μœ μ‚¬λ„ μˆ˜μ‹μ— 따라 4/6으둜 0.66의 μœ μ‚¬λ„λ₯Ό μ§€λ‹Œλ‹€. == β€œBλŠ” A와 66% μœ μ‚¬ν•©λ‹ˆλ‹€.”

5.2. 코사인 μœ μ‚¬λ„

μ•žμ„œ, λ‹¨μ–΄λ‚˜ λ¬Έμž₯을 λ²‘ν„°λ‘œ ν‘œν˜„ν•  수 μžˆμ—ˆλ‹€.
κ·Έλ ‡λ‹€λ©΄ 벑터 κ°„μ˜ κ±°λ¦¬λ‚˜ 각도λ₯Ό μ΄μš©ν•΄ μœ μ‚¬μ„±μ„ νŒŒμ•…ν•  μˆ˜λ„ μžˆλ‹€.
벑터 κ°„ 거리λ₯Ό κ΅¬ν•˜λŠ” 방법은 λ‹€μ–‘ν•˜μ§€λ§Œ, μ—¬κΈ°μ„œλŠ” 코사인 μœ μ‚¬λ„λ₯Ό μ‚¬μš©ν•  것이닀.
코사인 μœ μ‚¬λ„λŠ” 두 벑터 κ°„ 코사인 각도λ₯Ό μ΄μš©ν•΄ μœ μ‚¬λ„λ₯Ό μΈ‘μ •ν•˜λŠ” 방법이닀.
이 μœ μ‚¬λ„λŠ” λ²‘ν„°μ˜ 크기가 μ€‘μš”ν•˜μ§€ μ•Šμ„ λ•Œ κ·Έ 거리λ₯Ό μΈ‘μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.

similarity = cos(세타) = A*B / A Β  B

[μ˜ˆμ‹œ]
A: 6월에 뉴턴은 μ„ μƒλ‹˜μ˜ μ œμ•ˆμœΌλ‘œ νŠΈλ¦¬λ‹ˆν‹°μ— μž…ν•™ν–ˆλ‹€.
B: 6월에 뉴턴은 μ„ μƒλ‹˜μ˜ μ œμ•ˆμœΌλ‘œ λŒ€ν•™κ΅μ— μž…ν•™ν–ˆλ‹€.

각 λ¬Έμž₯에 λŒ€ν•˜μ—¬ [β€˜6월’, β€˜λ‰΄ν„΄β€™, β€˜μ„ μƒλ‹˜β€™, β€˜μ œμ•ˆβ€™, β€˜νŠΈλ¦¬λ‹ˆν‹°β€™, β€˜μž…ν•™β€™, β€˜λŒ€ν•™β€™] 의 토큰 값듀은 A = [1, 1, 1, 1, 1, 1, 0]
B = [1, 1, 1, 1, 0, 1, 1]

[λΆ„μž 계산] A*B = i=1 ~ n Ai * Bi의 ν•© = (1 * 1) + (1 * 1) + (1 * 1) + (1 * 1) + (1 * 0) + (1 * 1) + (0 * 1) = 1 + 1 + 1 + 1 + 0 + 1 + 0 = 5

[λΆ„λͺ¨ 계산] |A||B| = (1^2 + 1^2 + 1^2 + 1^2 + 1^2 + 1^2 + 0^2)^1/2 * (1^2 + 1^2 + 1^2 + 1^2 + 0^2 + 1^2 + 1^2)^1/2 = 6^1/2 * 6^1/2 = 6

즉, 5/6μ΄λ―€λ‘œ 두 λ¬Έμž₯은 0.83333만큼 μœ μ‚¬λ„λ₯Ό κ°–λŠ”λ‹€.

6μž₯. 챗봇 엔진에 ν•„μš”ν•œ λ”₯λŸ¬λ‹ λͺ¨λΈ

6.1 μΌ€λΌμŠ€(Keras)

μ—¬λŸ¬ λ”₯λŸ¬λ‹ ν”„λ ˆμž„μ›Œν¬κ°€ μžˆμ§€λ§Œ, μΌ€λΌμŠ€(Keras)λŠ” 직관적이고 μ‚¬μš©ν•˜κΈ° μ‰½λ‹€λŠ” μž₯점이 μžˆλ‹€.
무엇보닀 λΉ λ₯Έ κ°œλ°œμ„ λͺ©μ μœΌλ‘œ 두고, λͺ¨λ“ˆ ꡬ성이 κ°„λ‹¨ν•˜μ—¬ 비전문가듀도 μƒλŒ€μ μœΌλ‘œ μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.
μΌ€λΌμŠ€λŠ” 신경망 λͺ¨λΈμ„ ꡬ좕할 수 μžˆλŠ” κ³ μˆ˜μ€€ API λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€.
μ΅œκ·Όμ— ν…μ„œν”Œλ‘œμš° 2.0에 κΈ°λ³Έ API둜 μ±„νƒλ˜μ–΄ κ΅¬κΈ€μ˜ 지원을 λ°›κ³ μžˆλ‹€.

6.1.1 인곡 신경망

인곡 신경망은 λ‘λ‡Œμ˜ λ‰΄λŸ°μ„ λͺ¨λ°©ν•œ λͺ¨λΈμ΄λ‹€.

μž…λ ₯: x0, x1, x2
κ°€μ€‘μΉ˜ : w0, w1, w2

λ‰΄λŸ° : βˆ‘wixi + b | f
좜λ ₯ : f(βˆ‘wi
xi + b)

λ‰΄λŸ°μ˜ 계산 과정을 보면 μž…λ ₯된 xiκ°’λ“€κ³Ό λŒ€μ‘λ˜λŠ” λ‰΄λŸ°μ˜ κ°€μ€‘μΉ˜ wi값듀을 각각 κ³±ν•΄μ„œ λͺ¨λ‘ 더해쀀닀.
그리고 편ν–₯κ°’ bλ₯Ό 톡해 결과값을 μ‘°μ •ν•œλ‹€.
이λ₯Ό μˆ˜ν•™μ μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ κ°„λ‹¨ν•œ 1μ°¨ ν•¨μˆ˜μ˜ λͺ¨μ–‘이닀.

y = (w0x0 + w1x1 + w2x2) + b

μ‹€μ œ λ‰΄λŸ°μ€ νŠΉμ • 강도 이상일 λ•Œλ§Œ λ‹€μŒ λ‰΄λŸ°μœΌλ‘œ μ‹ ν˜Έλ₯Ό μ „λ‹¬ν•˜λŠ”λ°, 인곡 μ‹ κ²½λ§μ—μ„œλŠ” λ‰΄λŸ°μ˜ 처리 κ³Όμ • 쀑 f둜 ν‘œμ‹œλœ μ˜μ—­μ΄λ‹€.
이λ₯Ό ν™œμ„±ν™” ν•¨μˆ˜λΌκ³  ν•˜λ©°, κ°€μ€‘μΉ˜ 계산 κ²°κ³Όκ°’ yκ°€ μ΅œμ’…μ μœΌλ‘œ μ–΄λ–€ ν˜•νƒœμ˜ 좜λ ₯κ°’μœΌλ‘œ 내보낼지 κ²°μ •ν•œλ‹€.
ν™œμ„±ν™” ν•¨μˆ˜λŠ” μ’…λ₯˜κ°€ λ§Žμ€λ°, μ—¬κΈ°μ„œλŠ” 3κ°€μ§€λ§Œ 닀룬닀.

  1. μŠ€ν… ν•¨μˆ˜ μŠ€ν… ν•¨μˆ˜λŠ” κ°€μž₯ 기본이 λ˜λŠ” ν•¨μˆ˜μ΄λ‹€.
    κ·Έλž˜ν”„κ°€ 계단같이 μƒκ²¨μ„œ μŠ€ν… ν•¨μˆ˜μ΄κ³ , μž…λ ₯값이 0보닀 크면 1둜, 0 μ΄ν•˜μΌ λ•ŒλŠ” 0으둜 λ§Œλ“ λ‹€.
    즉 μž…λ ₯값이 μ–‘μˆ˜μΌ λ•Œλ§Œ ν™œμ„±ν™” μ‹œν‚¨λ‹€.

  2. μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜ 이진 λΆ„λ₯˜μ—μ„œ μŠ€ν… ν•¨μˆ˜μ˜ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
    μŠ€ν… ν•¨μˆ˜μ—μ„œ νŒλ‹¨μ˜ 기쀀이 λ˜λŠ” μž„κ³„μΉ˜ λΆ€κ·Όμ˜ 데이터λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠλŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 계단 λͺ¨μ–‘을 μ™„λ§Œν•œ ν˜•νƒœλ‘œ ν‘œν˜„ν–ˆλ‹€.
    μˆ˜μ‹ : S(t) = 1 / (1 + e^-t)

  3. ReLU ν•¨μˆ˜ μž…λ ₯값이 0 이상인 κ²½μš°μ—λŠ” κΈ°μšΈκΈ°κ°€ 1인 직선이고, 0보닀 μž‘μ„ λ•ŒλŠ” 결과값이 0이닀.
    μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜μ— λΉ„ν•΄ μ—°μ‚° λΉ„μš©μ΄ 크지 μ•Šμ•„ ν•™μŠ΅ 속도가 λΉ λ₯΄λ‹€.

μ‹€μ œλ‘œ 문제λ₯Ό 신경망 λͺ¨λΈλ‘œ ν•΄κ²°ν•  λ•ŒλŠ” 1개의 λ‰΄λŸ°λ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, λ¬Έμ œκ°€ λ³΅μž‘ν•  수둝 λ‰΄λŸ°μ˜ μˆ˜κ°€ λŠ˜μ–΄λ‚˜κ³  μ‹ κ²½λ§μ˜ 계측도 κΉŠμ–΄μ§„λ‹€.

μž…λ ₯μΈ΅κ³Ό 좜λ ₯측으둜만 κ΅¬μ„±λ˜μ–΄ μžˆλŠ” λ‹¨μˆœν•œ 신경망을 단측 신경망이라고 ν•œλ‹€.
μž…λ ₯μΈ΅κ³Ό 1개 μ΄μƒμ˜ 은닉측, 좜λ ₯측으둜 κ΅¬μ„±λ˜μ–΄ μžˆλŠ” 신경망은 심측 신경망이라고 ν•œλ‹€.
ν”νžˆ λ”₯λŸ¬λ‹κ³Ό 신경망이라고 λΆ€λ₯΄λŠ” 것듀이 λ°”λ‘œ 심측 신경망이닀.
신경망 계측이 깊게(deep)κ΅¬μ„±λ˜μ–΄ 각각의 λ‰΄λŸ°μ„ ν•™μŠ΅(learning)μ‹œν‚¨λ‹€ ν•΄μ„œ λ”₯λŸ¬λ‹

주둜 μž…λ ₯측을 κ΅¬μ„±ν•˜λŠ” λ‰΄λŸ°λ“€μ€ 1개의 μž…λ ₯값을 κ°–κ³ , κ°€μ€‘μΉ˜μ™€ ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό κ°–κ³  μžˆμ§€ μ•Šμ•„ μž…λ ₯된 값을 κ·ΈλŒ€λ‘œ 좜λ ₯ν•˜λŠ” νŠΉμ§•μ΄ μžˆλ‹€.
좜λ ₯측의 λ‰΄λŸ°μ€ 각각 1개의 좜λ ₯값을 κ°–κ³  있고, μ§€μ •λœ ν™œμ„±ν™” ν•¨μˆ˜μ— λ”°λ₯Έ 좜λ ₯ λ²”μœ„λ₯Ό κ°–κ³  μžˆλ‹€.
β€œλ³΅μž‘ν•œ 문제일 수둝 λ‰΄λŸ°μ™€ 은닉측 수λ₯Ό 늘리면 쒋닀”라고 ν•˜μ§€λ§Œ, 계산해야 ν•˜λŠ” νŒŒλΌλ―Έν„°κ°€ λ§Žμ•„μ§€λ©΄ λΉ„μš©μ΄ λ†’μ•„μ§€λŠ” 단점이 μžˆλ‹€.

신경망에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.
신경망 λͺ¨λΈμ—μ„œ μž…λ ₯μΈ΅μœΌλ‘œλΆ€ν„° 좜λ ₯μΈ΅κΉŒμ§€ 데이터가 순방ν–₯으둜 μ „νŒŒλ˜λŠ” 과정을 μˆœμ „νŒŒλΌκ³  ν•œλ‹€.
데이터가 μˆœλ°©ν˜•μœΌλ‘œ μ „νŒŒλ  λ•Œ ν˜„ 단계 λ‰΄λŸ°μ˜ κ°€μ€‘μΉ˜μ™€ μ „ 단계 λ‰΄λŸ°μ˜ 좜λ ₯κ°’μ˜ 곱을 μž…λ ₯κ°’μœΌλ‘œ λ°›λŠ”λ‹€.
이 값은 ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό 톡해 λ‹€μŒ λ‰΄λŸ°μœΌλ‘œ~

[μˆœμ „νŒŒ μ˜ˆμ‹œ]
μž…λ ₯μΈ΅: x –(μ „νŒŒ: w_h * x)–> 은닉측: h –(μ „νŒŒ: w_y * h)–> κ²°κ³Όκ°’(yout)

결과값이 μ‹€μ œ κ°’κ³Ό μ˜€μ°¨κ°€ λ§Žλ‹€λ©΄?
λ‹€μŒ μˆœμ „νŒŒ 진행 μ‹œ μ˜€μ°¨κ°€ μ€„μ–΄λ“œλŠ” λ°©ν–₯으둜 κ°€μ€‘μΉ˜(w_h, w_y)λ₯Ό μ—­λ°©ν–₯으둜 κ°±μ‹ ν•΄λ‚˜κ°„λ‹€.
이 과정을 μ—­μ „νŒŒλΌκ³  ν•œλ‹€.

6.1.2 λ”₯λŸ¬λ‹ λΆ„λ₯˜ λͺ¨λΈ λ§Œλ“€κΈ°

[History 객체]
loss : 각 μ—ν¬ν¬λ§ˆλ‹€μ˜ ν•™μŠ΅ 손싀값
accuracy : 각 μ—ν¬ν¬λ§ˆλ‹€μ˜ ν•™μŠ΅ 정확도
val_loss : 각 μ—ν¬ν¬λ§ˆλ‹€μ˜ 검증 손싀값
val_accuracy : 각 μ—ν¬ν¬λ§ˆλ‹€μ˜ 검증 정확도
epoch(에포크) : ν•™μŠ΅μ˜ 횟수

import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense

# MNIST 데이터셋 κ°€μ Έμ˜€κΈ°
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 # 데이터 μ •κ·œν™”

# tf.dataλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터셋을 μ„žκ³  배치 λ§Œλ“€κΈ°
ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000)
train_size = int(len(x_train) * 0.7) # ν•™μŠ΄μ…‹ : 검증셋 = 7 : 3
train_ds = ds.take(train_size).batch(20)
val_ds = ds.skip(train_size).batch(20)

# MNIST λΆ„λ₯˜ λͺ¨λΈ ꡬ성
model = Sequential()
model.add(Flatten(input_shape=(28, 28)))
model.add(Dense(20, activation='relu'))
model.add(Dense(20, activation='relu'))
model.add(Dense(10, activation='softmax'))

# λͺ¨λΈ 생성
model.compile(loss='sparse_categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
# model.complie(loss='categorial_crossentropy', optimizer='sgd', metrics['accuracy'])

# λͺ¨λΈ ν•™μŠ΅
hist = model.fit(train_ds, validation_data=val_ds, epochs=10)

# λͺ¨λΈ 평가
print('λͺ¨λΈ 평가')
model.evaluate(x_test, y_test)

# λͺ¨λΈ 정보 좜λ ₯
model.summary()

# λͺ¨λΈ μ €μž₯
model.save('mnist_model.h5')

# ν•™μŠ΅ κ²°κ³Ό κ·Έλž˜ν”„ 그리기
fig, loss_ax = plt.subplots()
acc_ax = loss_ax.twinx()

loss_ax.plot(hist.history['loss'], 'y', label='train loss')
loss_ax.plot(hist.history['var_loss'], 'r', label='var loss')

acc_ax.plot(hist.history['accuracy'], 'b', label='train acc')
acc_ax.plot(hist.history['val_accuracy'], 'g', label='val acc')

loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')
acc_ax.set_ylabel('accuracy')

loss_ax.legend(loc='upper left')
acc_ax.legend(loc='lower left')
plt.show()

μœ„ μ½”λ“œλ₯Ό λŒλ¦¬λ‹€κ°€ λ§Œμ•½ μ£Όν”Όν„°μ—μ„œ 이런 였λ₯˜κ°€ λœ¬λ‹€λ©΄??

The kernel appears to have died. It will restart automatically.

이 였λ₯˜κ°€ λ°œμƒν•˜λŠ” μ΄μœ λŠ” 컀널이 μ£½μ–΄μ„œμΈλ°, 컀널이 μ£½λŠ” μ΄μœ λŠ” λ©”λͺ¨λ¦¬ ν• λ‹ΉλŸ‰μ„ μ΄ˆκ³Όν–ˆκΈ° λ•Œλ¬Έ!
[해결방법]

  1. jupyter_notebook_config.pyμ—μ„œ λ‹€μŒ μ½”λ“œλ₯Ό μž…λ ₯ν•˜κ³  μž¬λΆ€νŒ…ν•˜κΈ°.
    • μœ„μ˜ .pyνŒŒμΌμ€ ./jupyter폴더 μ•ˆμ— 있음

      c.NotebookApp.max_buffer_size = 100000000000000000000000

μ΄λ ‡κ²Œ 큰 값을 μž…λ ₯ν•΄ λ°”κΎΈλ©΄ 됨

6.2.1 CNN λͺ¨λΈ κ°œλ…

CNN을 μ΄ν•΄ν•˜κΈ° 전에 ν•©μ„±κ³±κ³Ό 풀링연산이 무엇인지 μ•Œμ•„μ•Ό ν•œλ‹€.

[ν•©μ„±κ³± μ—°μ‚°]
ν•©μ„±κ³± μ—°μ‚°μ΄λž€, ν•©μ„±κ³± ν•„ν„°λ‘œ λΆˆλ¦¬λŠ” νŠΉμ • 크기의 행렬을 이미지 데이터(or λ¬Έμž₯ 데이터) 행렬에 μŠ¬λΌμ΄λ”©ν•˜λ©΄μ„œ κ³±ν•˜κ³  λ”ν•˜λŠ” 연산을 μ˜λ―Έν•¨.
ν•©μ„±κ³± ν•„ν„°λž€ κ²½μš°μ— 따라 마슀크, μœˆλ„μš°, 컀널 λ“±μœΌλ‘œ λ‹€μ–‘ν•˜κ²Œ λΆˆλ¦°λ‹€.
이 μ±…μ—μ„œλŠ” ν•„ν„° ν˜Ήμ€ μ»€λ„λ‘œ 뢀름

[풀링 μ—°μ‚°]
풀링 μ—°μ‚°μ΄λž€, ν•©μ„±κ³± μ—°μ‚° 결과둜 λ‚˜μ˜¨ νŠΉμ§•λ§΅μ˜ 크기λ₯Ό μ€„μ΄κ±°λ‚˜ μ£Όμš”ν•œ νŠΉμ§•μ„ μΆ”μΆœν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ—°μ‚°μœΌλ‘œ, μ΅œλŒ€ 풀링과 평균 풀링이 μžˆλ‹€.
이 μ€‘μ—μ„œλŠ” μ΅œλŒ€ 풀링 연산을 주둜 μ‚¬μš©ν•œλ‹€κ³  ν•œλ‹€.
풀링 μ—°μ‚°μ—μ„œλ„ ν•©μ„±κ³± μ—°μ‚°μ—μ„œ μ‚¬μš©ν•˜λŠ” μœˆλ„μš° 크기, μŠ€νŠΈλΌμ΄λ“œ, νŒ¨λ”© κ°œλ…μ΄ λ™μΌν•˜κ²Œ μ μš©λœλ‹€. 풀링 μ—°μ‚°μ—μ„œλŠ” 필터보단 μœˆλ„μš°λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•œλ‹€.

6.3 개체λͺ… 인식을 μœ„ν•œ μ–‘λ°©ν–₯ LSTM λͺ¨λΈ

챗봇 엔진에 개체λͺ… 인식을 μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ–‘λ°©ν–₯ LSTM에 λŒ€ν•΄μ„œ ν•™μŠ΅ν•œλ‹€.
LSTM은 μˆœν™˜ 신경망 λͺ¨λΈμ˜ μΌμ’…μœΌλ‘œ μ‹œν€€μŠ€ λ˜λŠ” μ‹œκ³„μ—΄ λ°μ΄ν„°μ˜ νŒ¨ν„΄μ„ μΈμ‹ν•˜λŠ” λΆ„μ•Όμ—μ„œ 많이 μ‚¬μš©ν•œλ‹€.
연속적인 λ°μ΄ν„°μ˜ νŒ¨ν„΄μ„ μ΄μš©ν•΄ κ²°κ³Όλ₯Ό μ˜ˆμΈ‘ν•˜λ―€λ‘œ, 주둜 μ£Όκ°€ μ˜ˆμΈ‘μ΄λ‚˜ μ‹ ν˜Έ 뢄석 및 λ²ˆμ—­ λΆ„μ•Όμ—μ„œ 쒋은 μ„±λŠ₯을 보인닀.

6.3.1 RNN

LSTM은 RNNλͺ¨λΈμ—μ„œ νŒŒμƒλœ λͺ¨λΈμ΄λ‹€.
κ·Έλž˜μ„œ RNN이 뭔데?
RNN은 μˆœν™˜ μ‹ κ²½λ§μœΌλ‘œ 뢈리며, μ•žμ„œ 배운 신경망 λͺ¨λΈκ³Ό λ‹€λ₯΄κ²Œ 은닉측 λ…Έλ“œμ˜ 좜λ ₯값을 좜λ ₯μΈ΅κ³Ό κ·Έ λ‹€μŒ μ‹œμ μ˜ 은닉측 λ…Έλ“œμ˜ μž…λ ₯으둜 전달해 μˆœν™˜ν•˜λŠ” νŠΉμ§•μ„ κ°–κ³  μžˆλ‹€.

RNN λͺ¨λΈμ€ μ–΄λ–€ 문제λ₯Ό ν•΄κ²°ν•˜λŠλƒμ— 따라 μž…λ ₯κ³Ό 좜λ ₯의 길이λ₯Ό μ‘°μ ˆν•  수 μžˆλ‹€.
μ—¬λŸ¬ 개λ₯Ό μž…λ ₯λ°›μ•„ ν•˜λ‚˜λ₯Ό 좜λ ₯ν•˜λŠ” λͺ¨λΈ : many-to-one λͺ¨λΈ
ν•œ 개λ₯Ό μž…λ ₯λ°›μ•„ μ—¬λŸ¬ 개λ₯Ό 좜λ ₯ν•˜λŠ” λͺ¨λΈ : one-to-many λͺ¨λΈ
μ—¬λŸ¬ 개λ₯Ό μž…λ ₯λ°›μ•„ μ—¬λŸ¬ 개λ₯Ό 좜λ ₯ν•˜λŠ” λͺ¨λΈ : many-to-many λͺ¨λΈ

참고둜, RNN은 λͺ¨λ“  μ‹œμ μ—μ„œ λ™μΌν•œ κ°€μ€‘μΉ˜μ™€ 편ν–₯값을 μ‚¬μš©ν•œλ‹€.

6.3.2 LSTM

RNN은 μž…λ ₯ μ‹œν€€μŠ€μ˜ μ‹œμ μ΄ κΈΈμ–΄μ§ˆ 수둝 μ•žμͺ½μ˜ 데이터가 λ’€μͺ½μœΌλ‘œ 잘 μ „λ‹¬λ˜μ§€ μ•Šμ•„ ν•™μŠ΅λŠ₯λ ₯이 λ–¨μ–΄μ§„λ‹€λŠ” 단점이 μžˆλ‹€.
λ˜ν•œ RNN을 λ‹€μΈ΅ ꡬ쑰둜 μŒ“μœΌλ©΄ μž…λ ₯κ³Ό 좜λ ₯ 데이터 μ‚¬μ΄μ˜ μ—°κ΄€ 관계가 쀄어듀어 μž₯κΈ° μ˜μ‘΄μ„± λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.
이런 문제λ₯Ό λ³΄μ™„ν•˜κΈ° μœ„ν•΄ RNN을 λ³€ν˜•μ‹œμΌœ λ‚˜μ˜¨ 것이 λ°”λ‘œ LSTM!!

LSTM의 λ‚΄λΆ€ ꡬ쑰λ₯Ό μ‚΄νŽ΄λ³΄μž.
LSTM은 기본적인 RNN의 μ€λ‹‰μƒνƒœλ₯Ό κ³„μ‚°ν•˜λŠ” 방식에 λ³€ν™”κ°€ 있으며, 은닉 상탯값 이외에 μ…€ μƒνƒœκ°’μ΄ μΆ”κ°€λ˜μ—ˆλ‹€.
은닉 μƒνƒœκ°’κ³Ό μ…€ μƒνƒœκ°’μ„ κ³„μ‚°ν•˜κΈ° μœ„ν•΄ 3개의 게이트(Gate)κ°€ μΆ”κ°€λ˜μ—ˆλ‹€.

  1. μž…λ ₯ 게이트
    • ν˜„μž¬ 정보λ₯Ό μ–Όλ§ˆλ‚˜ 기얡할지 κ²°μ •ν•˜λŠ” 게이트
  2. μ‚­μ œ 게이트
    • 이전 μ‹œμ μ˜ μ…€ μƒνƒœκ°’μ„ μ‚­μ œν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 게이트
  3. 좜λ ₯ 게이트
    • 좜λ ₯ 게이트의 결과값은 ν˜„μž¬ 은닉 μ‹œμ μ˜ 은닉 μƒνƒœλ₯Ό κ²°μ •ν•˜λŠ”λ° μ‚¬μš©λ˜λ©°, ν•΄λ‹Ή 값은 μ „λ‹¬λ˜λŠ” λ©”λͺ¨λ¦¬ 셀이 λ§Žμ•„μ§ˆμˆ˜λ‘ 정보 μœ μ‹€μ΄ 크기 λ•Œλ¬Έμ— 단기 μƒνƒœλΌκ³  뢀름

6.3.3 μ–‘λ°©ν–₯ LSTM

RNNμ΄λ‚˜ LSTM은 일반 신경망과 λ‹€λ₯΄κ²Œ μ‹œν€€μŠ€ λ˜λŠ” μ‹œκ³„μ—΄ 데이터 μ²˜λ¦¬μ— νŠΉν™”λ˜μ–΄ μ€λ‹‰μΈ΅μ—μ„œ 과거의 정보λ₯Ό κΈ°μ–΅ν•  수 μžˆλ‹€.
ν•˜μ§€λ§Œ μˆœν™˜ μ‹ κ²½λ§μ˜ νŠΉμ„±μƒ 데이터가 μž…λ ₯ 순으둜 처리되기 λ•Œλ¬Έμ— 이전 μ‹œμ μ˜ μ •λ³΄λ§Œ ν™œμš©ν•  수 밖에 μ—†λ‹€λŠ” 단점이 μ‘΄μž¬ν•˜λŠ”λ°β€¦

[μ˜ˆμ‹œ]

iosμ•± β€œκ°œλ°œβ€μ€ λ§₯뢁이 ν•„μš”ν•©λ‹ˆλ‹€.

일반적인 RNNμ΄λ‚˜ LSTMμ—μ„œλŠ” β€˜ios’와 β€˜μ•±β€™μ΄λΌλŠ” λ‹¨μ–΄λ§ŒμœΌλ‘œ β€œ β€œμ— β€œκ°œλ°œβ€μ΄λΌλŠ” 단어가 λ“€μ–΄κ°ˆ 것이라고 μœ μΆ”ν•˜κΈ°μ—λŠ” 정보가 λΆ€μ‘±ν•˜λ‹€.
λ”°λΌμ„œ μžμ—°μ–΄ μ²˜λ¦¬μ— μžˆμ–΄μ„œ μž…λ ₯ λ°μ΄ν„°μ˜ μ •λ°©ν–₯ 처리만큼 μ—­λ°©ν–₯ μ²˜λ¦¬λ„ μ€‘μš”ν•˜λ‹€!! μ΄λ§μž…λ‹ˆλ‹€~

μ–‘λ°©ν–₯ LSTM은 κΈ°μ‘΄ LSTM계측에 μ—­λ°©ν–₯으둜 μ²˜λ¦¬ν•˜λŠ” LSTM계측을 ν•˜λ‚˜ 더 μΆ”κ°€ν•΄ μ–‘λ°©ν–₯μ—μ„œ λ¬Έμž₯의 νŒ¨ν„΄μ„ 뢄석할 수 μžˆλ„λ‘ λ˜μ–΄μžˆλ‹€.
이러면 μž…λ ₯ λ¬Έμž₯을 μ–‘λ°©ν–₯μ—μ„œ μ²˜λ¦¬ν•˜λ―€λ‘œ λ¬Έμž₯이 길어진닀고 ν•˜λ”λΌλ„ 정보 손싀 없이 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€κ³  ν•œλ‹€!

6.3.4 개체λͺ… 인식

개체λͺ… 인식(NER)μ΄λž€ λ¬Έμž₯μ—μ„œ 각 개체의 μœ ν˜•μ„ μΈμ‹ν•˜λŠ” λ™μž‘μ΄λ‹€.
즉, λ¬Έμž₯ 내에 ν¬ν•¨λœ μ–΄λ–€ 단어가 인물, μž₯μ†Œ, λ‚ μ§œ 등을 μ˜λ―Έν•˜λŠ” 단어인지 μΈμ‹ν•˜λŠ” 것이닀.
λ”₯λŸ¬λ‹ λͺ¨λΈμ΄λ‚˜ ν™•λ₯  λͺ¨λΈ 등을 μ΄μš©ν•΄ λ¬Έμž₯μ—μ„œ 개체λͺ…을 μΈμ‹ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ 개체λͺ… 인식기라고 λΆ€λ₯Έλ‹€!

개체λͺ… 인식은 μ±—λ΄‡μ—μ„œ λ¬Έμž₯을 μ •ν™•ν•˜κ²Œ ν•΄μ„ν•˜κΈ° μœ„ν•΄ β€œλ°˜λ“œμ‹œβ€ ν•΄μ•Όν•˜λŠ” μ „μ²˜λ¦¬ 과정이닀!!

개체λͺ… 인식기λ₯Ό κ°œλ°œν•˜λŠ” 것은 맀우 μ–΄λ €μš΄ 과정이닀…
κ΅­λ‚΄μ—λŠ” κ³΅κ°œλ˜μ–΄μžˆλŠ” ν•™μŠ΅ 데이터도 λ§Žμ§€ μ•Šμ„ λΏλ”λŸ¬, κ°œλ°œν•˜κΈ° μœ„ν•΄ ν•™μŠ΅ 데이터λ₯Ό λ§Œλ“œλŠ” 것 λ˜ν•œ λ§Žμ€ μ‹œκ°„κ³Ό λΉ„μš©μ΄ λ“€μ–΄κ°€κΈ° λ–„λ¬Έ..γ…œγ…œ

κ·Έλž˜μ„œ 이 μ±…μ—μ„œλŠ” μ™„λ²½ν•œ 개체λͺ… 인식 λͺ¨λΈμ€ μ•„λ‹ˆλ”λΌλ„ μˆœν™˜ 신경망을 μ΄μš©ν—€ 개체λͺ…을 μΈμ‹ν•˜λŠ” 원리λ₯Ό 읡힐 수 μžˆλ„λ‘ ν•œλ‹€.
μ•½κ°„μ˜ λ¬Έμ œκ°€ μ‘΄μž¬ν•˜μ§€λ§Œ, ν•™μŠ΅ λ°μ΄ν„°λ§Œ μΆ©λΆ„ν•˜λ‹€λ©΄ 토이 챗봇을 λ§Œλ“œλŠ” λ°μ—λŠ” 무리가 μ—†λ‹€κ³  ν•œλ‹€!

개체λͺ… μΈμ‹œκΈ° λͺ¨λΈμ„ λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € BIO ν‘œκΈ°λ²•μ„ μ•Œμ•„μ•Ό ν•œλ‹€.

BIO ν‘œκΈ°λ²•μ΄λž€, β€œBeginning Inside, Outsideβ€μ˜ μ•½μžλ‘œ, 각 ν† ν°λ§ˆλ‹€ νƒœκ·Έλ₯Ό 뢙이기 μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
BλŠ” 개체λͺ…이 μ‹œμž‘λ˜λŠ” 단어에 B-개체λͺ…μœΌλ‘œ νƒœκ·Έλ˜λ©°, IλŠ” B-개체λͺ…κ³Ό μ—°κ²°λ˜λŠ” 단어일 λ•Œ I-개체λͺ…μœΌλ‘œ νƒœκ·Έλœλ‹€.
OλŠ” 개체λͺ… μ΄μ™Έμ˜ λͺ¨λ“  토큰에 νƒœκ·Έλœλ‹€.

[μ˜ˆμ‹œ]

μ˜€λŠ˜λΆ€ν„° 샀닐 길동은 μ‚Όμ„±μ „μžμ— κ·Όλ¬΄ν•©λ‹ˆλ‹€.  

였늘 / B-Date  
λΆ€ν„° / O  
  
샀닐 / B-Person  
길동 / I-Person
은 / O  
  
μ‚Όμ„± / B-Company  
μ „μž / I-Company  
에 / O  
  
근무 / O  
ν•©λ‹ˆλ‹€ / O

μœ„μ˜ μ˜ˆμ‹œμ™€ 같이 두 개 μ΄μƒμ˜ 토큰이 ν•˜λ‚˜μ˜ 개체λ₯Ό κ΅¬μ„±ν•˜λŠ” κ²½μš°κ°€ 많기 λ•Œλ¬Έμ— BIO ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•˜λŠ” 것이닀.

7μž₯. 챗봇 ν•™μŠ΅ 툴 λ§Œλ“€κΈ°

7.1 MySQL

MySQL은 κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” μ˜€ν”ˆμ†ŒμŠ€ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ 관리 μ‹œμŠ€ν…œ (RDBMS)이닀.
νŒŒμ΄μ¬μ„ ν¬ν•¨ν•œ λ‹€μ–‘ν•œ μ–Έμ–΄μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ APIλ₯Ό μ§€μ›ν•˜κ³  μžˆλ‹€.

7.2 파이썬으둜 λ°μ΄ν„°λ² μ΄μŠ€ μ—°λ™ν•˜κΈ°

νŒŒμ΄μ¬μ—μ„œ mysql을 μ΄μš©ν•˜λ €λ©΄ mysql ν΄λΌμ΄μ–ΈνŠΈ 라이브러리λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
ν•˜μ§€λ§Œ μ €μˆ˜μ€€ API둜 λ˜μ–΄μžˆμ–΄ μ§μ ‘μ μœΌλ‘œ μ‚¬μš©ν•˜κΈ°μ—” μ–΄λ €μšΈ μˆ˜λ„β€¦
ν•˜μ§€λ§Œ, κ³ μˆ˜μ€€ APIλ₯Ό μ§€μ›ν•˜κ³  있으며, 무료둜 μ‚¬μš©μ΄ κ°€λŠ₯ν•œ PyMySQLλͺ¨λ“ˆμ΄ μžˆλ‹€!

μ•„λž˜μ˜ μ½”λ“œλ‘œ λͺ¨λ“ˆ 뢈러였기

import pymysql

7.2.1 λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°ν•˜κΈ°

데이터 μ‘°μž‘μ„ μœ„ν•΄μ„œλŠ” 제일 λ¨Όμ € MySQL 호슀트 DBμ„œλ²„μ— 연결이 λ˜μ–΄μžˆμ–΄μ•Ό ν•œλ‹€.

db = pymysql.connect(
    host='127.0.0.1', 
    user='homestead', 
    passwd='secret', 
    db='homestead', 
    charset='utf8'
)

host: λ°μ΄ν„°λ² μž‡ μ„œλ²„κ°€ μ‘΄μž¬ν•˜λŠ” 호슀트 μ£Όμ†Œ
user: λ°μ΄ν„°λ² μ΄μŠ€ 둜그인 μœ μ €
passwd: λ°μ΄ν„°λ² μ΄μŠ€ 둜그인 νŒ¨μŠ€μ›Œλ“œ
db: λ°μ΄ν„°λ² μ΄μŠ€ 이름
charset: λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‚¬μš©ν•  charset 인코딩

7.2.2 데이터 μ‘°μž‘ν•˜κΈ°

데이터 μ‘°μž‘ 방법은 DBν…Œμ΄λΈ” 생성, 데이터 μ‚½μž…(INSERT), 쑰회(SELCET), λ³€κ²½(UPDATE), μ‚­μ œ(DELETE) 등이 μžˆλ‹€.

파이썬 μ½”λ“œμ— SQL문을 집어넣어 λ™μž‘μ‹œν‚€λ €λ©΄ μ•„λž˜μ™€ 같은 λ°©μ‹μœΌλ‘œ ν•΄λ³΄μžμš”.

sql = '''
    CREATE TABLE tb_student (
        id int primary key auto_increment not null,
        name varchar(32),
        age int,
        address varchar(32)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    '''

7.3 챗봇 ν•™μŠ΅νˆ΄ λ§Œλ“€κΈ°

ν•™μŠ΅ 데이터λ₯Ό DB에 μ €μž₯ν–ˆμ„ λ•Œ μ‹€μ‹œκ°„μœΌλ‘œ 챗봇 μ‹œμŠ€ν…œμ— 적용될 수 μžˆλ„λ‘ μ œμž‘ν•˜λŠ” 것이 이번 λͺ©ν‘œ!
λ”₯λŸ¬λ‹ λͺ¨λΈμ˜ ν•™μŠ΅ λ°μ΄ν„°μ…‹κ³ΌλŠ” κ°œλ…μ΄ 쑰금 λ‹€λ₯΄λ‹€.
챗봇 μ—”μ§„μ—λŠ” μžμ—°μ–΄ 처리λ₯Ό μœ„ν•œ λ”₯λŸ¬λ‹ λͺ¨λΈμ„ μ‚¬μš©ν•˜λŠ”λ° 이 λ•Œ λͺ¨λΈ ν•™μŠ΅μ„ μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 데이터 μ²˜λ¦¬λŠ” 8μž₯μ—μ„œ λ‹€λ£Έ..

[챗봇 엔진 μž…λ ₯ 처리 κ³Όμ •]

[λ¬Έμž₯] "내일 μ˜€μ „ 10μ‹œμ— νƒ•μˆ˜μœ‘ 주문이 κ°€λŠ₯ν• κΉŒμš”?" ->  
[챗봇엔진] ->  
[엔진 해석 κ²°κ³Ό] 
1. μ˜λ„(Intent): μŒμ‹μ£Όλ¬Έ  
2. 개체λͺ…(Named Entity): 내일: Date, μ˜€μ „ 10μ‹œ: Time, νƒ•μˆ˜μœ‘: Food  
3. ν‚€μ›Œλ“œ(Keyword): 내일, μ˜€μ „, 10μ‹œ, νƒ•μˆ˜μœ‘, μ£Όλ¬Έ

두 번째 과정은 μ—”μ§„μ—μ„œ ν•΄μ„ν•œ κ²°κ³Όλ₯Ό μ΄μš©ν•΄ ν•™μŠ΅ DB λ‚΄μš©μ„ κ²€μƒ‰ν•œλ‹€.
이 λ•Œ 해석 κ²°κ³Ό(μ˜λ„, 개체λͺ…)에 λ§€μΉ­λ˜λŠ” λ‹΅λ³€ 정보닀 DB에 μ‘΄μž¬ν•˜λ©΄ 데이터λ₯Ό λΆˆλŸ¬μ™€ μ‚¬μš©μžμ—κ²Œ λ‹΅λ³€μœΌλ‘œ 제곡.
[챗봇 엔진 λ‹΅λ³€ 처리 κ³Όμ •]

[챗봇엔진] λ‹΅λ³€ 검색(μ˜λ„, 개체λͺ…) ->  
[ν•™μŠ΅ DB] κ²€μƒ‰λœ λ‹΅λ³€ 데이터 ->  
[λ‹΅λ³€μΆœλ ₯] "μ£Όλ¬Έν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€."

7.3.1 ν”„λ‘œμ νŠΈ ꡬ쑰

chatbot - train_tools : 챗봇 ν•™μŠ΅ 툴 κ΄€λ ¨ 파일
- models : 챗봇 μ—”μ§„μ—μ„œ μ‚¬μš©ν•˜λŠ” λ”₯λŸ¬λ‹ λͺ¨λΈ κ΄€λ ¨ 파일 - intent : μ˜λ„ λΆ„λ₯˜ λͺ¨λΈ κ΄€λ ¨ 파일 - ner : 개체 인식 λͺ¨λΈ κ΄€λ ¨ 파일 - utils : 챗봇 κ°œλ°œμ— ν•„μš”ν•œ μœ ν‹Έλ¦¬ν‹° 라이브러리 - config : 챗봇 κ°œλ°œμ— ν•„μš”ν•œ μ„€μ • - test : 챗봇 κ°œλ°œμ— ν•„μš”ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ

OpenPyXLλͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄ μ—‘μ…€ νŒŒμΌμ„ 읽어와 DB에 데이터λ₯Ό μ €μž₯ν•  수 μžˆλ‹€.

    # ν•™μŠ΅ μ—‘μ…€ 파일 뢈러였기
    wb = openpyxl.load_workbook(train_file)
    sheet = wb['Sheet1']
    for now in sheet.iter_rows(min_row=2):
        # 데이터 μ €μž₯
        insert_data(db, xls_row=)

    wb.close()

7.3.2 λ‹Ήν™©μŠ€λŸ¬μš΄ 였λ₯˜

μ—¬κΈ°κΉŒμ§€ ν”„λ‘œμ νŠΈμ˜ ꡬ쑰와 νŒŒμΌλ“€μ„ μž‘μ„±ν•˜λ©΄μ„œ 였λ₯˜κ°€ λ°œμƒν–ˆλ‹€β€¦
파이썬의 κΈ°μ΄ˆκ°€ 닀져지지 μ•Šμ•˜λ‹€λŠ” λœ»μΈκ°€..?
였λ₯˜λ₯Ό λͺ¨λ₯΄κ² λ‹€γ…œγ…œ

[파일 경둜 였λ₯˜]

from config.DatabaseConfig import *

μ—¬κΈ°μ„œ config.Databaseκ°€ 였λ₯˜κ°€ λ‚˜λŠ”λ°, configμ—λ§Œ λΉ¨κ°„ 밑쀄이 쳐진닀.
싀행해보면, No module named β€˜configβ€™μ˜ 였λ₯˜ μ½”λ“œκ°€ λ‚˜μ˜΄..
pip install configλ₯Ό ν•˜λΌκ³  ν•˜μ§€λ§Œ 해도 μ•ˆλ¨..

λ‚΄ ν”„λ‘œμ νŠΈ κ΅¬μ‘°λŠ”

chatbot
    - ch01 ~ ch12
    - chatbot
        - config
        - models
        - test
        - train_tools
        - utils

해결해버렸닀!
pip install configκ°€ μ•„λ‹ˆκ³ ! 경둜 λ¬Έμ œμ˜€λ‹€β€¦
λ‚΄ ν”„λ‘œμ νŠΈ κ΅¬μ‘°λŠ” chatbotμ΄λΌλŠ” μ΅œμƒμœ„ 폴더 μ•„λž˜μ— chatbot폴더가 또 ν•˜λ‚˜ μžˆμ—ˆκ³  이 폴더에 챗봇 ν”„λ‘œμ νŠΈ μ½”λ“œκ°€ λ“€μ–΄μžˆλ‹€.
κ·ΈλŸ¬λ‹ˆκΉŒ! importν•˜λ €λ©΄ from chatbot.config.DatabaseConfig import *처럼 ν•΄μ•Όν•œλ‹€.. γ…Ž.γ…Ž 파이썬 기초 ν™”μ΄νŒ…!

8μž₯. 챗봇 엔진 λ§Œλ“€κΈ°

8.1 챗봇 μ—”μ§„μ΄λž€

μ±—λ΄‡μ΄λž€ μ±„νŒ… ν•˜λŠ” λ΄‡μ΄λΌλŠ” λœ»μ΄λ‹€.
그러면 챗봇 μ—”μ§„μ΄λž€ 뭘까?
챗봇 엔진은 μ±—λ΄‡μ—μ„œ 핡심 κΈ°λŠ₯을 ν•˜λŠ” λͺ¨λ“ˆμ΄λ©°, ν™”μžμ˜ μ§ˆλ¬Έμ„ μ΄ν•΄ν•˜κ³  μ•Œλ§žμ€ 닡변을 좜λ ₯ν•˜λŠ” 역할을 ν•œλ‹€.

ν•œ λ§ˆλ””λ‘œ μžμ—°μ–΄ 처리 λͺ¨λ“ˆμ΄λΌκ³  ν•œλ‹€.

8.2 챗봇 엔진 ꡬ쑰

챗봇을 μ„€κ³„ν•˜κΈ° 전에 λ‚΄κ°€ λ§Œλ“€κ³ μž ν•˜λŠ” μ±—λ΄‡μ˜ λͺ©μ κ³Ό μ–΄λ–€ 도메인 지식을 κ°€μ§€λŠ” 챗봇을 λ§Œλ“€ 것인지 κ²°μ •ν•΄μ•Ό ν•œλ‹€.
그에 따라 챗봇 엔진 개발 방법둠과 ν•™μŠ΅μ— ν•„μš”ν•œ 데이터셋이 달라지기 λ•Œλ¬Έμ— 맀우 μ€‘μš”ν•œ 과정이닀!!

이 μ±…μ—μ„œ λ§Œλ“œλŠ” 챗봇은 토이 μˆ˜μ€€μ˜ 챗봇이며, 이 챗봇 엔진은 토이 μˆ˜μ€€μ΄κΈ° λ•Œλ¬Έμ— 크게 5κ°€μ§€μ˜ κΈ°λŠ₯을 ν•œλ‹€.

[κΈ°λŠ₯]

핡심 κΈ°λŠ₯ μ„€λͺ…
질문 μ˜λ„ λΆ„λ₯˜ ν™”μžμ˜ 질문 μ˜λ„λ₯Ό νŒŒμ•…ν•¨. μ˜λ„ λΆ„λ₯˜ λͺ¨λΈμ„ μ΄μš©ν•΄ μ˜λ„ 클래슀λ₯Ό μ˜ˆμΈ‘ν•˜λŠ” 문제.
개체λͺ… 인식 ν™”μžμ˜ μ§ˆλ¬Έμ—μ„œ 단어 토큰별 개체λͺ…을 인식함. 단어 토큰에 λ§žλŠ” 개체λͺ…을 μ˜ˆμΈ‘ν•˜λŠ” 문제.
핡심 ν‚€μ›Œλ“œ μΆ”μΆœ ν™”μžμ˜ 질문 μ˜λ―Έμ—μ„œ 핡심이 될 λ§Œν•œ 단어 토큰을 μΆ”μΆœ. ν˜•νƒœμ†Œ 뢄석기λ₯Ό μ΄μš©ν•΄ 핡심 ν‚€μ›Œλ“œκ°€ λ˜λŠ” λͺ…μ‚¬λ‚˜ 동사λ₯Ό μΆ”μΆœ.
λ‹΅λ³€ 검색 ν•΄λ‹Ή 질문의 μ˜λ„, 개체λͺ…, 핡심 ν‚€μ›Œλ“œ 등을 기반으둜 닡변을 ν•™μŠ΅ DBμ—μ„œ 검색.
μ†ŒμΌ“ μ„œλ²„ λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ 챗봇 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μš”μ²­ν•˜λŠ” μ§ˆλ¬Έμ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ†ŒμΌ“ μ„œλ²„ ν”„λ‘œκ·Έλž¨ μ—­ν• . (챗봇 엔진 μ„œλ²„ ν”„λ‘œκ·Έλž¨)

[챗봇 엔진 처리 κ³Όμ •]

[질문]  
"내일 μ˜€μ „ 10μ‹œμ— νƒ•μˆ˜μœ‘ μ£Όλ¬Έν•˜κ³  μ‹Άμ–΄" -> 챗봇 엔진  

[챗봇 엔진]  
1. μ „μ²˜λ¦¬ κ³Όμ • - λΆˆμš©μ–΄ 제거, 토큰 뢄리(ν‚€μ›Œλ“œ μΆ”μΆœ) ->  
2. μ˜λ„ 뢄석 - μ˜λ„: μŒμ‹ μ£Όλ¬Έ -> 
3. 개체λͺ… 인식 - 내일: Data, μ˜€μ „ 10μ‹œ: Time, νƒ•μˆ˜μœ‘: Food -> 
4. λ‹΅λ³€ 검색 - (μ˜λ„, 개체λͺ…, ν‚€μ›Œλ“œ) -> 
5. ν•™μŠ΅ DB - DBμ—μ„œ μ μ ˆν•œ λ‹΅λ³€ 탐색 -> 
6. λ‹΅λ³€ 좜λ ₯ -> 좜λ ₯

[λ‹΅λ³€]  
"μ£Όλ¬Έν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€."

ν™”μžμ˜ 질의 λ¬Έμž₯이 μž…λ ₯되면 챗봇 엔진은 제일 λ¨Όμ € μ „μ²˜λ¦¬λ₯Ό μ§„ν–‰ν•œλ‹€.
ν˜•νƒœμ†Œ 뢄석기λ₯Ό μ΄μš©ν•΄ 단어 토큰(ν‚€μ›Œλ“œ)을 μΆ”μΆœν•œ λ’€ λͺ…μ‚¬λ‚˜ 동사 λ“± ν•„μš”ν•œ ν’ˆμ‚¬λ§Œ 남기고 λΆˆμš©μ–΄λŠ” μ œκ±°ν•œλ‹€.
μ—¬κΈ°μ„œ, λΆˆμš©μ–΄(Stopword)λž€ μ–Έμ–΄ λΆ„[μ„μ‹œ μ˜λ―Έκ°€ μžˆλŠ” 단어와 μ˜λ―Έκ°€ μ—†λŠ” λ‹¨μ–΄λ‚˜ 쑰사 등이 μžˆλŠ”λ°, κ·Έ μ€‘μ—μ„œ μ˜λ―Έκ°€ μ—†λŠ” 것을 λΆˆμš©μ–΄λΌκ³  ν•œλ‹€.
κ·Έ λ‹€μŒ μ˜λ„ 뢄석과 개체λͺ… 인식을 μ™„λ£Œν•œ ν›„ 결과값을 μ΄μš©ν•΄ μ μ ˆν•œ 닡변을 ν•™μŠ΅ DBμ—μ„œ 검색해 ν™”μžμ—κ²Œ 닡변을 좜λ ₯함.

ν•΄λ‹Ή 챗봇 μ—”μ§„μ—λŠ” μžμ—°μ–΄ 처리λ₯Ό μœ„ν•΄ 2가지 λ”₯λŸ¬λ‹ λͺ¨λΈ(μ˜λ„ 뢄석, 개체λͺ… 인식)을 μ‚¬μš©ν•œλ‹€.
ν•΄λ‹Ή 도메인 지식에 λ§žλŠ” λ”₯λŸ¬λ‹ λͺ¨λΈ ν•™μŠ΅ 데이터셋을 많이 λ³΄μœ ν•˜κ³  μžˆλ‹€λ©΄ μ„±λŠ₯이 μš°μˆ˜ν•œ 챗봇 엔진 κ°œλ°œμ— 도움이 λœλ‹€!
μ„±λŠ₯은 ν΄λΌμ΄μ–ΈνŠΈμ˜ μ§ˆλ¬Έμ— λŒ€ν•œ λ‹΅λ³€μ˜ 속도, μ§ˆλ¬Έμ— μ–Όλ§ˆλ‚˜ μ μ ˆν•œ 닡변을 좜λ ₯ν•˜λŠ”κ°€ 등… 이 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

8.3 μ „μ²˜λ¦¬ κ³Όμ •

μ±—λ΄‡μ—μ„œ μžμ—°μ–΄λ₯Ό μ²˜λ¦¬ν•  λ•Œ κ°€μž₯ λ¨Όμ € μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” κΈ°λ³Έ 과정인 μ „μ²˜λ¦¬ 과정은 μ–΄λ–»κ²Œ 될까?
μ „μ²˜λ¦¬λ₯Ό μ–΄λ–»κ²Œ ν•˜λŠλƒμ— 따라 ν›„μ²˜λ¦¬ λΆ€λΆ„μ˜ μ„±λŠ₯ 차이가 μ»€μ§€λ―€λ‘œ 맀우 μ€‘μš”ν•˜λ‹€κ³  ν•œλ‹€!

이 μ±…μ—μ„œ λ§Œλ“œλŠ” 챗봇 엔진 μ „μ²˜λ¦¬ 과정은 1) ν˜•νƒœμ†Œ λΆ„μ„κΈ°λ‘œ ν† ν¬λ‚˜μ΄μ§•ν•˜κ³ , 2) λ¬Έμž₯ 해석에 의미 μžˆλŠ” μ •λ³΄λ§Œ 남기고, 3) λ‚˜λ¨Έμ§€ λΆˆμš©μ–΄λ“€μ€ μ œκ±°ν•˜λŠ” μž‘μ—…μ„ ν•œλ‹€.

μ „μ²˜λ¦¬ 과정을 λ‹΄λ‹Ήν•˜λŠ” λͺ¨λ“ˆμ€ μœ ν‹Έλ¦¬ν‹° 라이브러리이기 λ•Œλ¬Έμ— /utils 내에 μƒμ„±ν•œλ‹€.

8.4 단어 사전 ꡬ좕 및 μ‹œν€€μŠ€ 생성

챗봇 μ—”μ§„μ—μ„œ μ˜λ„ λΆ„λ₯˜ 및 개체λͺ… 인식 λͺ¨λΈμ˜ ν•™μŠ΅μ„ ν•˜λ €λ©΄ 단어 사전을 ꡬ좕해야 ν•œλ‹€.
corpus.txt와 create_dict.pyλŠ” /train_tools/dict/ 에 μƒμ„±ν•œλ‹€.

8.5 μ˜λ„ λΆ„λ₯˜ λͺ¨λΈ

챗봇 엔진에 ν™”μžμ˜ μ§ˆμ˜κ°€ μž…λ ₯λ˜μ—ˆμ„ λ•Œ μ „μ²˜λ¦¬ 과정을 거친 ν›„ ν•΄λ‹Ή λ¬Έμž₯의 μ˜λ„λ₯Ό λΆ„λ₯˜ν•œλ‹€.
이 λ•Œ λ¬Έμž₯을 μ˜λ„ 클래슀 λ³„λ‘œ λΆ„λ₯˜ν•˜κΈ° μœ„ν•΄ CNNλͺ¨λΈμ„ μ‚¬μš©ν•¨!

[챗봇 μ—”μ§„μ˜ μ˜λ„ λΆ„λ₯˜ 클래슀 μ’…λ₯˜]

μ˜λ„λͺ… λΆ„λ₯˜ 클래슀 μ„€λͺ…
인사 0 ν…μŠ€νŠΈκ°€ 인사말인 경우
μš•μ„€ 1 ν…μŠ€νŠΈκ°€ μš•μ„€μΈ 경우
μ£Όλ¬Έ 2 ν…μŠ€νŠΈκ°€ μ£Όλ¬Έ κ΄€λ ¨ λ‚΄μš©μΈ 경우
μ˜ˆμ•½ 3 ν…μŠ€νŠΈκ°€ μ˜ˆμ•½ κ΄€λ ¨ λ‚΄μš©μΈ 경우
기타 4 μ–΄λ–€ μ˜λ„μ—λ„ ν¬ν•¨λ˜μ§€ μ•ŠλŠ” 경우

/config μ•ˆμ— GlobalParams.py νŒŒμΌμ„ 생성함.

8.5.1 μ˜λ„ λΆ„λ₯˜ λͺ¨λΈ ν•™μŠ΅

/models/intent 디렉토리에 total_train_data.csv νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°μ…‹μœΌλ‘œ μ‚¬μš©ν•¨.
같은 μœ„μΉ˜μ— train_model.pyνŒŒμΌμ„ 생성함.

8.5.2 μ˜λ„ λΆ„λ₯˜ λͺ¨λ“ˆ 생성

챗봇 μ—”μ§„μ˜ μ˜λ„ λΆ„λ₯˜ λͺ¨λ“ˆμ„ λ§Œλ“€μ–΄λ³΄μž.
이 λͺ¨λ“ˆμ€ μ˜λ„ λΆ„λ₯˜ λͺ¨λΈ νŒŒμΌμ„ ν™œμš©ν•΄ μž…λ ₯λ˜λŠ” ν…μŠ€νŠΈμ˜ μ˜λ„ 클래슀λ₯Ό μ˜ˆμΈ‘ν•˜λŠ” κΈ°λŠ₯을 가지고 μžˆλ‹€.

ν•΄λ‹Ή λͺ¨λ“ˆμ€ λ”₯λŸ¬λ‹ λͺ¨λΈμ΄λ―€λ‘œ models/intent 내에 IntentModel.pyνŒŒμΌμ„ μƒμ„±ν•œλ‹€.
λ‹€μŒμœΌλ‘œ IntentModel 클래슀λ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€.
IntentModel 객체λ₯Ό 생성해 μƒˆλ‘œμš΄ μœ ν˜•μ˜ λ¬Έμž₯을 λΆ„λ₯˜ν•œλ‹€.
ν…ŒμŠ€νŠΈ μ½”λ“œμ΄λ―€λ‘œ, /test μ•„λž˜μ— model_intent_test.pyνŒŒμΌμ„ μƒμ„±ν•œλ‹€.

8.6 개체λͺ… 인식 λͺ¨λΈ ν•™μŠ΅

챗봇 엔진에 μž…λ ₯된 λ¬Έμž₯의 μ˜λ„κ°€ λΆ„λ₯˜λœ ν›„ λ¬Έμž₯ λ‚΄ 개체λͺ… 인식(NER)을 μ§„ν–‰ν•œλ‹€.
개체λͺ… 인식을 μœ„ν•΄ μ–‘λ°©ν–₯ LSTMλͺ¨λΈμ„ μ‚¬μš©ν•œλ‹€.

[개체λͺ… μ’…λ₯˜]

개체λͺ… μ„€λͺ…
B_FOOD μŒμ‹
B_DT, B_TI λ‚ μ§œ, μ‹œκ°„
B_PS μ‚¬λžŒ
B_OG 쑰직, νšŒμ‚¬
B_LC 지역

8.6.1 개체λͺ… 인식 λͺ¨λΈ ν•™μŠ΅

/models/ner λ””λ ‰ν† λ¦¬μ˜ ner_train.txtνŒŒμΌμ„ ν•™μŠ΅λ°μ΄ν„° μ…‹μœΌλ‘œ μ‚¬μš©ν•œλ‹€.
같은 κ²½λ‘œμ— train_model.pyνŒŒμΌμ„ μƒμ„±ν•œλ‹€.
이 νŒŒμΌμ€ ner_train.txtνŒŒμΌμ„ 읽어와 NER(개체λͺ… 인식) λͺ¨λΈμ„ μƒμ„±ν•˜κ³  ν•™μŠ΅ν•˜λŠ” μ½”λ“œμž„.

8.6.2 개체λͺ… 인식 λͺ¨λ“ˆ 생성

챗봇 μ—”μ§„μ˜ 개체λͺ… 인식 λͺ¨λ“ˆμ„ λ§Œλ“€μ–΄λ³΄μž.
이 λͺ¨λ“ˆμ€ 개체λͺ… 인식 λͺ¨λΈ νŒŒμΌμ„ ν™œμš©ν•΄ μž…λ ₯ν•œ λ¬Έμž₯ λ‚΄λΆ€μ˜ 개체λͺ…을 μΈμ‹ν•œλ‹€.
이 λͺ¨λ“ˆμ€ λ”₯λŸ¬λ‹ λͺ¨λΈμ΄λ―€λ‘œ /models/ner μ•„λž˜μ— NerModel.pyνŒŒμΌμ„ μƒμ„±ν•œλ‹€.

8.7 λ‹΅λ³€ 검색

ν™”μžλ‘œλΆ€ν„° μž…λ ₯된 λ¬Έμž₯이 μ „μ²˜λ¦¬, μ˜λ„ λΆ„λ₯˜, 개체λͺ… 인식 과정을 거쳐 ν•΄μ„λœ 데이터λ₯Ό 기반으둜 μ μ ˆν•œ 닡변을 ν•™μŠ΅ DBλ‘œλΆ€ν„° κ²€μƒ‰ν•˜λŠ” 방법을 닀룬닀.
챗봇 엔진이 μžμ—°μ–΄ 차리λ₯Ό 톡해 ν•΄μ„ν•œ λ¬Έμž₯을 ν† λŒ€λ‘œ μœ μ‚¬ν•œ 닡변을 κ²€μƒ‰ν•˜λŠ” 일은 맀우 μ€‘μš”ν•˜λ‹€.

8.7.1 λ°μ΄ν„°λ² μ΄μŠ€ μ œμ–΄ λͺ¨λ“ˆ 생성

/utils μ•„λž˜μ— Database.pyνŒŒμΌμ„ μƒμ„±ν•œλ‹€.

8.7.2 λ‹΅λ³€ 검색 λͺ¨λ“ˆ 생성

챗봇 엔진은 μž…λ ₯λ˜λŠ” λ¬Έμž₯을 μ „μ²˜λ¦¬, μ˜λ„ λΆ„λ₯˜, 개체λͺ… 인식 과정을 κ±°μ³μ„œ λ‚˜μ˜¨ μžμ—°μ–΄ 해석 κ²°κ³Όλ₯Ό μ΄μš©ν•΄ ν•™μŠ΅ DBμ—μ„œ μ μ ˆν•œ 닡변을 κ²€μƒ‰ν•œλ‹€.
/utils μ•„λž˜μ— FindAnswer.py νŒŒμΌμ„ μƒμ„±ν•˜μž.

8.8 챗봇 엔진 μ„œλ²„ 개발

이 μ±…μ—μ„œ λͺ©ν‘œλ‘œ ν•˜λŠ” 챗봇 엔진은 λ‹€μ–‘ν•œ ν”Œλž«νΌμ—μ„œ μ–Έμ œλ“  μ ‘μ†ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„œλ²„μš© ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ œμž‘ν•˜λŠ” 것이닀.
핡심 κΈ°λŠ₯은 μ•žμ„œ κ΅¬ν˜„ν•œ 뢀뢄을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ©°, 이 λ²ˆμ—λŠ” μ„œλ²„ 톡신을 μœ„ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•  κ²ƒμž„!

챗봇듀이 챗봇 엔진 μ„œλ²„μ™€ TCP/IPλ°©μ‹μœΌλ‘œ 톡신할 κ²ƒμž„!

8.8.1 톡신 ν”„λ‘œν† μ½œ μ •μ˜

μ΅œκ·Όμ—λŠ” μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ 톡신을 JSON λ¬Έμžμ—΄ν˜•νƒœλ‘œ 많이 ν•œλ‹€κ³  ν•œλ‹€.
JSON은 KEY:VALUE의 ν˜•μ‹μœΌλ‘œ 이루어진 데이터 객체λ₯Ό μ „λ‹¬ν•˜κΈ° μœ„ν•΄ 인간이 읽을 수 μžˆλŠ” ν…μŠ€νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” κ°œλ°©ν˜• ν‘œμ€€ 포맷이닀.

8.8.2 닀쀑 접속을 μœ„ν•œ TCP μ†ŒμΌ“ μ„œλ²„

μ§€κΈˆκΉŒμ§€λŠ” μ‹±κΈ€ μŠ€λ ˆλ“œμ˜ λ°©μ‹μ΄μ—ˆλ‹€..
μ‹±κΈ€ μŠ€λ ˆλ“œλŠ” λ‹€μˆ˜μ˜ 챗봇 ν΄λΌμ΄μ–ΈνŠΈ μ„œλΉ„μŠ€ μš”μ²­μ„ ν•œ λ²ˆμ— μ²˜λ¦¬ν•  수 μ—†λ‹€.
이미 λ‹€λ₯Έ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλΉ„μŠ€λ₯Ό λ°›κ³  있으면 챗봇 μ—”μ§„μ˜ 응닡을 받지 λͺ»ν•˜κΈ° λ•Œλ¬Έβ€¦

이럴 λ•Œ ν•„μš”ν•œ 것이 λ°”λ‘œ λ©€ν‹° μŠ€λ ˆλ“œλ°©μ‹μ΄λ‹€.
이 λ°©μ‹μœΌλ‘œ 챗봇 엔진 μ„œλ²„λ₯Ό λ§Œλ“€κ²Œ 되면 닀쀑 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλΉ„μŠ€λ₯Ό 받을 수 μžˆλ‹€!

/utils μ•„λž˜μ— BotServer.pyνŒŒμΌμ„ μƒμ„±ν•˜μž.
루트 디렉토리 μ—λŠ” ν΄λΌμ΄μ–ΈνŠΈ 파일인 bot.pyνŒŒμΌμ„ μƒμ„±ν•œλ‹€.

8.8.3 챗봇 ν…ŒμŠ€νŠΈ ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œκ·Έλž¨

/test 아라에 chatbot_client_test.pyνŒŒμΌμ„ μƒμ„±ν•œλ‹€.

9μž₯. 챗봇 API λ§Œλ“€κΈ°

9.1 챗봇 API

8μž₯μ—μ„œ λ§Œλ“  챗봇 엔진 μ„œλ²„μ™€ 직접 톡신해 μΉ΄μΉ΄μ˜€ν†‘μ΄λ‚˜ 넀이버톑톑과 같은 λ‹€μ–‘ν•œ λ©”μ‹ μ € ν”Œλž«νΌμ΄ 챗봇 μ—”μ§„μ˜ κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ„λ‘ 챗봇 API μ„œλ²„λ₯Ό λ§Œλ“ λ‹€.

[챗봇 μ‹œμŠ€ν…œ ꡬ쑰]
μΉ΄μΉ΄μ˜€ν†‘ ν˜Ήμ€ 넀이버톑톑 -> 챗봇 API μ„œλ²„ <–> 챗봇 엔진 μ„œλ²„ <–> ν•™μŠ΅ DB μ„œλ²„

파이썬 Flask

REST APIλŠ” μ›Ήμƒμ—μ„œ ν˜ΈμΆœν•  수 μžˆλ„λ‘ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν˜•νƒœλ‘œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.
이 μ±…μ—μ„œλŠ” 파이썬-Flaskλ₯Ό μ‚¬μš©ν•˜μ—¬ λ§Œλ“ λ‹€.
ν•˜λ‚˜μ˜ μ–Έμ–΄λ‘œ 챗봇 엔진과 APIμ„œλ²„λ₯Ό κ΅¬ν˜„ν•˜λ―€λ‘œ, λ‹€λ₯Έ μ–Έμ–΄λ₯Ό λ°°μš°λŠ” κ³Όμ •μ—μ„œ μ˜€λŠ” λΉ„μš©μ„ 쀄일 수 있기 λ•Œλ¬Έμ΄λ‹€!

9.2.1 Hello Flask

9.2.2 URI 동적 λ³€μˆ˜

REST APIλŠ” HTTP λ©”μ„œλ“œ(GET, POST, DELETE, PUT)에 따라 URIλ₯Ό ν˜ΈμΆœν•œλ‹€.
이 λ•Œ ν•„μš”ν•œ κΈ°λŠ₯에 따라 URI에 λ™μ μœΌλ‘œ λ³€μˆ˜κ°€ λ“€μ–΄κ°ˆ μˆ˜λ„ μžˆλ‹€.

9.2.3 기본적인 REST API μ„œλΉ„μŠ€ κ΅¬ν˜„

REST APIλŠ” HTTP λ©”μ„œλ“œ(GET, POST, DELETE, PUT)에 따라 URIλ₯Ό ν˜ΈμΆœν•œλ‹€. 이 μ ˆμ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° μš”μ²­μ΄ 듀어왔을 λ•Œ HTTP λ§€μ„œλ“œλ³„λ‘œ λ·° ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 방법을 μ•Œμ•„λ³΄μž!
이 μ±…μ—μ„œλŠ” 주둜 POST, GET만 닀룬닀고 ν•œλ‹€γ…œγ…œ

[HTTP λ§€μ„œλ“œλ³„ CRUD λ™μž‘ μ„€λͺ…]

HTTP λ©”μ„œλ“œ CRUD λ™μž‘ μ„€λͺ…
POST CREATE μ„œλ²„ λ¦¬μ†ŒμŠ€λ₯Ό 생성할 λ•Œ μ‚¬μš©
GET READ μ„œλ²„ λ¦¬μ†ŒμŠ€λ₯Ό μ½μ–΄μ˜¬ λ•Œ μ‚¬μš©
PUT UPDATE μ„œλ²„ λ¦¬μ†ŒμŠ€λ₯Ό μˆ˜μ •ν•  λ•Œ μ‚¬μš©
DELETE DELETE μ„œλ²„ λ¦¬μ†ŒμŠ€λ₯Ό μ‚­μ œν•  λ•Œ μ‚¬μš©

β€œμ˜ˆμ œ 9-3”을 μ‹€ν–‰ν•΄ Flask μ„œλ²„λ₯Ό κ΅¬λ™ν•˜κ³  μš°λ¦¬κ°€ μž‘μ„±ν•œ REST APIκ°€ 잘 μž‘λ™ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈκ°€ ν•„μš”ν•˜λ‹€.
λ©”μ„œλ“œκ°€ β€˜GET’인 κ²½μš°μ—λŠ” λΈŒλΌμš°μ € μƒμ—μ„œ ν•΄λ‹Ή μ£Όμ†Œλ‘œ μ ‘μ†ν•˜λ©΄ μž‘λ™ κ²°κ³Όλ₯Ό 확인할 수 μžˆμ§€λ§Œ, β€˜POST’인 κ²½μš°μ—λŠ” λ”°λ‘œ POST 전솑 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“€μ–΄μ•Ό ν…ŒμŠ€νŠΈν•  수 μžˆλ‹€.
μ—¬κΈ°μ„œλŠ” Talend API Test튀울 μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈν•  것이닀.
크둬 λΈŒλΌμš°μ €μ—μ„œ μž‘λ™ν•˜λŠ” 무료 ν™•μž₯ ν”„λ‘œκ·Έλž¨μž„!

9.3 챗봇 API κ΅¬ν˜„

λ‚˜λŠ” μ™œ Talend API Tester둜 POSTμš”μ²­μ„ 보내면 404μ—λŸ¬κ°€ λœ°κΉŒβ€¦
찾아봐야겠닀!

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°