Update README.md
Browse files
README.md
CHANGED
@@ -9,3 +9,121 @@ pipeline_tag: text2text-generation
|
|
9 |
์กด๋๋ง๊ณผ ๋ฐ๋ง์ ํ๊ตญ์ด์์๋ง ์กด์ฌํฉ๋๋ค, ๋ณธ ๋ชจ๋ธ์ ๋ฐ๋ง(informal)์ ์กด๋๋ง(formal)๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ณํ๊ธฐ(convertor) ์
๋๋ค. <br>
|
10 |
*ํ๋ณดํ ์กด๋๋ง ๋ฐ์ดํฐ์
์๋ "ํด์์ฒด"์ "ํฉ์ผ์ฒด" ๋ ์ข
๋ฅ๊ฐ ์กด์ฌํ์ง๋ง ๋ณธ ๋ชจ๋ธ์ "ํด์์ฒด"๋ก ํต์ผํ์ฌ ๋ณํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
|
11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
์กด๋๋ง๊ณผ ๋ฐ๋ง์ ํ๊ตญ์ด์์๋ง ์กด์ฌํฉ๋๋ค, ๋ณธ ๋ชจ๋ธ์ ๋ฐ๋ง(informal)์ ์กด๋๋ง(formal)๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ณํ๊ธฐ(convertor) ์
๋๋ค. <br>
|
10 |
*ํ๋ณดํ ์กด๋๋ง ๋ฐ์ดํฐ์
์๋ "ํด์์ฒด"์ "ํฉ์ผ์ฒด" ๋ ์ข
๋ฅ๊ฐ ์กด์ฌํ์ง๋ง ๋ณธ ๋ชจ๋ธ์ "ํด์์ฒด"๋ก ํต์ผํ์ฌ ๋ณํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
|
11 |
|
12 |
+
|ํฉ์ผ์ฒด|*ํด์์ฒด|
|
13 |
+
|------|---|
|
14 |
+
|์๋
ํ์ญ๋๊น.|์๋
ํ์ธ์.|
|
15 |
+
|์ข์ ์์นจ์
๋๋ค.|์ข์ ์์นจ์ด์์.|
|
16 |
+
|๋ฐ์์์ง ์์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.|๋ฐ์์์ง ์์์ผ๋ฉด ์ข๊ฒ ์ด์.|
|
17 |
+
|
18 |
+
## ๋ฐฐ๊ฒฝ
|
19 |
+
- ์ด์ ์ ์กด๋๋ง๊ณผ ๋ฐ๋ง์ ๊ตฌ๋ถํ๋ ๋ถ๋ฅ๊ธฐ(https://github.com/jongmin-oh/korean-formal-classifier) ๋ฅผ ํ์ตํ์ต๋๋ค.<br>
|
20 |
+
๋ถ๋ฅ๊ธฐ๋ก ๋งํฌ๋ฅผ ๋๋ ์ฌ์ฉํ๋ คํ์ง๋ง, ์๋์ ์ผ๋ก ์กด๋๋ง์ ๋น์ค์ด ์ ์๊ณ ๋ฐ๋ง์ ์กด๋๋ง๋ก ๋ฐ๊พธ์ด ์กด๋๋ง ๋ฐ์ดํฐ์ ๋น์ค์ ๋๋ฆฌ๊ธฐ์ํด ๋ง๋ค๊ฒ ๋์์ต๋๋ค.
|
21 |
+
|
22 |
+
## ํ๊ตญ์ด ์กด๋๋ง ๋ณํ๊ธฐ
|
23 |
+
- ์กด๋๋ง ๋ณํ๊ธฐ๋ T5๋ชจ๋ธ ์ํคํ
์ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ Text2Text generation Task๋ฅผ ์ํํจ์ผ๋ก ๋ฐ๋ง์ ์กด๋๋ง๋ก ๋ณํํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
|
24 |
+
- ๋ฐ๋ก ์ฌ์ฉํ์ค ๋ถ๋ค์ ๋ฐ์ ์์ ์ฝ๋ ์ฐธ๊ณ ํด์ huggingFace ๋ชจ๋ธ('j5ng/et5-formal-convertor') ๋ค์ด๋ฐ์ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค.
|
25 |
+
|
26 |
+
## Base on PLM model(ET5)
|
27 |
+
- ETRI(https://aiopen.etri.re.kr/et5Model)
|
28 |
+
|
29 |
+
## Base on Dataset
|
30 |
+
- AIํ๋ธ(https://www.aihub.or.kr/) : ํ๊ตญ์ด ์ด์ฒด ๋ณํ ์ฝํผ์ค
|
31 |
+
1. KETI ์ผ์์คํผ์ค ๋ํ 1,254 ๋ฌธ์ฅ
|
32 |
+
2. ์๋ํ๊น
๋ณ๋ ฌ๋ฐ์ดํฐ
|
33 |
+
|
34 |
+
- ์ค๋ง์ผ๊ฒ์ดํธ ๋งํฌ ๋ฐ์ดํฐ ์
(korean SmileStyle Dataset)
|
35 |
+
|
36 |
+
### Preprocessing
|
37 |
+
1. ๋ฐ๋ง/์กด๋๋ง ๋ฐ์ดํฐ ๋ถ๋ฆฌ("ํด์์ฒด"๋ง ๋ถ๋ฆฌ)
|
38 |
+
- ์ค๋ง์ผ๊ฒ์ดํธ ๋ฐ์ดํฐ์์ (['formal','informal']) ์นผ๋ผ๋ง ์ฌ์ฉ
|
39 |
+
- ์๋ํ๊น
๋ณ๋ ฌ๋ฐ์ดํฐ์์ ["*.ban", "*.yo"] txt ํ์ผ๋ง ์ฌ์ฉ
|
40 |
+
- KETI ์ผ์์คํผ์ค ๋ฐ์ดํฐ์์(["๋ฐ๋ง","ํด์์ฒด"]) ์นผ๋ผ๋ง ์ฌ์ฉ
|
41 |
+
|
42 |
+
2. ๋ฐ์ดํฐ ์
๋ณํฉ(3๊ฐ์ง ๋ฐ์ดํฐ ์
๋ณํฉ)
|
43 |
+
3. ๋ง์นจํ(.)์ ์ผํ(,)์ ๊ฑฐ
|
44 |
+
4. ๋ฐ๋ง(informal) ์นผ๋ผ ์ค๋ณต ์ ๊ฑฐ : 1632๊ฐ ์ค๋ณต๋ฐ์ดํฐ ์ ๊ฑฐ
|
45 |
+
|
46 |
+
### ์ต์ข
ํ์ต๋ฐ์ดํฐ ์์
|
47 |
+
|informal|formal|
|
48 |
+
|------|---|
|
49 |
+
|์ ๊ณ ๋ง์|๋ค ๊ฐ์ฌํด์|
|
50 |
+
|๋๋ ๊ทธ ์ฑ
์ฝ์์ด ๊ต์ฅํ ์๊ธด ์ฑ
์ด์์ด|์ ๋ ๊ทธ ์ฑ
์ฝ์์ต๋๋ค ๊ต์ฅํ ์๊ธด ์ฑ
์ด์์ด์|
|
51 |
+
|๋ฏธ์ธ๋จผ์ง๊ฐ ๋ง์ ๋ ์ด์ผ|๋ฏธ์ธ๋จผ์ง๊ฐ ๋ง์ ๋ ์ด๋ค์|
|
52 |
+
|๊ด์ฐฎ๊ฒ ์ด?|๊ด์ฐฎ์ผ์ค๊น์?|
|
53 |
+
|์๋์ผ ํ์๊ฐ ์ ์ ๋ค์ ์์ด ์ค๋นํด์ค|์๋์์ ํ์๊ฐ ์ ์ ๋ค์ ์์ด์ ์ค๋นํด์ฃผ์ธ์|
|
54 |
+
|
55 |
+
#### total : 14,992 ์
|
56 |
+
|
57 |
+
***
|
58 |
+
|
59 |
+
## How to use
|
60 |
+
```python
|
61 |
+
import torch
|
62 |
+
from transformers import T5ForConditionalGeneration, T5Tokenizer
|
63 |
+
|
64 |
+
# T5 ๋ชจ๋ธ ๋ก๋
|
65 |
+
model = T5ForConditionalGeneration.from_pretrained("j5ng/et5-formal-convertor")
|
66 |
+
tokenizer = T5Tokenizer.from_pretrained("j5ng/et5-formal-convertor")
|
67 |
+
|
68 |
+
device = "cuda:0" if torch.cuda.is_available() else "cpu"
|
69 |
+
# device = "mps:0" if torch.cuda.is_available() else "cpu" # for mac m1
|
70 |
+
|
71 |
+
model = model.to(device)
|
72 |
+
|
73 |
+
# ์์ ์
๋ ฅ ๋ฌธ์ฅ
|
74 |
+
input_text = "๋ ์ง์ง ํ๋ฌ์ด ์ง๊ธ"
|
75 |
+
|
76 |
+
# ์
๋ ฅ ๋ฌธ์ฅ ์ธ์ฝ๋ฉ
|
77 |
+
input_encoding = tokenizer("์กด๋๋ง๋ก ๋ฐ๊ฟ์ฃผ์ธ์: " + input_text, return_tensors="pt")
|
78 |
+
|
79 |
+
input_ids = input_encoding.input_ids.to(device)
|
80 |
+
attention_mask = input_encoding.attention_mask.to(device)
|
81 |
+
|
82 |
+
# T5 ๋ชจ๋ธ ์ถ๋ ฅ ์์ฑ
|
83 |
+
output_encoding = model.generate(
|
84 |
+
input_ids=input_ids,
|
85 |
+
attention_mask=attention_mask,
|
86 |
+
max_length=128,
|
87 |
+
num_beams=5,
|
88 |
+
early_stopping=True,
|
89 |
+
)
|
90 |
+
|
91 |
+
# ์ถ๋ ฅ ๋ฌธ์ฅ ๋์ฝ๋ฉ
|
92 |
+
output_text = tokenizer.decode(output_encoding[0], skip_special_tokens=True)
|
93 |
+
|
94 |
+
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
|
95 |
+
print(output_text) # ์ ์ง์ง ํ๋ฌ์ต๋๋ค ์ง๊ธ.
|
96 |
+
```
|
97 |
+
|
98 |
+
***
|
99 |
+
|
100 |
+
## With Transformer Pipeline
|
101 |
+
```python
|
102 |
+
import torch
|
103 |
+
from transformers import T5ForConditionalGeneration, T5Tokenizer, pipeline
|
104 |
+
|
105 |
+
model = T5ForConditionalGeneration.from_pretrained('j5ng/et5-formal-convertor')
|
106 |
+
tokenizer = T5Tokenizer.from_pretrained('j5ng/et5-formal-convertor')
|
107 |
+
|
108 |
+
typos_corrector = pipeline(
|
109 |
+
"text2text-generation",
|
110 |
+
model=model,
|
111 |
+
tokenizer=tokenizer,
|
112 |
+
device=0 if torch.cuda.is_available() else -1,
|
113 |
+
framework="pt",
|
114 |
+
)
|
115 |
+
|
116 |
+
input_text = "๋ ๊ฐ์ง ์ ์์๊ฑฐ๋ผ ์๊ฐํ์ด"
|
117 |
+
output_text = typos_corrector("์กด๋๋ง๋ก ๋ฐ๊ฟ์ฃผ์ธ์: " + input_text,
|
118 |
+
max_length=128,
|
119 |
+
num_beams=5,
|
120 |
+
early_stopping=True)[0]['generated_text']
|
121 |
+
|
122 |
+
print(output_text) # ๋น์ ์ ๊ฐ์ง ์ ์์๊ฑฐ๋ผ ์๊ฐํ์ต๋๋ค.
|
123 |
+
```
|
124 |
+
|
125 |
+
## Thanks to
|
126 |
+
์กด๋๋ง ๋ณํ๊ธฐ์ ํ์ต์ ์ธ๊ณต์ง๋ฅ์ฐ์
์ตํฉ์ฌ์
๋จ(AICA)์ GPU ๋ฆฌ์์ค๋ฅผ ์ง์๋ฐ์ ํ์ต๋์์ต๋๋ค.
|
127 |
+
|
128 |
+
|
129 |
+
|