π[AI] μ±λ΄μ λν΄μβ¦
μ±λ΄μ λν΄μβ¦
μ±λ΄μ μ°λ¦¬κ° νν μκ³ μλ―μ΄ μΈκ³΅μ§λ₯ κΈ°μ μ ν΅ν΄ λνλ₯Ό μ£Όκ³ λ°μ μ μλ νλ‘κ·Έλ¨μ΄λ€.
μ±λ΄μ λν΄ κ³΅λΆνλ©΄μ μκ²λ κ²λ€κ³Ό μ¬μ©λλ κΈ°μ λ€μ λν΄μ μ μ΄λ³ΌκΉ νλ€!
βνλΉλ€νΈμν¬-μ²μ λ°°μ°λ λ₯λ¬λ μ±λ΄βμ ν΅ν΄ 곡λΆν λ΄μ©μ λ°νμΌλ‘ μ±ν° λ³λ‘ μ 리νμ
μ΄μ κ΄λ ¨λ μ½λλ€κ³Ό μ±ν° λ³ λ΄μ©(.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
λͺ
λ Ήμ΄λ‘ μλ ν¨ν€μ§λ€μ μ€μΉν΄λ³΄μ!
- tensorflow
pip install tensorflow==2.1
- konlpy
pip install konlpy
- PyKomoran
pip install PyKomoran
- gensim
pip install gensim
- sklearn
pip install sklearn
- seqeval
pip install seqeval
- PyMySQL
pip install PyMySQL
- openxl
pip install openxl
- pandas, xlrd
pip install pandas, xlrd
- matplotlib
pip install matplotlib
- flask
pip install flask
- 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(βwixi + b)
λ΄λ°μ κ³μ° κ³Όμ μ 보면 μ
λ ₯λ xiκ°λ€κ³Ό λμλλ λ΄λ°μ κ°μ€μΉ wiκ°λ€μ κ°κ° κ³±ν΄μ λͺ¨λ λν΄μ€λ€.
κ·Έλ¦¬κ³ νΈν₯κ° b
λ₯Ό ν΅ν΄ κ²°κ³Όκ°μ μ‘°μ νλ€.
μ΄λ₯Ό μνμ μΌλ‘ νννλ©΄ κ°λ¨ν 1μ°¨ ν¨μμ λͺ¨μμ΄λ€.
y = (w0x0 + w1x1 + w2x2) + b
μ€μ λ΄λ°μ νΉμ κ°λ μ΄μμΌ λλ§ λ€μ λ΄λ°μΌλ‘ μ νΈλ₯Ό μ λ¬νλλ°, μΈκ³΅ μ κ²½λ§μμλ λ΄λ°μ μ²λ¦¬ κ³Όμ μ€ f
λ‘ νμλ μμμ΄λ€.
μ΄λ₯Ό νμ±ν ν¨μ
λΌκ³ νλ©°, κ°μ€μΉ κ³μ° κ²°κ³Όκ° yκ° μ΅μ’
μ μΌλ‘ μ΄λ€ ννμ μΆλ ₯κ°μΌλ‘ λ΄λ³΄λΌμ§ κ²°μ νλ€.
νμ±ν ν¨μλ μ’
λ₯κ° λ§μλ°, μ¬κΈ°μλ 3κ°μ§λ§ λ€λ£¬λ€.
-
μ€ν ν¨μ
μ€ν ν¨μ
λ κ°μ₯ κΈ°λ³Έμ΄ λλ ν¨μμ΄λ€.
κ·Έλνκ°κ³λ¨
κ°μ΄ μ겨μ μ€ν ν¨μμ΄κ³ , μ λ ₯κ°μ΄ 0λ³΄λ€ ν¬λ©΄ 1λ‘, 0 μ΄νμΌ λλ 0μΌλ‘ λ§λ λ€.
μ¦ μ λ ₯κ°μ΄ μμμΌ λλ§ νμ±ν μν¨λ€. -
μκ·Έλͺ¨μ΄λ ν¨μ μ΄μ§ λΆλ₯μμ μ€ν ν¨μμ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ¬μ©νλ€.
μ€ν ν¨μμμ νλ¨μ κΈ°μ€μ΄ λλμκ³μΉ
λΆκ·Όμ λ°μ΄ν°λ₯Ό κ³ λ €νμ§ μλ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ κ³λ¨ λͺ¨μμ μλ§ν ννλ‘ νννλ€.
μμ : S(t) = 1 / (1 + e^-t) -
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.
μ΄ μ€λ₯κ° λ°μνλ μ΄μ λ 컀λμ΄ μ£½μ΄μ
μΈλ°, 컀λμ΄ μ£½λ μ΄μ λ λ©λͺ¨λ¦¬ ν λΉλμ μ΄κ³Ό
νκΈ° λλ¬Έ!
[ν΄κ²°λ°©λ²]
jupyter_notebook_config.py
μμ λ€μ μ½λλ₯Ό μ λ ₯νκ³ μ¬λΆν νκΈ°.- μμ .pyνμΌμ
./jupyter
ν΄λ μμ μμc.NotebookApp.max_buffer_size = 100000000000000000000000
- μμ .pyνμΌμ
μ΄λ κ² ν° κ°μ μ λ ₯ν΄ λ°κΎΈλ©΄ λ¨
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)
κ° μΆκ°λμλ€.
- μ
λ ₯ κ²μ΄νΈ
- νμ¬ μ 보λ₯Ό μΌλ§λ κΈ°μ΅ν μ§ κ²°μ νλ κ²μ΄νΈ
- μμ κ²μ΄νΈ
- μ΄μ μμ μ μ μνκ°μ μμ νκΈ° μν΄ μ¬μ©λλ κ²μ΄νΈ
- μΆλ ₯ κ²μ΄νΈ
- μΆλ ₯ κ²μ΄νΈμ κ²°κ³Όκ°μ νμ¬ μλ μμ μ μλ μνλ₯Ό κ²°μ νλλ° μ¬μ©λλ©°, ν΄λΉ κ°μ μ λ¬λλ λ©λͺ¨λ¦¬ μ
μ΄ λ§μμ§μλ‘ μ 보 μ μ€μ΄ ν¬κΈ° λλ¬Έμ
λ¨κΈ° μν
λΌκ³ λΆλ¦
- μΆλ ₯ κ²μ΄νΈμ κ²°κ³Όκ°μ νμ¬ μλ μμ μ μλ μνλ₯Ό κ²°μ νλλ° μ¬μ©λλ©°, ν΄λΉ κ°μ μ λ¬λλ λ©λͺ¨λ¦¬ μ
μ΄ λ§μμ§μλ‘ μ 보 μ μ€μ΄ ν¬κΈ° λλ¬Έμ
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μλ¬κ° λ°κΉβ¦
μ°Ύμλ΄μΌκ² λ€!
λκΈλ¨κΈ°κΈ°