korean Formal Convertor Using Deep Learning
์กด๋๋ง๊ณผ ๋ฐ๋ง์ ํ๊ตญ์ด์์๋ง ์กด์ฌํฉ๋๋ค, ๋ณธ ๋ชจ๋ธ์ ๋ฐ๋ง(informal)์ ์กด๋๋ง(formal)๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ณํ๊ธฐ(convertor) ์
๋๋ค.
*ํ๋ณดํ ์กด๋๋ง ๋ฐ์ดํฐ์
์๋ "ํด์์ฒด"์ "ํฉ์ผ์ฒด" ๋ ์ข
๋ฅ๊ฐ ์กด์ฌํ์ง๋ง ๋ณธ ๋ชจ๋ธ์ "ํด์์ฒด"๋ก ํต์ผํ์ฌ ๋ณํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
ํฉ์ผ์ฒด | *ํด์์ฒด |
---|---|
์๋ ํ์ญ๋๊น. | ์๋ ํ์ธ์. |
์ข์ ์์นจ์ ๋๋ค. | ์ข์ ์์นจ์ด์์. |
๋ฐ์์์ง ์์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. | ๋ฐ์์์ง ์์์ผ๋ฉด ์ข๊ฒ ์ด์. |
๋ฐฐ๊ฒฝ
- ์ด์ ์ ์กด๋๋ง๊ณผ ๋ฐ๋ง์ ๊ตฌ๋ถํ๋ ๋ถ๋ฅ๊ธฐ(https://github.com/jongmin-oh/korean-formal-classifier) ๋ฅผ ํ์ตํ์ต๋๋ค.
๋ถ๋ฅ๊ธฐ๋ก ๋งํฌ๋ฅผ ๋๋ ์ฌ์ฉํ๋ คํ์ง๋ง, ์๋์ ์ผ๋ก ์กด๋๋ง์ ๋น์ค์ด ์ ์๊ณ ๋ฐ๋ง์ ์กด๋๋ง๋ก ๋ฐ๊พธ์ด ์กด๋๋ง ๋ฐ์ดํฐ์ ๋น์ค์ ๋๋ฆฌ๊ธฐ์ํด ๋ง๋ค๊ฒ ๋์์ต๋๋ค.
ํ๊ตญ์ด ์กด๋๋ง ๋ณํ๊ธฐ
- ์กด๋๋ง ๋ณํ๊ธฐ๋ T5๋ชจ๋ธ ์ํคํ ์ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ Text2Text generation Task๋ฅผ ์ํํจ์ผ๋ก ๋ฐ๋ง์ ์กด๋๋ง๋ก ๋ณํํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฐ๋ก ์ฌ์ฉํ์ค ๋ถ๋ค์ ๋ฐ์ ์์ ์ฝ๋ ์ฐธ๊ณ ํด์ huggingFace ๋ชจ๋ธ('j5ng/et5-formal-convertor') ๋ค์ด๋ฐ์ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค.
Base on PLM model(ET5)
Base on Dataset
AIํ๋ธ(https://www.aihub.or.kr/) : ํ๊ตญ์ด ์ด์ฒด ๋ณํ ์ฝํผ์ค
- KETI ์ผ์์คํผ์ค ๋ํ 1,254 ๋ฌธ์ฅ
- ์๋ํ๊น ๋ณ๋ ฌ๋ฐ์ดํฐ
์ค๋ง์ผ๊ฒ์ดํธ ๋งํฌ ๋ฐ์ดํฐ ์ (korean SmileStyle Dataset)
Preprocessing
๋ฐ๋ง/์กด๋๋ง ๋ฐ์ดํฐ ๋ถ๋ฆฌ("ํด์์ฒด"๋ง ๋ถ๋ฆฌ)
- ์ค๋ง์ผ๊ฒ์ดํธ ๋ฐ์ดํฐ์์ (['formal','informal']) ์นผ๋ผ๋ง ์ฌ์ฉ
- ์๋ํ๊น ๋ณ๋ ฌ๋ฐ์ดํฐ์์ [".ban", ".yo"] txt ํ์ผ๋ง ์ฌ์ฉ
- KETI ์ผ์์คํผ์ค ๋ฐ์ดํฐ์์(["๋ฐ๋ง","ํด์์ฒด"]) ์นผ๋ผ๋ง ์ฌ์ฉ
๋ฐ์ดํฐ ์ ๋ณํฉ(3๊ฐ์ง ๋ฐ์ดํฐ ์ ๋ณํฉ)
๋ง์นจํ(.)์ ์ผํ(,)์ ๊ฑฐ
๋ฐ๋ง(informal) ์นผ๋ผ ์ค๋ณต ์ ๊ฑฐ : 1632๊ฐ ์ค๋ณต๋ฐ์ดํฐ ์ ๊ฑฐ
์ต์ข ํ์ต๋ฐ์ดํฐ ์์
informal | formal |
---|---|
์ ๊ณ ๋ง์ | ๋ค ๊ฐ์ฌํด์ |
๋๋ ๊ทธ ์ฑ ์ฝ์์ด ๊ต์ฅํ ์๊ธด ์ฑ ์ด์์ด | ์ ๋ ๊ทธ ์ฑ ์ฝ์์ต๋๋ค ๊ต์ฅํ ์๊ธด ์ฑ ์ด์์ด์ |
๋ฏธ์ธ๋จผ์ง๊ฐ ๋ง์ ๋ ์ด์ผ | ๋ฏธ์ธ๋จผ์ง๊ฐ ๋ง์ ๋ ์ด๋ค์ |
๊ด์ฐฎ๊ฒ ์ด? | ๊ด์ฐฎ์ผ์ค๊น์? |
์๋์ผ ํ์๊ฐ ์ ์ ๋ค์ ์์ด ์ค๋นํด์ค | ์๋์์ ํ์๊ฐ ์ ์ ๋ค์ ์์ด์ ์ค๋นํด์ฃผ์ธ์ |
total : 14,992 ์
How to use
import torch
from transformers import T5ForConditionalGeneration, T5Tokenizer
# T5 ๋ชจ๋ธ ๋ก๋
model = T5ForConditionalGeneration.from_pretrained("j5ng/et5-formal-convertor")
tokenizer = T5Tokenizer.from_pretrained("j5ng/et5-formal-convertor")
device = "cuda:0" if torch.cuda.is_available() else "cpu"
# device = "mps:0" if torch.cuda.is_available() else "cpu" # for mac m1
model = model.to(device)
# ์์ ์
๋ ฅ ๋ฌธ์ฅ
input_text = "๋ ์ง์ง ํ๋ฌ์ด ์ง๊ธ"
# ์
๋ ฅ ๋ฌธ์ฅ ์ธ์ฝ๋ฉ
input_encoding = tokenizer("์กด๋๋ง๋ก ๋ฐ๊ฟ์ฃผ์ธ์: " + input_text, return_tensors="pt")
input_ids = input_encoding.input_ids.to(device)
attention_mask = input_encoding.attention_mask.to(device)
# T5 ๋ชจ๋ธ ์ถ๋ ฅ ์์ฑ
output_encoding = model.generate(
input_ids=input_ids,
attention_mask=attention_mask,
max_length=128,
num_beams=5,
early_stopping=True,
)
# ์ถ๋ ฅ ๋ฌธ์ฅ ๋์ฝ๋ฉ
output_text = tokenizer.decode(output_encoding[0], skip_special_tokens=True)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(output_text) # ์ ์ง์ง ํ๋ฌ์ต๋๋ค ์ง๊ธ.
With Transformer Pipeline
import torch
from transformers import T5ForConditionalGeneration, T5Tokenizer, pipeline
model = T5ForConditionalGeneration.from_pretrained('j5ng/et5-formal-convertor')
tokenizer = T5Tokenizer.from_pretrained('j5ng/et5-formal-convertor')
typos_corrector = pipeline(
"text2text-generation",
model=model,
tokenizer=tokenizer,
device=0 if torch.cuda.is_available() else -1,
framework="pt",
)
input_text = "๋ ๊ฐ์ง ์ ์์๊ฑฐ๋ผ ์๊ฐํ์ด"
output_text = typos_corrector("์กด๋๋ง๋ก ๋ฐ๊ฟ์ฃผ์ธ์: " + input_text,
max_length=128,
num_beams=5,
early_stopping=True)[0]['generated_text']
print(output_text) # ๋น์ ์ ๊ฐ์ง ์ ์์๊ฑฐ๋ผ ์๊ฐํ์ต๋๋ค.
Thanks to
์กด๋๋ง ๋ณํ๊ธฐ์ ํ์ต์ ์ธ๊ณต์ง๋ฅ์ฐ์ ์ตํฉ์ฌ์ ๋จ(AICA)์ GPU ๋ฆฌ์์ค๋ฅผ ์ง์๋ฐ์ ํ์ต๋์์ต๋๋ค.
- Downloads last month
- 36