๐ ๋์์ด(์ ์์ด) ๊ต์ฒด ๊ธฐ๋ฒ์ ์ฌ์ฉํ ๋ฐ์ดํฐ ์ฆ๊ฐ ์คํฌ๋ฆฝํธ
1๏ธโฃ ํ์ด์ฌ ํจํค์ง ๊ด๋ฆฌ์์ธ pip๋ฅผ ์ฌ์ฉํ์ฌ konlpy ํจํค์ง ์ค์น
!pip install konlpy
โป konlpy ๋?
konlpy๋ ํ๊ตญ์ด ์์ฐ์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ํจํค์ง๋ก ํํ์ ๋ถ์์ ํ์ฌ ํ๊น , ๊ตฌ๋ฌธ ๋ถ์ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
konlpy๋ฅผ ์ค์นํ๋ฉด ์ ๋ค์ํ ํ๊ตญ์ด ์์ฐ์ด ์ฒ๋ฆฌ ์์ ์ ์ ์ฉํ ํด๋์ค์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
2๏ธโฃ ํ์ด์ฌ ํจํค์ง ๊ด๋ฆฌ์์ธ pip๋ฅผ ์ฌ์ฉํ์ฌ nltk ํจํค์ง ์ค์น
!pip install nltk
โป NLTK ๋?
NLTK๋ Natural Language Toolkit์ ์ฝ์๋ก, ์์ฐ์ด ์ฒ๋ฆฌ(Natural Language Processing, NLP) ์์ ์ ์ฌ์ฉ๋๋ ์คํ ์์ค ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
NLTK๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์ฅ ํ ํฐํ๋ ํํ์ ๋ถ์, ๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ ๋ถ์ ๋ฑ ๋ค์ํ ์์ฐ์ด ์ฒ๋ฆฌ ๊ด๋ จ ์์ ์ ์ํํ ์ ์๋ค.
3๏ธโฃ Konlpy ํจํค์ง์์ Komoran ํด๋์ค import + nltk ํจํค์ง์์ wordnet ๋ฐ์ดํฐ ๋ค์ด๋ก๋
from konlpy.tag import Komoran
from nltk.corpus import wordnet
import random
import nltk
nltk.download('wordnet')
Komoran ํด๋์ค | wordnet | random ๋ชจ๋ |
ํ๊ตญ์ด ํํ์ ๋ถ์ ๋๊ตฌ ์ ๊ณต | ์์ด ๋์์ด ์ฌ์ | ๋๋คํ ๋์ ์ํ์ ์ํ ๋ชจ๋ |
4๏ธโฃ ์ฃผ์ด์ง ๋จ์ด์ ๋์์ด(์ ์์ด)๋ฅผ ๊ฐ์ ธ์ค๋ get_synonyms ํจ์ ๊ตฌํ
def get_synonyms(word):
# ์ฃผ์ด์ง ๋จ์ด์ ๋์์ด(์ ์์ด)๋ฅผ ๊ฐ์ ธ์ค๊ธฐ
synonyms = []
for syn in wordnet.synsets(word):
for lemma in syn.lemmas():
synonyms.append(lemma.name())
if word in synonyms:
synonyms.remove(word)
return list(set(synonyms))
โ wordnet.synsets(word)๋ฅผ ์ฌ์ฉํ์ฌ WordNet์์ ์ฃผ์ด์ง ๋จ์ด์ ๋์์ด ์งํฉ์ธ "synset" ๊ฐ์ ธ์ค๊ธฐ
--> ๊ฐ๊ฐ์ synset์ ํด๋น ๋จ์ด์ ์๋ฏธ์ ๊ด๋ จ๋ ๋จ์ด ๊ทธ๋ฃน์ ๋ํ๋
โ ๊ฐ synset์ lemmas() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ด(lemma)๋ฅผ ๊ฐ์ ธ์ค๊ธฐ
--> lemmas() ๋ฉ์๋๋ synset์ ์ํ๋ ๋จ์ด๋ค์ ๊ฐ์ฒด ๋ฐํ
โ ์๋ณธ ๋จ์ด๊ฐ ๋์์ด ๋ฆฌ์คํธ์ ํฌํจ๋์ด ์์ ๊ฒฝ์ฐ ์ ๊ฑฐ
--> ์ค๋ณต ๋์์ด ์ ๊ฑฐ๋ฅผ ์ํด list(set(synonyms)) ์ฌ์ฉ
5๏ธโฃ ๋จ์ด๋ฅผ ๋๋คํ๊ฒ ๋์์ด๋ก ๊ต์ฒดํ๋ replace_with_synonym ํจ์ ๊ตฌํ
def replace_with_synonym(text, p=0.5):
"""
์ฃผ์ด์ง ํ
์คํธ์์ ์ผ๋ถ ๋จ์ด๋ฅผ ๋๋คํ๊ฒ ๋์์ด๋ก ๊ต์ฒด
"""
words = Komoran().morphs(text)
new_words = []
for word in words:
if random.uniform(0, 1) < p:
synonyms = get_synonyms(word)
if synonyms:
new_words.append(random.choice(synonyms))
else:
new_words.append(word)
else:
new_words.append(word)
return ' '.join(new_words)
โ ํจ์ ๋ด๋ถ์์ Komoran().morphs(text)๋ฅผ ํตํด ์ ๋ ฅ๋ ํ ์คํธ๋ฅผ ํํ์ ๋จ์๋ก ๋ถํ
--> ํ ์คํธ๋ฅผ ๋จ์ด ๋จ์๋ก ์ฒ๋ฆฌ
โ ๊ฐ ๋จ์ด๋ฅผ ์ํํ๋ฉฐ random.uniform(0, 1)์ ํตํด ํ๋ฅ p์ ๋น๊ต
--> p๋ ๋จ์ด๋ฅผ ๋์์ด๋ก ๊ต์ฒดํ ํ๋ฅ ์ ์ง์ ํ๋ ๋งค๊ฐ๋ณ์
โ ํ๋ฅ p๋ณด๋ค ์์ ๊ฐ์ด ๋์จ ๊ฒฝ์ฐ, ํด๋น ๋จ์ด์ ๋์์ด ๊ฐ์ ธ์ค๊ธฐ
--> get_synonyms(word) ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ด์ง ๋จ์ด์ ๋์์ด ๋ฆฌ์คํธ ํ๋ณด
โ ๋์์ด ๋ฆฌ์คํธ ์กด์ฌ ์ฌ๋ถ์ ๋ฐ๋ผ ๋จ์ด ์ฒ๋ฆฌ
๋์์ด ๋ฆฌ์คํธ ์กด์ฌ O | ๋์์ด ๋ฆฌ์คํธ ์กด์ฌ X |
๋์์ด ๋ฆฌ์คํธ์์ ๋๋คํ๊ฒ ํ๋์ ๋์์ด ์ ํ | ์๋ ๋จ์ด ๊ทธ๋๋ก ์ฌ์ฉ |
6๏ธโฃ ํ ์คํธ ๋ฐ์ดํฐ ์ฆ๊ฐ ๊ฒฐ๊ณผ ์ถ๋ ฅ
# ํ
์คํธ ๋ฐ์ดํฐ
text = "์ฆ๊ฐํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ"
# ๋ฐ์ดํฐ ์ฆ๊ฐ ์ ์ฉ
augmented_data = []
# ์๋ณธ ๋ฐ์ดํฐ ์ถ๊ฐ
augmented_data.append(text)
# ๋์์ด ๊ต์ฒด
augmented_data.append(replace_with_synonym(text))
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
for data in augmented_data:
print(data)
โป ์์ด data ์ฆ๊ฐ์ ์ฑ๊ณต, ํ๊ตญ์ด ๋ฐ์ดํฐ ์ฆ๊ฐ์ ๋ชจ๋ ํธํ์ฑ ๋ฌธ์ ๋ก ์์ง ์๋ ์ค!