๋ฐ์ง์ฌ - Project Moogeul
Contents
๋ฐ์ง์ฌ - Project Moogeulยถ
1. ํ๋ก์ ํธ ์์ฝยถ
๋ชฉ์ ยถ
๊ธ์ ๋ดํฌ๋ ๊ฐ์ ์ ์ถ์ถํ๊ณ ๊ทธ ๊ฐ์ ์ ํตํด ๋๋์ ๋ณผ ์ ์๋ ์๋น์ค ์์ฑ
์์ฐ์ด ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์ฌ๋ฌ๊ฐ์ง ํ์คํฌ๋ฅผ ๊ฒฝํํ๊ณ , ๊ทธ ์ค ํด๋น ์๋น์ค์ ์ ์ฉํ ์ ์๋ ๋ถ๋ถ์ ์ ์ฉ
๊ธฐ๋ฅยถ
๊ธ์ ์ฐ๊ณ ์ถ์ดํ๋ ์ฌ๋๋ค์๊ฒ ๊ธ์ ์์ฑํ ์ ์๋ ๊ณต๊ฐ์ ์ ๊ณต
์์ธ์ด ํํธ์ด ์๋ฃ๋๋ฉด, ์์ฑ์์ ๊ฐ์ ์ ๋ถ์ํ๊ณ ๊ทธ ๊ฐ์ ๊ณผ ๊ด๋ จ๋ ๋จ์ด ํต๊ณ๋ฅผ ์ ๊ณต
๊ธฐ๋ํจ๊ณผยถ
์ฌ์ฉ์๋ ์๊ธฐ ์์ ์ ๋จ์ด ์ฌ์ฉ ํํ๋ฅผ ํ์ ํ ์ ์๋ค
์ ์ ๋ณ ๋จ์ด-๊ฐ์ ์ฌ์ฉ ํํ ๋น๊ต๋ฅผ ํตํด ํน์ง์ ์ฐพ์๋ผ ์ ์๋ค
2. ๊ฒฐ๊ณผยถ
Project Moogeul - a Hugging Face Space by seriouspark
์๋น์ค ๊ตฌ์กฐยถ
ํ๋ก์ธ์ค
๋ด์ฉ |
ํ์ ๋ฐ์ดํฐ์ |
ํ์ ๋ชจ๋ธ๋ง |
๊ธฐํ ํ์ํญ๋ชฉ |
---|---|---|---|
1. ๋จ์ด ์ ๋ ฅ ์ ์์ธ์ด 1ํธ์ ์ธ ์ ์๋ โ๊ธ์ฐ๊ธฐโ ๊ณต๊ฐ ์ ๊ณต |
๋ค์ด๋ฒ ํ๊ตญ์ด ์ฌ์ |
- |
streamlit ๋์๋ณด๋ |
2. ์์ธ์ด ๋ด ๋ฌธ์ฅ ๋ถ๋ฅ |
ํ๊ตญ์ด ๊ฐ์ ๋ถ์ ์๋ฃ 58000์ฌ๊ฑด |
xlm-roberta |
- |
3. ๋ฌธ์ฅ ๋ณ ๊ฐ์ ๋ผ๋ฒจ ๋ฐํ |
ํ๊ตญ์ด ๊ฐ์ ๋ถ์ ์๋ฃ 58000์ฌ๊ฑด + ๋ผ๋ฒจ ๋จ์ํ (60๊ฐ โ 6๊ฐ) |
Bert Classifier |
|
4. ๋ฌธ์ฅ ๋ด ๋ช ์ฌ, ํ์ฉ์ฌ๋ฅผ konlpy ํ์ฉํ์ฌ ์ถ์ถ |
ํ๊ตญ์ด ๊ฐ์ ๋ถ์ ์๋ฃ 58000์ฌ๊ฑด |
konlpy Kkma |
huggingface - pos tagger ๊ฒํ |
5. ๋ช ์ฌ, ํ์ฉ์ฌ์ ๊ฐ์ ๋ผ๋ฒจ์ pair ๋ก ๋ง๋ค์ด ๋น๋ ์ง๊ณ |
- |
- |
- |
6. ํด๋น ๋น๋ ๊ธฐ๋ฐ์ ๋ฆฌ๋ทฐ ์ ๊ณต (์ ์ & ์์ธ์ด๋ฆฌ์คํธ ์์ง) |
์นผ๋ผ ์์ง |
||
(์์ , ์ ์ดํ, ๋๋, ์ด ๊ฑด) |
- |
selenium / request / BeutifulSoup |
3. ์๋น์ค ์ฌ์ฉ ํ๋ก์ธ์คยถ
1. ๊ธ์ฐ๊ธฐยถ
๋ค์ด๋ฒ ์ฌ์ ์ผ๋ก๋ถํฐ ๋ฐ์ response ๋ฅผ parsing
์ ์ ๋จ์ด ์ ๋ ฅ โ ์ฌ์ ์ ์ ์ฌ๋จ์ด ๋ฆฌ์คํธ ๋ฐํ
์ฌ์ ์ ์ ์ฌ๋จ์ด ์ ๋ ฅ โ ์ฌ์ ์ ์ ์ฌ๋ป ๋ฆฌ์คํธ ๋ฐํ
2.๊ธ ๋ถ์ํ๊ธฐยถ
QA๋ชจ๋ธ ํ์ฉํด ๋ฌธ์ฅ โ ๊ฐ์ ๊ตฌ
SentenceTransformer ํ์ฉํด ๊ฐ์ ๊ตฌ โ ์๋ฒ ๋ฉ
๋ถ๋ฅ๋ชจ๋ธ ํ์ฉํด (์๋ฒ ๋ฉ - ๋ผ๋ฒจ) ํ์ต
roberta ํ์ฉํด ๋ช ์ฌ,ํ์ฉ์ฌ ์ถ์ถ
4. ํ ์คํธ ํ์คํ ๋ฆฌยถ
1. QA๋ชจ๋ธยถ
model_name = 'AlexKay/xlm-roberta-large-qa-multilingual-finedtuned-ru'
question = 'what is the person feeling?'
context = '์ฌํผ ์์ฃผ ์ฌํ๊ณ ํ๋ค์ด'
question_answerer = pipeline(task = 'question-answering',model = model_name)
answer = question_answerer(question=question, context=context)
print(answer)
{โscoreโ: 0.5014625191688538, โstartโ: 0, โendโ: 13, โanswerโ: โ์ฌํผ ์์ฃผ ์ฌํ๊ณ ํ๋ค์ดโ}
xlm-roberta-large-qa ๋ชจ๋ธ๊ตฌ์กฐ
xlm : cross-lingual language model
๋ค๊ตญ์ด๋ฅผ ๋ชฉํ๋ก ์ฌ์ ํ์ต ์ํจ bert๋ฅผ ๊ต์ฐจ์ธ์ด๋ชจ๋ธ(xlm) dlfkrh qnfma
xlm ์ ๋จ์ผ ์ธ์ด ๋ฐ ๋ณ๋ ฌ ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํด ์ฌ์ ํ์ต
๋ณ๋ ฌ ๋ฐ์ดํฐ์ ์ ์ธ์ด ์์ ํ ์คํธ๋ก ๊ตฌ์ฑ(๋์ผํ ๋ด์ฉ์ 2๊ฐ ๋ค๋ฅธ ์ธ์ด ํ ์คํธ)
BPE๋ฅผ ์ฌ์ฉํ๊ณ ๋ชจ๋ ์ธ์ด์์ ๊ณต์ ๋ ์ดํ๋ฅผ ์ฌ์ฉ
์ฌ์ ํ์ต ์ ๋ต
์ธ๊ณผ์ธ์ด๋ชจ๋ธ๋ง CLM : ์ด์ ๋จ์ด์ ์์ ํ์ฌ ๋จ์ด์ ํ๋ฅ ์ ์์ธก
๋ง์คํฌ์ธ์ด๋ชจ๋ธ๋ง MLM : ํ ํฐ 15%๋ฅผ ๋ฌด์์๋ก ๋ง์คํน ํ, ๋ง์คํฌ๋ ํ ํฐ ์์ธก (80%์ [mask]๋ก ๊ต์ฒด, 10%๋ ์์ ๋ฌด์์ ๋จ์ด๋ก ๊ต์ฒด, 10%๋ ๋ณ๊ฒฝํ์ง ์์
๋ฒ์ญ ์ธ์ด๋ชจ๋ธ๋ง TLM : ์๋ก ๋ค๋ฅธ ์ธ์ด๋ก์ ๋์ผํ ํ ์คํธ๋ก ๊ตฌ์ฑ๋ ๋ณ๋ ฌ ๊ต์ฐจ ์ธ์ด๋ชจ๋ธ์ ์ด์ฉ
XLM-RoBERTa : ๋ณ๋ ฌ ๋ฐ์ดํฐ์ ์ ๊ตฌํ๊ธฐ์ ์๋ฃ๊ฐ ์ ์ ์ธ์ด๋ฅผ ํ์ตํ๊ธฐ ์ํด, MLM์ผ๋ก๋ง ํ์ต์ํค๊ณ TLM์ ์ฌ์ฉํ์ง ์์
qa ๋ชจ๋ธ
ํ์ต ์ QG(question generation) ๊ณผ QA(Question Answer) ๋ถ๋ถ์ผ๋ก ๋๋จ
config.json
{ "_name_or_path": "AlexKay/xlm-roberta-large-qa-multilingual-finedtuned-ru", "architectures": [ "XLMRobertaForQuestionAnswering" ], "attention_probs_dropout_prob": 0.1, "bos_token_id": 0, "eos_token_id": 2, "gradient_checkpointing": false, "hidden_act": "gelu", "hidden_dropout_prob": 0.1, "hidden_size": 1024, "initializer_range": 0.02, "intermediate_size": 4096, "language": "english", "layer_norm_eps": 1e-05, "max_position_embeddings": 514, "model_type": "xlm-roberta", "name": "XLMRoberta", "num_attention_heads": 16, "num_hidden_layers": 24, "output_past": true, "pad_token_id": 1, "position_embedding_type": "absolute", "transformers_version": "4.6.1", "type_vocab_size": 1, "use_cache": true, "vocab_size": 250002 }
RoBERTa
ํธ๋์คํฌ๋จธ ๋ชจ๋ธ: RoBERTa๋ BERT์ ๋ง์ฐฌ๊ฐ์ง๋ก ํธ๋์คํฌ๋จธ ๋ชจ๋ธ
์๋ฐฉํฅ ์ปจํ ์คํธ: RoBERTa๋ ๋ฌธ์ฅ์ ์๋ฐฉํฅ ์ปจํ ์คํธ๋ฅผ ๊ณ ๋ ค
๋๊ท๋ชจ ๋ฐ์ดํฐ์ ๊ณผ ๊ธด ํธ๋ ์ด๋: RoBERTa๋ BERT๋ณด๋ค ๋ ๋ง์ ๋ฐ์ดํฐ์ ๋ ๊ธด ํธ๋ ์ด๋ ์๊ฐ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ๋ จ
BERT์ ํธ๋ ์ด๋ ๊ณผ์ ์ ํฌํจ๋ NSP ํ์คํฌ๋ฅผ RoBERTa๋ ์ ๊ฑฐ
ํ์ต ๋ฐ์ดํฐ์
Fine tuned on English and Russian QA datasets
model_name = 'monologg/koelectra-base-v2-finetuned-korquad'
question = 'what is the person feeling?'
context = '์ฌํผ ์์ฃผ ์ฌํ๊ณ ํ๋ค์ด'
question_answerer = pipeline(task = 'question-answering',model = model_name)
answer = question_answerer(question=question, context=context)
print(answer)
{โscoreโ: 0.6014181971549988, โstartโ: 6, โendโ: 13, โanswerโ: โ์ฌํ๊ณ ํ๋ค์ดโ}
koelectra-base ๋ชจ๋ธ๊ตฌ์กฐ
electra
2020 ๊ตฌ๊ธ ๋ฆฌ์์น ํ์์ ๋ฐํํ ๋ชจ๋ธ
Efficiently Learning an Encoder that Classifies Token Replacements Accurately
BERT์ ๊ฒฝ์ฐ, ๋ง์ ์์ ์ปดํจํ ๋ฆฌ์์ค๋ฅผ ํ์๋กํจ
ํ๋์ ๋ฌธ์ฅ์์ 15%๋ง ๋ง์คํนํ๊ธฐ ๋๋ฌธ์, ์ค์ ํ์ตํ๋ ํ ํฐ์ด 15%
์ ๋ ฅ์ ๋ง์คํน ํ๋ ๋์ , ์๊ท๋ชจ ๋คํธ์ํฌ์์ ์ํ๋ง๋ ๊ทธ๋ด๋ฏํ ๋์์ผ๋ก ํ ํฐ์ ๋์ฒดํจ์ผ๋ก์จ ์ ๋ ฅ์ ๋ณ๊ฒฝ
์์๋ ํ ํฐ์ ์๋ ์ ์์ ์์ธกํ๋ ๋ชจ๋ธ์ ํ๋ จํ๋ ๋์ , ์์๋ ์ ๋ ฅ์ ๊ฐ ํ ํฐ์ด ์์ฑ๊ธฐ ์ํ๋ก ๋์ฒด๋์๋์ง ํ์ธ
original token VS replaced token ๋ง์ถ๋ ๊ฒ ๊ฐ์ ์ฐจ์ด๋ฐ์
โ Robert ์ ๋น์ทํ ์ฑ๋ฅ์ ๋ด๋ฉด์ 1/4 ๋ฏธ๋ง์ ์ปดํจํ ์์์ ํ์ฉ
ํ์ต ๋ฐ์ดํฐ์ : ์ฐธ๊ณ ๋งํฌ
SKT์ KoBERT
TwoBlock AI์ HanBERT
ETRI์ KorBERT
โ ํ์, ์ผ๋ถ ํน์๋ฌธ์ ์ ๊ฑฐ / ํ๊ตญ์ด ๋ฌธ์ฅ ๋ถ๋ฆฌ๊ธฐ (kss) ์ฌ์ฉ / ๋ด์ค ๊ด๋ จ ๋ฌธ์ฅ์ ์ ๊ฑฐ (๋ฌด๋จ์ ์ฌ, (์์ธ=๋ด์ค1) ๋ฑ ํฌํจ๋๋ฉด ๋ฌด์กฐ๊ฑด ์ ์ธ)
์ต์ข ๊ฒฐ๊ณผ
index
score
start
end
answer
์ผ์ ์ ํด๋ ํด๋ ๋์ด ์์๊น? ํ๊ฐ ๋๋ค.
0.9913754463195801
19
24
ํ๊ฐ ๋๋ค
์ด๋ฒ ๋ฌ์ ๋ ๊ธ์ฌ๊ฐ ๊น์์ด! ๋ฌผ๊ฐ๋ ์ค๋ฅด๋๋ฐ ์๊ธ๋ง ์๊พธ ๊น์ด๋๊น ๋๋ฌด ํ๊ฐ ๋.
0.5683395862579346
41
45
ํ๊ฐ ๋
ํ์ฌ์ ์ ์ ์ด ๋ค์ด์๋๋ฐ ๋งํฌ๊ฐ ๊ฑฐ์ฌ๋ ค. ๊ทธ๋ฐ ์ ๋ฅผ ๋งค์ผ ๋ด์ผ ํ๋ค๊ณ ์๊ฐํ๋๊น ์คํธ๋ ์ค ๋ฐ์.
0.9996705651283264
45
49
์คํธ๋ ์ค
์ง์ฅ์์ ๋ง๋ด๋ผ๋ ์ด์ ๋ก ๋์๊ฒ๋ง ์จ๊ฐ ์ฌ๋ถ๋ฆ์ ์์ผ. ์ผ๋ ๋ง์ ๋ฐ ์ ๋ง ๋ถํ๊ณ ์ญ์ญํด.
0.8939215540885925
42
49
๋ถํ๊ณ ์ญ์ญํด
์ผ๋ง ์ ์ ์ฌํ ์ ์ ์ฌ์์ด ๋๋ฅผ ๋ฌด์ํ๋ ๊ฒ ๊ฐ์์ ๋๋ฌด ํ๊ฐ ๋.
0.5234862565994263
32
34
ํ๊ฐ
์ง์ฅ์ ๋ค๋๊ณ ์์ง๋ง ์๊ฐ๋ง ๋ฒ๋ฆฌ๋ ๊ฑฐ ๊ฐ์. ์ง์งํ๊ฒ ์ง๋ก์ ๋ํ ๊ณ ๋ฏผ์ด ์๊ฒจ.
0.9997361898422241
31
41
์ง๋ก์ ๋ํ ๊ณ ๋ฏผ์ด
์ฑ์ธ์ธ๋ฐ๋ ์ง๋ก๋ฅผ ์์ง๋ ๋ชป ์ ํ๋ค๊ณ ๋ถ๋ชจ๋์ด ๋ ธ์ฌ์ํ์ . ๋๋ ์ญ์ญํด.
0.9988294839859009
36
39
์ญ์ญํด
ํด์ฌํ ์ง ์ผ๋ง ์ ๋์ง๋ง ์ฒ์ฒํ ์ง์ฅ์ ๊ตฌํด๋ณด๋ ค๊ณ .
0.5484525561332703
19
28
์ง์ฅ์ ๊ตฌํด๋ณด๋ ค๊ณ
์กธ์ ๋ฐ์ด๋ผ์ ์ทจ์ ์ ์๊ฐํด์ผ ํ๋๋ฐ ์ง๊ธ ๋๋ฌด ๋๊ธํด์ ์ด๋๋ ๋๋ ์ถ์ด.
0.9842100739479065
7
15
์ทจ์ ์ ์๊ฐํด์ผ
์์ฆ ์ง์ฅ์ํ์ด ๋๋ฌด ํธํ๊ณ ์ข์ ๊ฒ ๊ฐ์!
0.1027943417429924
3
8
์ง์ฅ์ํ์ด
์ทจ์ ํด์ผ ํ ๋์ด์ธ๋ฐ ์ทจ์ ํ๊ณ ์ถ์ง๊ฐ ์์.
0.10440643876791
7
11
๋์ด์ธ๋ฐ
๋ฉด์ ์์ ๋ถ๋ชจ๋ ์ง์ ์ ๋ํ ์ง๋ฌธ์ด ๋ค์ด์์ด.
0.9965717792510986
5
12
๋ถ๋ชจ๋ ์ง์ ์
ํฐ์ผ์ด์ผ. ๋ถ์ฅ๋๊ป ๊ฒฐ์ฌ๋ฐ์์ผ ํ๋ ์๋ฅ๊ฐ ์ฌ๋ผ์ก์ด. ํ ์๊ฐ ๋ค์ ์ ์ถํด์ผ ํ๋๋ฐ ์ด๋๋ก ๊ฐ์ง?
0.07094824314117432
0
5
ํฐ์ผ์ด์ผ.
๋ ์ผ๋ง ์ ์ ๋ฉด์ ๋ณธ ํ์ฌ์์ ๋ฉด์ ํฉ๊ฒฉํ๋ค๊ณ ์ฐ๋ฝ๋ฐ์์๋๋ฐ ์ค๋ ๋ค์ ์ ์ฌ ์ทจ์ ํต๋ณด๋ฐ์์ ๋นํน์ค๋ฌ์.
0.998587429523468
53
58
๋นํน์ค๋ฌ์
๊ธธ์ ๊ฐ๋ค๊ฐ ์ฐ์ฐํ ๋ง์ฃผ์น ๋๋ค ์์ฃผ๋จธ๋๊ป์ ์ทจ์ ํ๋๊ณ ๋ฌผ์ด๋ณด์ ์ ๋นํฉํ์ด.
0.9999895095825195
37
41
๋นํฉํ์ด
์ด์ ํฉ๊ฒฉ ํต๋ณด๋ฅผ ๋ฐ์ ํ์ฌ์์ ๋ฌธ์๋ฅผ ์๋ชป ๋ฐ์กํ๋ค๊ณ ์ฐ๋ฝ์ด ์์ด. ๋๋ฌด ๋นํน์ค๋ฝ๊ณ ์์ํด.
0.8316713571548462
42
51
๋นํน์ค๋ฝ๊ณ ์์ํด
๋ ์ค๋ ์ฒซ ์ถ๊ทผ ํ๋๋ฐ ๋๋ฌด ๋นํฉ์ค๋ฌ์ ์ด!
0.9923190474510193
17
23
๋นํฉ์ค๋ฌ์ ์ด
์ด๋ฒ์ ์ง์ฅ์ ์ด์งํ๋๋ฐ ๊ธ์ ๋ง๋๊ณ ์ถ์ง ์์ ์ฌ๋์ ๋ง๋์ ์์ฃผ ๋นํฉ์ค๋ฝ๋๋ผ๊ณ .
0.4635336995124817
38
45
๋นํฉ์ค๋ฝ๋๋ผ๊ณ
2. ์๋ฒ ๋ฉ ๋ชจ๋ธยถ
tokenizer = AutoTokenizer.from_pretrained('bert-base-multilingual-cased')
tokenizer .encode('๋นํน์ค๋ฝ๊ณ ์์ํด')
์๋ฒ ๋ฉ ๊ฐ (, 10)
(
[101, 9067, 119438, 12605, 118867, 11664, 9449, 14871, 14523, 102]
)tokenizer
from sentence_transformers import SentenceTransformer
encoder = SentenceTransformer('jhgan/ko-sroberta-multitask')
sentences = ['๋นํน์ค๋ฝ๊ณ ์์ํด',]
embeddings = encoder.encode(sentences)
print(embeddings)
์๋ฒ ๋ฉ ๊ฐ (1, 768) (์ค๋ต)
[[-0.8137736 -0.37767226 โฆ -0.4278595 -0.4228025 ]]
SentenceTransformer ์ฐธ๊ณ ์๋ฃ
SentenceTransformer(
(0): Transformer({'max_seq_length': 128, 'do_lower_case': False}) with Transformer model: RobertaModel
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False})
)
3. ๋ถ๋ฅ๋ชจ๋ธยถ
ํ๊ฐ๊ธฐ์ค accuracy (from sklearn.metrics import accuracy_score)
baseline : 0.17 (label 6๊ฐ ์ค 1๊ฐ ์์ ์ ํ๋ ๋น์จ, 1/6)
#1์ฐจ
class BertClassifier(nn.Module):
def __init__(self, dropout = 0.3):
super(BertClassifier, self).__init__()
self.bert= BertModel.from_pretrained('bert-base-multilingual-cased')
self.dropout = nn.Dropout(dropout)
self.linear = nn.Linear(768, 6)
self.relu = nn.ReLU()
def forward(self, input_id, mask):
_, pooled_output = self.bert(input_ids = input_id, attention_mask = mask, return_dict = False)
dropout_output = self.dropout(pooled_output)
linear_output = self.linear(dropout_output)
final_layer= self.relu(linear_output)
return final_layer
# 2์ฐจ
model = AutoModelForSequenceClassification.from_pretrained('bert-base-multilingual-cased', )
accuracy 55.7%
bert ๋ชจ๋ธ
๋ค์ค ์ธ์ด ๋ชจ๋ธ์ dropout / linear / relu ๋ฅผ ์ถ๊ฐํ ํจ์
epoch = 2 : ์ ์ ์์ค (train / test accuracy 0.55~0.57)
epoch = 10 : ๊ณผ์ ํฉ (train accuracy 0.98 / test accuracy = 0.56)
โ epoch = 2 ์์ ํ์ตํ ์์ค๊ณผ epoch 10์์ ํ์ตํ ๋ฐ์ดํฐ ํจํด์ด ํฌ๊ฒ ๋ค๋ฅด์ง ์์
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,stratify=y)
model = RandomForestClassifier()
model.fit(X_train_features_top50, X_train_label)
prediction = model.predict(X_test_features_top50)
score = accuracy_score(X_test_label, prediction)
print('top50 accuracy: ', score) # ๋๋จ์ด์ก๋ค.
models = [
RandomForestClassifier(),
LogisticRegression(max_iter = 5000),
SVC()
]
grid_searches = []
for model in models:
grid_search = GridSearchCV(model, param_grid = {}, cv = 5)
grid_searches.append(grid_search)
for grid_search in tqdm(grid_searches):
grid_search.fit(X_train_feature, X_train_label)
best_models = []
for grid_search in grid_searches:
best_model = grid_search.best_estimator_
best_model.append(best_model)
ensemble_model = VotingClassifier(best_models)
ensemble_model.fit(X_train_feature, X_train_label)
predictions = ensemble_model.predict(X_test_feature)
accuracy = accuracy_score(X_test_label, predictions)
accuracy 60.3%
![example] )
4. ๋ช ์ฌ/ํ์ฉ์ฌ ์ถ์ถยถ
from konlpy.tag import Okt
okt = Okt()
def get_noun(text):
noun_list = [k for k, v in okt.pos(text) if (v == 'Noun' and len(k) > 1)]
return noun_list
def get_adj(text):
adj_list = [k for k, v in okt.pos(text) if (v == 'Adjective') and (len(k) > 1)]
return adj_list
def get_verb(text):
verb_list = [k for k, v in okt.pos(text) if (v == 'Verb') and (len(k) > 1)]
return verb_list
text = '์ด์ ํฉ๊ฒฉ ํต๋ณด๋ฅผ ๋ฐ์ ํ์ฌ์์ ๋ฌธ์๋ฅผ ์๋ชป ๋ฐ์กํ๋ค๊ณ ์ฐ๋ฝ์ด ์์ด. ๋๋ฌด ๋นํน์ค๋ฝ๊ณ ์์ํด.'
get_noun(text)
get_adj(text)
get_verb(text)
get_noun: ['์ด์ ', 'ํฉ๊ฒฉ', 'ํต๋ณด', 'ํ์ฌ', '๋ฌธ์', '์๋ชป', '๋ฐ์ก', '์ฐ๋ฝ']
get_adj: ['๋นํน์ค๋ฝ๊ณ ', '์์ํด']
get_verb: ['๋ฐ์', 'ํ๋ค๊ณ ', '์์ด']
tokenizer=AutoTokenizer.from_pretrained("KoichiYasuoka/roberta-large-korean-upos")
posmodel=AutoModelForTokenClassification.from_pretrained("KoichiYasuoka/roberta-large-korean-upos")
pipeline=TokenClassificationPipeline(tokenizer=tokenizer,
model=posmodel,
aggregation_strategy="simple",
task = 'token-classification')
nlp=lambda x:[(x[t["start"]:t["end"]],t["entity_group"]) for t in pipeline(x)]
nlp(text)
# result
[('์ด์ ํฉ๊ฒฉ', 'NOUN'),
('ํต๋ณด๋ฅผ', 'NOUN'),
('๋ฐ์', 'VERB'),
('ํ์ฌ์์', 'ADV'),
('๋ฌธ์๋ฅผ', 'NOUN'),
('์๋ชป', 'ADV'),
('๋ฐ์กํ๋ค๊ณ ', 'VERB'),
('์ฐ๋ฝ์ด', 'NOUN'),
('์์ด', 'VERB'),
('.', 'PUNCT'),
('๋๋ฌด', 'ADV'),
('๋นํน์ค๋ฝ๊ณ ', 'CCONJ'),
('์์ํด', 'VERB'),
('.', 'PUNCT')]
roberta-large โ KLUE โ ํ๋ฌธ ๊ต์ก์ฉ ๊ธฐ์ด ํ์ & ์ธ๋ช ์ฉ ํ์๋ฅผ ์ถ๊ฐ
from konlpy.tag import Okt
okt = Okt()
def get_noun(text):
noun_list = [k for k, v in okt.pos(text) if (v == 'Noun' and len(k) > 1)]
return noun_list
def get_adj(text):
adj_list = [k for k, v in okt.pos(text) if (v == 'Adjective') and (len(k) > 1)]
return adj_list
def get_verb(text):
verb_list = [k for k, v in okt.pos(text) if (v == 'Verb') and (len(k) > 1)]
return verb_list
text = '์ด์ ํฉ๊ฒฉ ํต๋ณด๋ฅผ ๋ฐ์ ํ์ฌ์์ ๋ฌธ์๋ฅผ ์๋ชป ๋ฐ์กํ๋ค๊ณ ์ฐ๋ฝ์ด ์์ด. ๋๋ฌด ๋นํน์ค๋ฝ๊ณ ์์ํด.'
get_noun(text)
get_adj(text)
get_verb(text)
get_noun: ['์ด์ ', 'ํฉ๊ฒฉ', 'ํต๋ณด', 'ํ์ฌ', '๋ฌธ์', '์๋ชป', '๋ฐ์ก', '์ฐ๋ฝ']
get_adj: ['๋นํน์ค๋ฝ๊ณ ', '์์ํด']
get_verb: ['๋ฐ์', 'ํ๋ค๊ณ ', '์์ด']
RoBERTa(Robustly optimized BERT approach)ยถ
4. ๋ถ์ ๋ฆฌํฌํธยถ
1. ์ ์ ๋ถ์ ๊ฐ์ด๋๋ผ์ธยถ
์ด ๋ฐํ ๊ธ ์
๊ธ ๋น ๋ฌธ์ฅ ์
๊ธ ์ ๋ฌธ์ฅ ๊ฐฏ์
๊ธ ์ ๋จ์ด ๊ฐฏ์
๋ช ์ฌ ์ / ํ์ฉ์ฌ ์
๋ฌธ์ฅ ๊ธฐ์ค ์ต๊ณ ๊ฐ์
๋จ์ด ๊ธฐ์ค ์ต๊ณ ๊ฐ์
๋จ์ด ๋ณ ๊ฐ์ ๊ฐฏ์
๊ธ ๋ณ ๊ฐ์ / ๋จ์ด (๋ช ์ฌ, ํ์ฉ์ฌ)
๊ฐ์ 1๊ฑด๋น ๋จ์ด ์ ๋ํฌ ์ : ๊ฐ์ฅ ๋ค์ฑ๋ก์ด ๋จ์ด๋ฅผ ์ฌ์ฉํ ๊ฐ์ ์ ?
๊ฐ์ 1๊ฑด ๋น ์ต๋ค ๋จ์ด : ๊ทธ ๊ฐ์ ์ ๋ํํ๋ ๋จ์ด๋? / ์ด๋ค ๋จ์ด๋ฅผ ์ธ ๋ ๊ทธ ๊ฐ์ ์ด ๋ง์ด ์ฌ๋ผ์์๊น?
๋จ์ด 1๊ฑด๋น ์ ๋ํฌ ๊ฐ์ : ๊ฐ์ฅ ๋ณต์กํ ๊ฐ์ ์ ๋ง๋ค์ด๋ธ ๋จ์ด๋?
๋จ์ด 1๊ฑด๋น ์ต๋ค ๊ฐ์ : ๊ทธ ๋จ์ด๋ฅผ ์ธ ๋ ์ด๋ค ๊ฐ์ ์ด ๋ง์ด ์ฌ๋ผ์์๊น?
2. ์์ยถ
์์ธ์ด์คํธ <์์ > / ์ด 17๊ฐ์ ์์ธ์ด ์์ง (์ค๋ต)
# ์ ๋ชฉ : ์ฌ๋์ ๋น ์ง์ง ์๋ ํ ์ฌ๋์ ์๋ค ์ํ <๋์ ์ฌ๋, ๊ทธ๋ฆฌ์ค>์ ํ ์ฅ๋ฉด ํ ์ฌ๋์๊ฒ ๋ค๊ฐ์ค๋ ์ฌ๋์ ๊ธฐํ์ ๊ด์ฌ์ด ๋ง๋ค.... "์ฌ๋์ ๋น ์ง์ง ์๋ ํ ์ฌ๋์ ์๋ค. "(151์ชฝ) ์ฌ๋์ ํน๋ณํ ์ง์์ด๋ ๊ธฐ์ ์ด ํ์์น ์๋ค๋ ์ ์์ ์ฝ๊ณ , ์๊ธฐ๋ฅผ ๋ด๋ ค๋์์ผ ํ๋ค๋ ์ ์์ ์ด๋ ต๋ค. ๊ทธ๋ฌ๋ ์ฌ๋์ ์ผ๋ง๋ ํด๋ณด์๋๋๋ ์ง๋ฌธ์ ์ด๋ ๊ฒ ๋ฐ๊ฟ ์๋ ์๋ค. ๋น์ ์ ๋ค๋ฅธ ์กด์ฌ๊ฐ ๋์ด๋ณด์๋๋. ์ ์ฌ๋์ด ํ์ํ๋๊ณ ๋ฌป๋๋ค๋ฉด, ๋นํ์ฑํ๋ ์์์ ํ์ฑํ๊ฐ ์์ธํ ํ์ค์ ์จ๊ตฌ๋ฉ์ ์ด์ด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ๋ตํ๊ฒ ๋ค. ์กด์ฌ์ ๋ฑ์ด ์ผ์ง๋ ์๊ฐ ์ฌ๋์ ์์ญ์ธ๋ค. โ์ถ์ ๋ถ๋ค๊ณ ์ต์ ์ ๋คํด์. โ(123์ชฝ)
์ด ๋ฐํ ๊ธ ์ : 17๊ฑด
70.35 ๋ฌธ์ฅ / 1๊ธ
๊ธ ์ ๋ฌธ์ฅ ๊ฐ์
title |
๋ฌธ์ฅ ์ |
---|---|
โ๋ถ์ํ ์์ดโ ๋ง๋๋ โ์ด์ํ ์ด๋ฅธ๋คโ |
53 |
๊ธ์ฐ๊ธฐ๋ ๋์ ์นํด์ง๋ ์ผ |
62 |
๋๋ฅผ ์ํ๊ฒ ํ๋ ์ฐฉํ ์ฌ๋๋ค |
65 |
๋ค์ ํ ์ผ๊ตด์ ์์ฑํ๋ ๋ฒ |
65 |
๋ธ์ ๋ํ์ฌ, ์ค์ ์๋ง์ ๋ํ์ฌ |
68 |
๋ง์นจ๋ด ์ฌ๋ ๋ฒ์ ๋ฐฐ์ฐ๋ค |
64 |
๋ง๊ตญ์ ์ฑ๊ธ ๋ ์ด๋์ค์ฌ, ๋ฒํ จ์ฃผ์ค! |
69 |
๋ฌธ๋ช ์ ํธ๋ฆฌ๊ฐ ๋๊ตฐ๊ฐ์ ์ฃฝ์์ ๋น์ง๊ณ ์์์ |
87 |
์ฌ๋์ ๋น ์ง์ง ์๋ ํ ์ฌ๋์ ์๋ค |
63 |
์ฑํญ๋ ฅ ๊ฐํด์์๊ฒ ํธ์ง๋ฅผ ๋ณด๋๋ค |
83 |
์ฌํ์ ๊ณต๋ถํด์ผ ํ๋ ์ด์ |
70 |
์๋ ค์ฃผ์ง ์์ผ๋ฉด ๊ทธ ์ด์ ๋ฅผ ๋ชจ๋ฅด์๊ฒ ์ด์? |
67 |
์ฐ๋ฆฌ๋ ์ ์ด์๋ก ๋น์์ด๊ฐ ๋๋๊ฐ |
73 |
์ธ๋๋ผ๋ ์ ํํ๊ฒ ๋งํ๋ ๊ฒ |
77 |
์ธ๊ณต์๊ถ์ ์๊ฐํจ |
79 |
์น๊ตฌ ๊ฐ์ ์๋ง์ ๋ธ์ด๋ผ๋ ํ์ |
80 |
ํ์ฐฎ์ ๋ง๋จ๋ค์ ๋ํ ์์ |
88 |
๊ธ ์ ๋จ์ด ๊ฐ์
๋ฌธ์ฅ ๊ธฐ์ค ์ต๊ณ ๊ฐ์
์์ธ์ด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฌธ์ฅ์ ๊ฐ์ ๋ผ๋ฒจ์ ์ง๊ณ
โ๊ธ์ฐ๊ธฐ๋ ๋์ ์นํด์ง๋์ผโ ์ด๋ผ๋ ์์ธ์ด์์๋ [๋ถ์] ์ด ๊ฐ์ฅ ๋์ผ๋ฉฐ [๊ธฐ์จ] ๊ณผ [๋ถ๋ ธ] ๊ฐ ๊ทธ ๋ค์ ๊ฐ
โ ๋ฌธ์ฅ ๋ถ๋ฅ ๋ชจ๋ธ์ ์ ํ๋ ์์น์, ํด๋น ๋ฐฉ์์ผ๋ก ์์ธ์ด ๋ณ โ์ฃผ์ ๊ฐ์ โ ์ ์ฝ๊ฒ ๊ตฌ๋ถ ๋ฐ ๋น๊ตํ ์ ์์
๋จ์ด ๊ธฐ์ค ์ต๊ณ ๊ฐ์ / ๋จ์ด ๋ณ ๊ฐ์ ๊ฐ์
๋ช ์ฌ์ ํ์ฉ์ฌ๋ฅผ ํฉ์ณค์ ๊ฒฝ์ฐ, ์๋๋ผ/์๋ ๋ฑ์ ๋จ์ด๋ค์ด ์์์ ์์น
๋ช ์ฌ๋ง ์ถ์ถ ์, 2๊ฐ ์ด์์ ๊ฐ์ ์ด ๋ด๊ธด ๋จ์ด๋ ์ฐพ์ง ๋ชปํจ
โ ๋ ๋ง์ ์์ธ์ด๋ฅผ ์์ง / lemmatized ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํด ์๋ฏธ ๊ธฐ์ค์ผ๋ก ์ฌ๊ตฌ์ฑ์ด ๊ฐ๋ฅํด๋ณด์
[๋ช ์ฌ + ํ์ฉ์ฌ]
๊ฐ์ฅ ๋ค์ฑ๋ก์ด ๋จ์ด๋ฅผ ์ฌ์ฉํ ๊ฐ์ ์ ? (๊ฐ์ ๋ณ ๋ฌธ์ฅ 1๊ฑด๋น ๋จ์ด)
[๋ถ์] ๋จ์ด ์ข ๋ฅ๊ฐ 954๊ฑด์ผ๋ก ๊ฐ์ฅ ๋ง์
๋ฌธ์ฅ ์๋ก ๋๋ ๋ณด์์ ๋, [๋นํฉ] ์ ๊ฐ์ ์ด 3.24๊ฑด์ผ๋ก ๋ฌธ์ฅ 1๊ฑด์์ 3๊ฐ ์ด์์ ๋จ์ด๋ค์ด ์ถ์ถ๋์ด ๋งคํ
emotion
vocab_cnt
sentence_cnt
vocab_per_sentence
๋ถ์
954
327
2.917431
์ฌํ
681
245
2.779592
๋ถ๋ ธ
736
260
2.917431
๊ธฐ์จ
541
197
2.746193
๋นํฉ
318
98
3.244898
์์ฒ
272
86
3.162791
๊ทธ ๊ฐ์ ์ ๋ํํ๋ ๋จ์ด๋? / ์ด๋ค ๋จ์ด๋ฅผ ์ธ ๋ ๊ทธ ๊ฐ์ ์ด ๋ง์ด ์ฌ๋ผ์์๊น? (๊ฐ์ 1๊ฑด ๋น ์ต๋ค ๋จ์ด)
[๋นํฉ] ์ ๊ฒฝ์ฐ ๋ถ๋๋ฌ์ด, ์ด์ํ ์ด๋ผ๋ ๋จ์ด๊ฐ ์์์ ์กด์ฌ
๊ทธ ์ธ์ ๊ฐ์ ์ ๊ฒฝ์ฐ, ๋จ์ด๋ก ํน์ฑ์ ์ฐพ๊ธฐ ์ด๋ ค์
โ ๋น๋๊ฐ ๋์ ๋จ์ด๋ค์ด ์์์ ์กด์ฌํ์ฌ, ํด๋น ๋ฐฉ์์ผ๋ก ์ถ์ถ ๋ค tfidf ๋ฑ์ ๋น๋ ๊ธฐ๋ฐ ์ค์ฝ์ด๋ก ๋จ์ด ์ถ๊ฐ ์ ๋ ฌ์ด ๊ฐ๋ฅํด๋ณด์
๊ฐ์ฅ ๋ณต์กํ ๊ฐ์ ์ ๋ง๋ค์ด๋ธ ๋จ์ด๋? (๋จ์ด 1๊ฑด๋น ์ ๋ํฌ ๊ฐ์ )
์๋, ์๋, ์๋, ์๋ค ๋ฑ์ด ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ์๊ณ , ๊ทธ์ ๋ฐ๋ฅธ ๊ฐ์ ์ข ๋ฅ๋ ๊ฐ์ฅ ๋ง์
๋จ์ด ๋งฅ๋ฝ์ ๋ฐ๋ผ ์ด๋ ๋ถ๋ถ์๋ ์ฝ๊ฒ ์ ์ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฐ๋ค์ด ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ง๊ณ ์์
โ ๋ณต์กํ ๊ฐ์ ์ ๊ธฐ์ค์ ๋ค์ ์ ์ํ๊ณ (์: ์์ถฉ๋๋ ๊ฐ์ ) ๊ทธ์ ๋ฐ๋ฅธ โ๋ณต์กํ ๊ฐ์ โ ๊ณผ โ๋จ์ดโ ์กฐํฉ์ ์ฐพ์๋ณผ ์ ์์
๊ทธ ๋จ์ด๋ฅผ ์ธ ๋ ์ด๋ค ๊ฐ์ ์ด ๋ง์ด ์ฌ๋ผ์์๊น? (๋จ์ด 1๊ฑด๋น ์ต๋ค ๊ฐ์ )
[์ข์ํ๋] ๋จ์ด์ ๊ฒฝ์ฐ, ๋ถ์ :2 , ๊ธฐ์จ : 1 , ์์ฒ : 1
[๋ถ๋๋ฌ์ด] ๋จ์ด์ ๊ฒฝ์ฐ, ๋นํฉ : 4
[๋์ฝํ] ๋จ์ด์ ๊ฒฝ์ฐ ๊ธฐ์จ : 1