๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ’๏ธ Kibwa Voice Phishing Prev Project/Data Processing

[Data Processing] ๋™์˜์–ด(์œ ์˜์–ด) ๊ต์ฒด๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•(Data Augmentation) ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

by A Lim Han 2023. 7. 14.

๐Ÿ™ ๋™์˜์–ด(์œ ์˜์–ด) ๊ต์ฒด ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ• ์Šคํฌ๋ฆฝํŠธ

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 ์ฆ๊ฐ•์€ ์„ฑ๊ณต, ํ•œ๊ตญ์–ด ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์€ ๋ชจ๋“ˆ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์•„์ง ์‹œ๋„ ์ค‘!