์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ! ์ฐ๋ฆฌ๋ ์์ฐ์ด ์ฒ๋ฆฌ(์์ฐ์ด ์ฒ๋ฆฌ ๋๋ ๋จ์ํ NLP)์ ๊ด๋ จ๋ ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ํ ์์ด์ ํธ(์ฑ๋ด)๋ฅผ ๋ง๋๋ ๋ฐ ์ ๋
ํ๋ ์ผ๋ จ์ ๊ธฐ์ฌ๋ฅผ ์ด๊ณ ์์ต๋๋ค.
NLP ์์
์๋ ํ
์คํธ์ ๊ฐ์ ๊ฒฐ์ , ๋ช
๋ช
๋ ์ํฐํฐ ๊ตฌ๋ฌธ ๋ถ์, ๋ํ ์๋๊ฐ ๋ด์์ ์ํ๋ ๊ฒ ๊ฒฐ์ (ํผ์ ์ฃผ๋ฌธ, ๋ฐฐ๊ฒฝ ์ ๋ณด ์ป๊ธฐ ๋ฑ)์ด ํฌํจ๋ฉ๋๋ค. NLP ์์
๋ฐ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค.
์ด ๊ธฐ์ฌ์์๋ ์ฌ์ ํ๋ จ๋ NLP ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ๊ตฌ์ฑ์ด๋ ํ๋ จ ์์ด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ REST ์๋ฒ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
DeepPavlov ์ค์น
์ฌ๊ธฐ์ ์๋์๋ Linux์ ๋ํ ์ง์นจ์ด ์ ๊ณต๋ฉ๋๋ค. Windows์ ๊ฒฝ์ฐ ๋ค์์ ์ฐธ์กฐํ์ธ์.
- ํ์ฌ ์ง์๋๋ Python ๋ฒ์ ์ผ๋ก ๊ฐ์ ํ๊ฒฝ์ ๋ง๋ค๊ณ ํ์ฑํํฉ๋๋ค.
virtualelnv env -p python3.7 source env/bin/activate
- ๊ฐ์ ํ๊ฒฝ์ DeepPavlov๋ฅผ ์ค์นํฉ๋๋ค.
pip install deeppavlov
DeepPavlov ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ REST ์๋ฒ ์์
์ฒ์์ผ๋ก DeepPavlov ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์๋ฒ๋ฅผ ์์ํ๊ธฐ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํคํ ์ฒ์ ์ผ๋ถ ๊ธฐ๋ฅ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒ์ ๋๋ค.
DP์ ๋ชจ๋ ๋ชจ๋ธ์ ๋ค์์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ํ์ด์ฌ ์ฝ๋;
- ๋ค์ด๋ก๋ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์ - ํน์ ๋ฐ์ดํฐ(์๋ฒ ๋ฉ, ์ ๊ฒฝ๋ง ๊ฐ์ค์น ๋ฑ)์ ๋ํ ์ง๋ ฌํ๋ ํ๋ จ ๊ฒฐ๊ณผ์ ๋๋ค.
- ๋ชจ๋ธ์์ ์ฌ์ฉํ๋ ํด๋์ค, ๋ค์ด๋ก๋ํ ๊ตฌ์ฑ ์์์ URL, Python ์ข ์์ฑ ๋ฑ์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋ ๊ตฌ์ฑ ํ์ผ(์ดํ config)์ ๋๋ค.
๋ค์ ๊ธฐ์ฌ์์ DeepPavlov์ ๋ด๋ถ ๋ด์ฉ์ ๋ํด ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์ง๊ธ์ ์ด๊ฒ๋ง ์๋ฉด ์ถฉ๋ถํฉ๋๋ค.
- DeepPavlov์ ๋ชจ๋ ๋ชจ๋ธ์ ๊ตฌ์ฑ ์ด๋ฆ์ผ๋ก ์๋ณ๋ฉ๋๋ค.
- ๋ชจ๋ธ์ ์คํํ๋ ค๋ฉด DeepPavlov ์๋ฒ์์ ํด๋น ๊ตฌ์ฑ ์์๋ฅผ ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค.
- ๋ํ ๋ชจ๋ธ์ ์คํํ๋ ค๋ฉด ๋ชจ๋ธ์ ์ฌ์ฉ๋๋ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ถ์ํ ์ฒซ ๋ฒ์งธ ๋ชจ๋ธ์ ๋ค๊ตญ์ด NER(Named Entity Recognition)์ ๋๋ค. ์ด ๋ชจ๋ธ์ ํ ์คํธ ๋จ์ด๊ฐ ์ํ ๊ฐ์ฒด์ ์ ํ(๊ณ ์ ๋ช , ์ง๋ช , ํตํ ์ด๋ฆ ๋ฑ)์ ๋ฐ๋ผ ๋ถ๋ฅํฉ๋๋ค. ํ์ฌ ์ต์ ๋ฒ์ ์ NER์ ๋ํ ๊ตฌ์ฑ ์ด๋ฆ:
ner_ontonotes_bert_mult
๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ REST ์๋ฒ๋ฅผ ์์ํฉ๋๋ค.
- ๊ตฌ์ฑ์ ์ง์ ๋ ๋ชจ๋ธ ์ข
์์ฑ์ ํ์ฑ ๊ฐ์ ํ๊ฒฝ์ ์ค์นํฉ๋๋ค.
python -m deeppavlov install ner_ontonotes_bert_mult
- DeepPavlov ์๋ฒ์์ ์ง๋ ฌํ๋ ๋ชจ๋ธ ๊ตฌ์ฑ ์์๋ฅผ ๋ค์ด๋ก๋ํฉ๋๋ค.
python -m deeppavlov download ner_ontonotes_bert_mult
์ง๋ ฌํ๋ ๊ตฌ์ฑ ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์นํ DeepPavlov ํ ๋๋ ํฐ๋ฆฌ์ ๋ค์ด๋ก๋๋ฉ๋๋ค.
~/.deeppavlov
๋ค์ด๋ก๋ํ ๋ ์ด๋ฏธ ๋ค์ด๋ก๋ํ ๊ตฌ์ฑ ์์์ ํด์๋ฅผ ์๋ฒ์ ์๋ ๊ตฌ์ฑ ์์์ ํด์์ ๋น๊ตํ์ฌ ํ์ธํฉ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด ๋ค์ด๋ก๋๋ฅผ ๊ฑด๋๋ฐ๊ณ ๊ธฐ์กด ํ์ผ์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์ด๋ก๋๋ ๊ตฌ์ฑ ์์์ ํฌ๊ธฐ๋ ํ๊ท 0.5~8Gb๊น์ง ๋ค์ํ๋ฉฐ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์์ถ์ ํ๋ฉด 20Gb์ ๋๋ฌํฉ๋๋ค.
- ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ REST ์๋ฒ๋ฅผ ์์ํฉ๋๋ค.
python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
์ด ๋ช ๋ น์ ์คํํ๋ฉด ๋ชจ๋ธ์ด ํฌํจ๋ REST ์๋ฒ๊ฐ ํธ์คํธ ์์คํ ์ ํฌํธ 5005(๊ธฐ๋ณธ ํฌํธ๋ 5000)์์ ์์๋ฉ๋๋ค.
๋ชจ๋ธ์ ์ด๊ธฐํํ ํ API ๋ฌธ์์ ํ
์คํธ ๊ธฐ๋ฅ์ด ํฌํจ๋ Swagger๋ฅผ URL์์ ์ฐพ์ ์ ์์ต๋๋ค. http://127.0.0.1:5005
. ๋ชจ๋ธ์ ์๋ํฌ์ธํธ๋ก ์ ์กํ์ฌ ํ
์คํธํด ๋ณด๊ฒ ์ต๋๋ค. http://127.0.0.1:5005/model
๋ค์ JSON ์ฝํ
์ธ ๊ฐ ํฌํจ๋ POST ์์ฒญ:
{
"x": [
"ะ ะะคะขะ ะผะพะถะฝะพ ะดะพะฑัะฐัััั ะฝะฐ ัะปะตะบััะธัะบะต ั ะกะฐะฒัะปะพะฒัะบะพะณะพ ะะพะบะทะฐะปะฐ.",
"ะ ัะณะพ-ะทะฐะฟะฐะดะฝะพะน ะ ััะธ ััะพะณ ะถะธัะฐ ะพัะตะฝะตะฝ ะฒ 15 ะณัะธะฒะตะฝ"
]
}
์ด์ ๋ํ ์๋ต์ผ๋ก ๋ค์ JSON์ ๋ฐ์์ผ ํฉ๋๋ค.
[
[
["ะ", "ะะคะขะ", "ะผะพะถะฝะพ", "ะดะพะฑัะฐัััั", "ะฝะฐ", "ัะปะตะบััะธัะบะต", "ั", "ะกะฐะฒัะปะพะฒัะบะพะณะพ", "ะะพะบะทะฐะปะฐ", "."],
["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
],
[
["ะ", "ัะณะพ", "-", "ะทะฐะฟะฐะดะฝะพะน", "ะ ััะธ", "ััะพะณ", "ะถะธัะฐ", "ะพัะตะฝะตะฝ", "ะฒ", "15", "ะณัะธะฒะตะฝ"],
["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
]
]
์ด๋ฌํ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ DeepPavlov REST API๋ฅผ ๋ถ์ํฉ๋๋ค.
API ๋ฅํ๋ธ๋กํ
๊ฐ DeepPavlov ๋ชจ๋ธ์๋ ํ๋ ์ด์์ ์
๋ ฅ ์ธ์๊ฐ ์์ต๋๋ค. REST API์์๋ ์ธ์์ ์ด๋ฆ์ด ์ง์ ๋๊ณ ํด๋น ์ด๋ฆ์ ์์ ์ฌ์ ์ ํค์
๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ธ์๋ ์ฒ๋ฆฌํด์ผ ํ๋ ํ
์คํธ์
๋๋ค. ๋ชจ๋ธ์ด ๋ฐํํ๋ ์ธ์์ ๊ฐ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฌธ์์ MODELS ์น์
์์ ํ์ธํ ์ ์์ต๋๋ค.
์์ ์์๋ ๋ ๋ฌธ์์ด์ ๋ชฉ๋ก์ด ์ธ์ x์ ์ ๋ฌ๋์์ผ๋ฉฐ ๊ฐ ๋ฌธ์์ด์๋ ๋ณ๋์ ๋งํฌ์ ์ด ์ ๊ณต๋์์ต๋๋ค. DeepPavlov์์ ๋ชจ๋ ๋ชจ๋ธ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ ๊ฐ ๋ชฉ๋ก(๋ฐฐ์น)์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
๋ฐฐ์น(Batch)๋ผ๋ ์ฉ์ด๋ ๋จธ์ ๋ฌ๋ ๋ถ์ผ๋ฅผ ๋งํ๋ฉฐ, ์๊ณ ๋ฆฌ์ฆ์ด๋ ์ ๊ฒฝ๋ง์์ ๋์์ ์ฒ๋ฆฌ๋๋ ๋ ๋ฆฝ์ ์ธ ์ ๋ ฅ๊ฐ์ ๋ฐฐ์น๋ฅผ ์๋ฏธํ๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ ๋ ฅ์ ๋ณ๋๋ก ์ ๋ฌ๋ ๋์ผํ ๊ฐ์ ๋นํด ๋ชจ๋ธ์ด ๋ฐฐ์น์ ํ ์์๋ฅผ ์ฒ๋ฆฌํ๋ ์๊ฐ์ (์ข ์ข ํฌ๊ฒ) ์ค์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ ๋ชจ๋ ์์๊ฐ ์ฒ๋ฆฌ๋ ํ์๋ง ๋ฐํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์ด์ค๋ ๋ฐฐ์น๋ฅผ ์์ฑํ ๋ ๋ชจ๋ธ์ ์๋์ ๊ฐ ๊ฐ๋ณ ์์์ ํ์ํ ์ฒ๋ฆฌ ์๊ฐ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
DeepPavlov ๋ชจ๋ธ์ ์ฌ๋ฌ ๊ฐ์ ์ธ์๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฐ ์ธ์๋ ์์ฒด ๊ฐ ๋ฐฐ์น๋ฅผ ๋ฐ๊ณ ์ถ๋ ฅ์์ โโ๋ชจ๋ธ์ ํญ์ ํ๋์ ๋ต๋ณ ๋ฐฐ์น๋ฅผ ์์ฑํฉ๋๋ค. ๋๊ฐ๋ ๋ฐฐ์น์ ์์๋ ๋์ผํ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ด์ค๋ ๋ฐฐ์น์ ์์๋ฅผ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ์ ๋๋ค.
์ ์์์ ๋ชจ๋ธ์ ๊ฒฐ๊ณผ๋ ๊ฐ ๋ฌธ์์ด์ ํ ํฐ(๋จ์ด ๋ฐ ๋ฌธ์ฅ ๋ถํธ)์ผ๋ก ๋ถ๋ฅํ๊ณ ํด๋น ๋ฌธ์์ด์ด ๋ํ๋ด๋ ๋ช
๋ช
๋ ์ํฐํฐ(์กฐ์ง ์ด๋ฆ, ํตํ)์ ๊ด๋ จํ์ฌ ํ ํฐ์ ๋ถ๋ฅํ๋ ๊ฒ์ด์์ต๋๋ค. ํ์ฌ ๋ชจ๋ธ์ ner_ontonotes_bert_mult 18๊ฐ์ง ์ ํ์ ๊ฐ์ฒด๋ช
์ ์ธ์ํ ์ ์์ผ๋ฉฐ ์์ธํ ์ค๋ช
์ ํ์ธํ ์ ์์ต๋๋ค.
DeepPavlov์ ๊ธฐํ ๊ธฐ๋ณธ ๋ชจ๋ธ
NER ์ธ์๋ ์ด ๊ธ์ ์ฐ๋ ์์ ์ DeepPavlov์์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฌธ์ ์ง๋ฌธ ๋ต๋ณ
์ด ํ ์คํธ์ ์ผ๋ถ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ์ ๋ํ ์ง๋ฌธ์ ๋ตํ์ญ์์ค. ๋ชจ๋ธ ๊ตฌ์ฑ: squad_ru_bert_infer
์์ฒญ ์์:
{
"context_raw": [
"DeepPavlov ัะฐะทัะฐะฑะฐััะฒะฐะตััั ะปะฐะฑะพัะฐัะพัะธะตะน ะะคะขะ.",
"ะ ัะณะพ-ะทะฐะฟะฐะดะฝะพะน ะ ััะธ ััะพะณ ะถะธัะฐ ะพัะตะฝะตะฝ ะฒ 15 ะณัะธะฒะตะฝ."
],
"question_raw": [
"ะะตะผ ัะฐะทัะฐะฑะฐััะฒะฐะตััั DeepPavlov?",
"ะกะบะพะปัะบะพ ััะพะธะป ััะพะณ ะถะธัะฐ ะฝะฐ ะ ััะธ?"
]
}
๊ฒฐ๊ณผ :
[
["ะปะฐะฑะพัะฐัะพัะธะตะน ะะคะขะ", 27, 31042.484375],
["15 ะณัะธะฒะตะฝ", 39, 1049.598876953125]
]
๋ชจ์๊ฐ์ง
ํ ์คํธ๊ฐ ์ ๋ฌ๋๋ ์ฌ๋์ ๋ํ ๋ชจ์์ ์กด์ฌ ๊ฐ์ง(์์ฑ ๋น์ - ์์ด์๋ง ํด๋น). ๋ชจ๋ธ ๊ตฌ์ฑ: ๋ชจ์_kaggle_conv_bert
์์ฒญ ์์:
{
"x": [
"Money talks, bullshit walks.",
"You are not the brightest one."
]
}
๊ฒฐ๊ณผ :
[
["Not Insult"],
["Insult"]
]
๊ฐ์ ๋ถ์
ํ ์คํธ ๊ฐ์ ๋ถ๋ฅ(๊ธ์ ์ , ์ค๋ฆฝ์ , ๋ถ์ ์ ) ๋ชจ๋ธ ๊ตฌ์ฑ: rusentiment_elmo_twitter_cnn
์์ฒญ ์์:
{
"x": [
"ะะฝะต ะฝัะฐะฒะธััั ะฑะธะฑะปะธะพัะตะบะฐ DeepPavlov.",
"ะฏ ัะปััะฐะป ะพ ะฑะธะฑะปะธะพัะตะบะต DeepPavlov.",
"ะะตะฝั ะฑะตััั ััะพะปะปะธ ะธ ะฐะฝะพะฝะธะผััั."
]
}
๊ฒฐ๊ณผ :
[
["positive"],
["neutral"],
["negative"]
]
์์ญ ๊ฐ์ง
๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ํ ์คํธ๊ฐ ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ๋์ง ํ์ธํฉ๋๋ค. ๋ชจ๋ธ ๊ตฌ์ฑ: ์คํ ๋_์์ญ_๋ฃจ
๋ฌธ์:
{
"text_a": [
"ะะพัะพะด ะฟะพะณััะถะฐะตััั ะฒ ัะพะฝ, ะฟัะพััะฟะฐะตััั ะะฐัะธั.",
"ะัะตะทะธะดะตะฝั ะกะจะ ะฟัะธะณัะพะทะธะป ัะฐััะพัะถะตะฝะธะตะผ ะดะพะณะพะฒะพัะฐ ั ะะตัะผะฐะฝะธะตะน."
],
"text_b": [
"ะะฐัััะฟะฐะตั ะฝะพัั, ะฒัะต ะถะธัะตะปะธ ะณะพัะพะดะฐ ะฟะพัะปะธ ัะฟะฐัั, ะฐ ะฟัะตัััะฟะฝะธะบะธ ะฟัะพัะฝัะปะธัั.",
"ะะตัะผะฐะฝะธั ะฝะต ัะพะฑะธัะฐะตััั ะฟะพะดะดะฐะฒะฐัััั ัะณัะพะทะฐะผ ัะพ ััะพัะพะฝั ะกะจะ."
]
}
๊ฒฐ๊ณผ :
[
[1],
[0]
]
์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ DeepPavlov ๋ชจ๋ธ์ ํ์ฌ ๋ชฉ๋ก์ ์ธ์ ๋ ์ง ์ฐพ์ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์ด ๊ธฐ์ฌ์์ ์ฐ๋ฆฌ๋ DeepPavlov API์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ ํ ์คํธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋ํด ์์๋ดค์ต๋๋ค. ๋ชจ๋ NLP ์์ ์ ๊ฒฝ์ฐ ์์ ์ ์ฃผ์ ์์ญ(๋๋ฉ์ธ)์ ํด๋นํ๋ ๋ฐ์ดํฐ ์ธํธ์์ ๋ชจ๋ธ์ ํ๋ จํ ๋ ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๋ ์ ์ ๋ช ์ฌํด์ผ ํฉ๋๋ค. ๋ํ ์์น์ ์ผ๋ก ๋ ๋ง์ ๋ชจ๋ธ์ ๋ชจ๋ ์ํฉ์ ๋ํด ํ์ต์ํฌ ์๋ ์์ต๋๋ค.
๋ค์ ๊ธฐ์ฌ์์๋ Docker์์ DeepPavlov๋ฅผ ์์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐ ์ค์ ์ ์ดํด๋ณธ ๋ค์ ๋ชจ๋ธ ํ์ต์ผ๋ก ๋์ด๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ DeepPavlov๊ฐ
์ถ์ฒ : habr.com