-
Korean Language Model - ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌML engineer/NLP 2023. 2. 4. 23:37๋ฐ์ํ
๐ 5 mins read
# ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ด์
์ต์ํ์ ์ ์ฒ๋ฆฌ๋ฅผ ํตํด ์ธ์ด๋ชจ๋ธ์ ๋ถํ์ํ ์์๋ฅผ ๋ฐฐ์ ํ๊ณ , ์ํ ์์๋ฅผ ๊ฑท์ด ๋ ๋๋ค. ๋ฌผ๋ก ๋ชจ๋ธ ๋ฟ๋ง ์๋๋ผ ๋น๋ ๊ธฐ๋ฐ์ ํ ํฌ๋์ด์ ๋ฅผ ํ์ตํ ๋๋ ๋์์ด ๋์ฃ .
์ฌ์ค ์ธ์ด ๋ชจ๋ธ์ ๊ท๋ชจ๋ฅผ ํค์ฐ๊ณ , ๋ฐ์ดํฐ๋ฅผ ํค์ฐ๊ฒ ๋๋ฉด ๋ฒ์ฉ LLM(Large Language Model)์์ , ์ ์ฒ๋ฆฌ์ ๊ณต์ ๋ค์ด๋๊ฒ ๋ณด๋ค๋ ์๋ ํ ์คํธ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์๋๊ฒ์ด ๋ฐ์ดํฐ์ ๋ค์ํ ํํ๋ฅผ ๋ถ์ํ๊ณ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ์ข์ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๋ํ ๋ถ์/์์ฑ๋ฑ์ ํนํ๋ ๋ํ ๋ชจ๋ธ์ ๋ง๋๋๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ์ฒ๋ฆฌ๋ฅผ ํ ํ์๊ฐ ์์ต๋๋ค.
- ์์ ๊ท๋ชจ์ ๋ชจ๋ธ/๋ฐ์ดํฐ ํ์์ ๋ ธ์ด์ฆ๋ก ์์ฉํ ์ ์๋ ๋ถํ์ํ ํจํด ์ ๊ฑฐ
- ํน์ ํ ํฐ ์ฒ๋ฆฌ (๊ฐ์ธ์ ๋ณด ๋ง์คํน, ๋ํ ๋ฐ์ดํฐ ํ์ ๊ตฌ๋ถ์ ์ฝ์ ๋ฑ)
- ๋ฐ์ดํฐ๊ฐ ๋ค์ํ ์์ค์์ ์๊ฑฐ๋, ๋ก๊ทธ ๋ฐ์ดํฐ ๋ผ๋ฉด, ์ค๋ณต ๋ฐ์ดํฐ ์ ๊ฑฐ
ML ๋ชจ๋ธ ํ์ต์ ์์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ ์ธ์ ๋ ์ค์ํ ์์ ์ ๋๋ค # ์ ์ฒ๋ฆฌ ์ค๋น
๋จผ์ ์ฌ์ฉํ๋ ค๋ ํ์ต ๋ฐ์ดํฐ๋ฅผ ์ต์ํ 5GB ์ด์ ๋ชจ์๋ค๋ฉด, ์ด๋ฅผ ํฅํ ์ฌ์ฉํ๊ธฐ ํธํ๊ฒ ์ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผํฉ๋๋ค.
raw ๋ฐ์ดํฐ๋ ๋๊ฒ jsonl ํฌ๋งท์ด๋ csv, tsv๋ฑ์ ์ฝ๊ฐ์ ๊ตฌ์กฐํ๋ ํํ๋ก ๋ฉํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ์ฐ๋ฆฌ๋ ํ์ต์ ํ์ํ ์ต์ํ์ ๋ถ๊ฐ ์ ๋ณด๋ง ๋จ๊ธฐ๊ณ , ํ ์คํธ ํ์ผ ํ ์ค์ ํ๋์ ๋ฌธ์/๋ํ ์ธ์ /๋ฌธ๋จ ๋ฑ์ด ์ค๋๋ก ํฌ๋งท์ ์ ๊ทํ ๋จผ์ ํด์ค๋๋ค.
# jsonl ์์ {"id": "BAND_00001", "context": ["์๋ ?", "์๋ ํ์ธ์~", "์ค๋๋ง์ด๋ค์"], "response": "๋ญํ๊ณ ์์ด์?"} # ๋ผ์ธ ํ ์คํธ๋ก ์ ๊ทํ ์์, ๋ํ ๋ฐ์ดํฐ๋ผ๋ฉด [P1] ์๋ ? [P2] ์๋ ํ์ธ์~ [P1] ์ค๋๋ง์ด๋ค์ [P2] ๋ญํ๊ณ ์์ด์? # ํน์, ์๋ต ์์ฑ task๋ก ๋ฐ๋ผ๋ณธ๋ค๋ฉด [P1] ์๋ ? [P2] ์๋ ํ์ธ์~ [P1] ์ค๋๋ง์ด๋ค์ [SEP] ๋ญํ๊ณ ์์ด์? # ์ ์ฒ๋ฆฌ
## 1. ํํฐ๋ง
language_filter.py
ํ๊ตญ์ด ๋ฐ์ดํฐ ์์ฃผ๋ก ๋ชจ๋ธ์ ํ์ตํ ๊ฒ์ด๋ฏ๋ก, ํ๊ตญ์ด ์์ฒด๊ฐ ๊ฑฐ์ ํฌํจ๋์ง ์์ ๋ฌธ์๋ ํ์ํ์ง ์์ต๋๋ค.
ํ๊ธ์ ํฌํจ ๋น์จ์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ
ํ ์คํธ์ unicode ๋ฉํ ์ ๋ณด๋ฅผ ํตํด ํ๊ธ์ ํฌํจ ๋น์จ์ ๊ณ์ฐํด์ ํ๊ธ์ด ๊ฑฐ์ ์๋ ๋ฌธ์๋ ๋ฏธ๋ฆฌ ์ ๊ฑฐ ํด๋ก๋๋ค.
ํ์ด์ฌ์ unicodedata ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด๋ ์ข์ง๋ง, ๊ฐ๋จํ unicode table ๊ฐ์ ์ด์ฉํ์ฌ ์ฐ๋ฆฌ๊ฐ ํ์ํ ์ ํ์ผ๋ก๋ง ๊ตฌ๋ถ ํ๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ๋ ์์ต๋๋ค. (4๊ฐ์ง ์นดํ ๊ณ ๋ฆฌ๋ก ๋ถ๋ฅ: ํ๊ธ, ์๋ฌธ, ์ซ์, ๊ธฐํ)
class LanguageRatio: lang_types = Enum( "lang_type", "KOR ENG NUM ETC" ) def __init__(self): pass def is_unicode_hangul_jamo(self, val): if 0x1100 <= val and val <= 0x11FF: return True return False def is_unicode_hangul_compatibility_jamo(self, val): if 0x3130 <= val and val <= 0x318F: return True return False def is_unicode_hangul_syllables(self, val): if 0xAC00 <= val and val <= 0xD7AF: return True return False def get_unicode_type(self, val): if self.is_unicode_hangul_syllables(val): return self.lang_types.KOR if self.is_unicode_hangul_jamo(val): return self.lang_types.KOR if self.is_unicode_hangul_compatibility_jamo(val): return self.lang_types.KOR if 0x30 <= val and val <= 0x39: return self.lang_types.NUM if 0x41 <= val and val <= 0x5A: return self.lang_types.ENG if 0x61 <= val and val <= 0x7A: return self.lang_types.ENG return self.lang_types.ETC HTML escape ์ฒ๋ฆฌ, non-printable ์ฒ๋ฆฌ
๊ทธ๋ฆฌ๊ณ ์ธ์ด ๋ชจ๋ธ์ ์ ํ ํ์ํ์ง ์์, ์ถ๋ ฅ์ด ๋ถ๊ฐ๋ฅํ ์ปจํธ๋กค ์บ๋ฆญํฐ๋ฑ ์ญ์ ์ ๊ฑฐ ํด์ค๋๋ค. ASCII ํ ์ด๋ธ ์ฒซ 30์ฌ ์บ๋ฆญํฐ๋ค์ด ์ฌ๊ธฐ์ ํด๋นํ๊ฒ ์ฃ . (์. end of text)
def clean_text(self, line): filtered_characters = list(s for s in line if s.isprintable()) line = "".join(filtered_characters) line = html.unescape(line) return line ## 2. ๋ง์คํน
privacy_filter.py
ํจํด ๋งค์นญ์ด์ผ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง, ์ฒ๋ฆฌํ๋ ค๋ ๋ฏผ๊ฐ/๊ฐ์ธ์ ๋ณด๋ ๋๊ฒ ํจํด์ด ๊ท์น์ ์ด๋ฏ๋ก ์ ๊ทํํ์์ ์ด์ฉํด ์ ๊ฑฐํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ ์ฃผ์, ์ ํ๋ฒํธ, ์นด๋๋ฒํธ, ์ด๋ฉ์ผ์ฃผ์, IP์ฃผ์ ๋ฑ์ด ์์ ์ ์๊ณ , ์ข ํญ๋๊ฒ ๋ณธ๋ค๋ฉด, ์น๋ฐ์ดํฐ์์ ์ฃผ๋ก ๋ฑ์ฅํ๋ @ ๋ # ๋ฑ์ผ๋ก ์ํ(?)๋๋ ์์ด๋ ๋ฉ์ ๋ ๋ฏผ๊ฐ ์ ๋ณด๋ก ๋ณผ ์ ์๊ฒ ์ฃ ?๊ฐ ์ ๋ณด๋ณ๋ก ์ฐพ์๋ณด๋ฉด, ์ ํด์ง ํจํด์ด ์์ผ๋ฏ๋ก ๊ฐ์ ์ผ๋ จ๋ฒํธ์ ํฌ๋งท์ด์ฌ๋ ์๋ฆฟ์ ํจํด๋ฑ์ ํตํด ์ฌ๊ถ๋ฒํธ์ธ์ง, ์ด์ ๋ฉดํ์ฆ ๋ฒํธ์ธ์ง๋ ์ ์ ์๊ฒ ๋ค์.
ํด๋น ํ๋ ํจํด์ ์ฐพ์์ ํ ํฌ๋์ด์ ํ์ต์์ ์ฌ์ฉํ ํน์ ํ ํฐ์ผ๋ก ์นํ ํ๋๊ฒ์ผ๋ก ํ๊ฒ ์ต๋๋ค.
ํน์ ํ ํฐ ์์:
์ ํ ํน์ ํ ํฐ ์ฃผ์ [Address] ์ฌ๊ถ๋ฒํธ [PassportNumber] ์๋์ฐจ๋ฒํธํ [LicensePlateNumber] ์น ์ฃผ์ [URL] - ๋๊ดํธ๋ฅผ ์ด์ฉํ ์ด์ ๋ ํ ํฌ๋์ด์ ํ์ต์์ ์ค๋ช ๋๋ฆฌ๊ฒ ์ง๋ง, ๊ทธ๋ฅ ํ ์คํธ๋ด์์ ์ผ๋ฐ์ (?)์ผ๋ก ์ ๋ฐ์ํ์ง ์์ ํํ๋ก ์ง์ ํ๊ฒ์ ๋๋ค. (๋ฌผ๋ก ๋๋จธ์ง ํ ํฌ๋์ด์ ์์ ์ฌ์ฉํ ํน์ ํ ํฐ๋ค๋ ๋๊ดํธ๋ฅผ ์ด์ฉํ ์์ ์ด๋ผ์ ํต์ผ๊ฐ์ ๊ณ ๋ คํ๊ฒ๋ ์์ต๋๋ค.)
์ ์ฉ์นด๋ ๋ฒํธ:
- https://info-lab.tistory.com/292
- https://ko.wikipedia.org/wiki/%EC%B9%B4%EB%93%9C_%EB%B2%88%ED%98%B8%EC%9D%98_%EA%B5%AC%EC%84%B1
์นด๋ ๋ฒํธ์ ๊ตฌ์ฑ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . ์ด ๋ฌธ์๋ ์นด๋ ๋ฒํธ์ ๊ตฌ์ฑ์ ๊ดํ ๋ฌธ์์ด๋ค. ์ํ ๊ณ ์ ๋ฒํธ[ํธ์ง] ์ฒซ์งธ ์๋ฆฌ๋ถํฐ ์ฌ์ฏ์งธ ์๋ฆฌ๊น์ง์ ๋ฒํธ(BIN ๋ฒํธ)๋ง ๋ณด๋ฉด ํด๋น ์นด๋๋ ์ด๋ ๋๋ผ์ ์ด๋ ์นด
ko.wikipedia.org
์ฃผ๋ฏผ๋ฒํธ:
[regex] ๊ฐ์ธ์ ๋ณด ์ถ์ถ ์ ๊ทํํ์ ๋ชจ์
์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ๊ฐ์ธ์ ๋ณด์ ๋ํ ์ถ์ถ ํน์ ๊ฒ์ฆ์ ํ๊ธฐ ์ํด ์ ๊ทํํ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. 2021/01/02 - [Development] - [regex] ์ ๊ทํํ์์ด๋?(Regular Expression)์ด๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ ๋ฐ ๋ฐฉ์
info-lab.tistory.com
์ฌ์ ์ ๋ฑ๋ก๋ฒํธ:
SCIํ๊ฐ์ ๋ณด
์กฐ๋ฌ์ฒญ ๊ณต์ ๊ธฐ์ ์ ์ฉํ๊ฐ ๋ฑ๊ธํ์ธ์๋ฐ๊ธ๊ธฐ๊ด, ๊ณต๊ณต๊ธฐ๊ด์ ์ถ์ฉ ๊ธฐ์ ์ ์ฉํ๊ฐํ์ธ์ ๋ฐ๊ธ, ๋ฏผ๊ฐํ๋ ฅํ์ฒด ์ ์ถ์ฉ ๊ธฐ์ ์ ์ฉํ๊ฐํ์ธ์ ๋ฐ๊ธ. ์๋น ๊ธฐ์ ์ ์ฉํ๊ฐ๋ฑ๊ธ ์ง๋จ, ๊ธฐ์ ์ ์ฉํ๊ฐ๋ฑ๊ธ ์
www.seoulcredit.co.kr
๊ณ์ข๋ฒํธ:
์ํ๋ง๋ค ๋ฌ๋ผ์! ๊ณ์ข๋ฒํธ ์๋ฆฟ์, ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๊น?
[BY ํํฌ Finnq] [ํ๊ณ ๋๊ณต๋ถ์ค 9ํ] ๊ณ์ข๋ฒํธ์ ๋น๋ฐ!(์ด..๋ ๊ฒ๊น์ง ์๊ณ ์) 11์๋ฆฌ์์ 14์๋ฆฌ๊น์ง, ...
m.post.naver.com
์ด์ ๋ฉดํ ๋ฒํธ:
์ด์ ๋ฉดํ์ฆ - ๋๋ฌด์ํค
์ด์ ๋ฉดํ์ฆ์ ๋ถ์คํ์ ๋๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์กฐ์น๊ฐ๋ฅํ๋ค. ๊ดํ ๊ธฐ๊ด์ด ๋ค๋ฅด๋ ์ฃผ์. ์ด๋ค ๊ฒฝ์ฐ๋ ์ฃผ๋ฏผ๋ฑ๋ก์ฆ์ด ์์ผ๋ฉด ๊ฐํธํ๊ฒ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ๋ง์ ์ฌ๋๋ค์ด ์ฃผ๋ฏผ๋ฑ๋ก์ฆ ๋์
namu.wiki
์ฌ๊ถ๋ฒํธ:
์ฌ๊ถ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . ๋ค๋๋๋ ์ผ๋ฐ ์ฌ๊ถ, ๋คํ ์ธ๊ต๊ด ์ฌ๊ถ, ํด๋๋ ์ผ๋ฐ ์ฌ๊ถ, ์คํ์ธ๋ฏผ๊ณตํ๊ตญ ์๋น์ค ์ฌ๊ถ ์ฌ๊ถ(ๆ ๅธ, ๋ฌธํ์ด: ๋ ค๊ถ) ๋๋ ํจ์คํฌํธ(์์ด: passport)๋ ํด์ธ ์ฌํ์
ko.wikipedia.org
์ฐจ๋๋ฒํธํ:
๋ํ๋ฏผ๊ตญ์ ์ฐจ๋ ๋ฒํธํ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . ๋ํ๋ฏผ๊ตญ์ ์ฐจ๋ ๋ฒํธํ์ ๋ํ๋ฏผ๊ตญ์์ ๋ฑ๋ก๋๋ ๋ชจ๋ ์๋์ฐจ์ ์ ยทํ๋ฉด์ ๋ถ์ฐฉ๋๋ ์ง์ฌ๊ฐํ ๋ชจ์์ ๊ธ์ํ์ผ๋ก์, ์ ์ ๋ช ์นญ์ ์๋์ฐจ๋ฑ๋ก๋ฒํธํ์ด๋ค. ์
ko.wikipedia.org
๊ทธ๋ฆฌ๊ณ ๋ฌด์๋ณด๋ค๋ ํํ, ์ฃผ์ / ์ ํ ๋ฒํธ๋ฑ์ด ์์ต๋๋ค.
๋๋ก๋ช ์ฃผ์ ์๊ฐ | ๋๋ก๋ช ์ฃผ์ ์๋ด์์คํ
์ด์ ๋ค์ ๋๋ก๋ช ์ฃผ์ ์๊ฐ Guide bookIntroduce Road name address ๋๋ก๋ช ์ฃผ์ ์๋ด์์คํ ๋๋ก๋ช ์ฃผ์ ์๊ฐ chapter 1 ๋๋ก๋ช ์ฃผ์๋? "๋๋ก๋ช ์ฃผ์"๋ ๋ถ์ฌ๋ ๋๋ก๋ช , ๊ธฐ์ด๋ฒํธ, ๊ฑด๋ฌผ๋ฒํธ, ์์ธ์ฃผ์์ ์ํ์ฌ
www.juso.go.kr
URL์ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ ์ ๊ทํํ์์ผ๋ก ์ฒ๋ฆฌ ํ ์ ์๊ฒ ๊ณ , ๋๋จธ์ง ํจํด๋ค๋ ์ด๋ฐ์์ผ๋ก ์ ๊ทํํ์์ผ๋ก ์ฐพ์์ ํน์ ํ ํฐ์ผ๋ก ์นํํ๊ฑฐ๋, ์์์ "***" ๊ณผ ๊ฐ์ ํํ๋ก ๋ง์คํน ํ ์ ์์ต๋๋ค.
class URL(RegexPattern): ... @property def pattern(self) -> str: regex = ( '(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s"\<\>\(\)\{\}\[\]]{2,}' '|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s"\<\>\(\)\{\}\[\]]{2,}' '|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s"\<\>\(\)\{\}\[\]]{2,}' '|www\.[a-zA-Z0-9]+\.[^\s"\<\>\(\)\{\}\[\]]{2,})' ) return regex ... ## 3. ๋ถ์ฉ์ด ์ฒ๋ฆฌ
์ธ์ด๋ชจ๋ธ์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ๋ถ์ฉ์ด ์ฒ๋ฆฌ๋ ํด์ฃผ๋ฉด ์ข์๋ฏ ํฉ๋๋ค.
์์ค์ด๋ผ๊ฑฐ๋, ์ฑ์ธํค์๋ ๋ฑ์ ์ฌ์ ์ผ๋ก ๋ณด์ ํ๊ณ ์๋ค๋ฉด, ์ด๋ฐ ํจํด ์ญ์ ์ ๊ฑฐ๋ฅผ ํด๋๋ฉด ๋์ค์ ์์ฑ ๋ชจ๋ธ๋ก ํ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋ ๋งํ ๋จ์ด๋ ๋ฌธ์ฅ์ ์ฌ์ ์ ์ ์ /ํํฐ๋ง ํด๋๋ฉด ๋ชจ๋ธ์ด ์ข ๋ ์์ ํด์ง ์ ์๊ฒ ์ฃ .
์ด๋ฐ ์ฌ์ฉ์ ์ฌ์ ์ ๋ฑ์ฌ๋ ๋จ์ด๋ฅผ ํํฐ๋ง ํ๋๋ฐ์ trie ๊ธฐ๋ฐ์ ํจํด ๋งค์นญ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค. (๋ํ์ ์ผ๋ก aho-corasick ์๊ณ ๋ฆฌ์ฆ)
# ์ต์ข ๋ฐ์ดํฐ
์ฉ ๋ง์ ์์ ์๋์ง๋ง, ์ฝ 25GB ๊ฐ๋์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌ๊น์ง ์๋ฃ ํ์ต๋๋ค.
์ด๋ ๊ฒ ์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ค์์ ํ ํฌ๋์ด์ ํ์ต์ ํด๋ด ๋๋ค.
๋ฐ์ํ'ML engineer > NLP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ ๊ณ ์ด์ผ๊ธฐ] chatGPT ์ LLM์ ๋ํ ์๊ฐ (0) 2023.02.19 Transformer Encoder (0) 2022.12.31 Korean Language Model - ๋ฐ์ดํฐ ์์ง (1) 2022.12.31