반응형

💬 비윤리적 텍스트 검출 데이터셋 분석

  • 지난 장에서, '텍스트 윤리검증 데이터'의 train, validation, test 데이터의 양과 형태에 대해서 확인해보았다.
  • 이번 장에서는, 텍스트 데이터를 조금 더 자세하게 분석해보기로 한다.
  • 텍스트 데이터를 분석하는 것은 추후 불용어나, 텍스트 정수 인코딩에서 빈도수 제한을 거는 등에 활용되어, 더 좋은 모델을 만드는데 사용될 수 있다.

  • 텍스트의 윤리검증 기준은 사람마다 다르다. 데이터셋을 구성한 명확한 기준을 알 수 없기에, 우선 데이터셋으로 구성된 비윤리적 텍스트들에는 어떠한 공통점이 있는지 확인해보면 좋을 것이다.

 

data_dir = r"{설치위치}\data\val"
df = pd.read_csv(data_dir, sep='\t', header=None)
df_true = df[df[1]==True]

우선, validation 데이터 파일을 다시 불러온다.(train 데이터의 텍스트를 분석하는 것이 더 좋겠지만, 너무 양이 많아서 오래 걸린다.

 

from konlpy.tag import Hannanum

word_parser = Hannanum()

text_list = list(df_true[5].values)
word_list = []

for text in text_list:
    word_list += word_parser.morphs(text)

 

"Hannanum"이라는 한국어 형태소 분석기를 통해, 데이터셋에 존재하는 text들을 parsing할 것이다. 형태소 분석을 하는 이유는, 형태소 단위로 의미있는 형용사나 명사를 추출하기 위함이다. 

위의 코드에서 "비윤리적" 텍스트들을 형태소 단위로 parsing하여 "word_list"에 넣어주었다. 

 

"word_list"에는 "비윤리적" 텍스트들이 list 형태로 들어가있다. 그중 여러 텍스트들에서 공통되는 단어들은 중복으로 들어가 있을 것이다. 우리는 어느 단어가 많이 등장하는지를 확인하기 위해, "Counter" 함수를 사용할 것이다.

 

from collections import Counter

c = Counter(word_list)
c_dict = dict(c)
c_dict = sorted(c_dict.items(), reverse=True, key=lambda item: item[1])

"word_list"를 "Counter" 함수를 통해 각 단어의 빈도수를 구했고, "sorted" 함수를 통해, 빈도수대로 정렬하였다.

 

비윤리적 텍스트 데이터 단어 빈도수

 

빈도수를 확인해보면, '이','하','는' 등등 "비윤리적" 텍스트들의 특징이라기보다는 한국어 텍스트 데이터들에서 공통으로 찾아볼 수 있는 단어들이 많이 등장하는 것을 볼 수 있다.

 

보통 검색엔진 등에서는 index 구성 시, stopword(불용어)라는 단계를 추가하여 이러한 데이터들을 제거하는데, 우리는 아직 데이터 분석 단계니, 해당 과정을 거치지 않는다. 

 

한 글자로는공통되는 단어가 직관적으로 파악되지 않아, 2글자 이상의 글자만 다시 확인해본다.  

 

word_list = [word for word in word_list if len(word)>1]

c = Counter(word_list)
c_dict = dict(c)
c_dict = sorted(c_dict.items(), 
                              reverse=True, 
                              key=lambda item: item[1])

2글자 이상에서 다시 확인해보니, 의미 있는 단어들이나, 이해가는 단어들이 등장하기 시작하였다. 

 

마찬가지로, 3글자 이상도 추출해본다. 

한 눈에 봐도, 비윤리적으로 보이는 단어들도 다수 등장한다.

 

해당 과정을 반복하면, 단어의 길이가 길수록 빈도수는 적지만, 단어 그 자체로 좋지 않은 의미를 담고 있는 단어들이 많다는 것을 확인 할 수 있다.

 

추후에 word를 정수로 인코딩하는 과정이 들어가는데, word_list에 존재하는 frequency에 따라 해당 단어를 정수로 encoding 할 것인지, 모르는 단어로 놔둘 것인지 설정할 수 있다.

 

이 단계에서 encoding 단계에서 매우 낮은 frequency 기준을 잡아야겠다는 생각을 할 수 있다.

 

 

사실, 이 단계에서 끝내도 되지만, 이왕한 김에 빈도를 wordcloud로 확인해보기로한다. 

 

from wordcloud import WordCloud
import matplotlib.pyplot as plt

wc = WordCloud(font_path='malgun', width=400, height=400, scale=2.0, max_font_size=250)
gen = wc.generate_from_frequencies(c)
plt.figure()
plt.imshow(gen)

 

 

2글자 이상의 데이터를 wordcloud 한 결과는 다음과 같다. (2글자까지는 그나마, 모자이크가 필요없다.)

 

윤리적 데이터에 대해서도 wordcloud를 만들어본다. 

내가 평소에 많이하는 '아니', '어서', '진짜' 같은 단어 들이 많다. 

 

데이터들을 직접 살펴보면서 분석의 방향을 잡은 것은 다음과 같다.

1. 윤리적 기준이 사람마다 달라서 단순 단어의 유무로 판단하는 것은 문제가 있다. (문맥을 파악해야할 것 같다.)
2. 글자 하나가 있냐 없냐에 따라, 의미가 완전히 달라져서 불용어를 최대한 조심해서 사용해야할 것 같다.
3. 긴 단어일수록, 데이터셋 내에서 빈도수는 적지만, 그 단어 하나가 판정에 powerful한 역할을 할 것 같다.
4. 데이터셋의 비윤리적 텍스트와 윤리적 텍스트의 양에 어느 정도 차이가 있다.  (Class Imbalance가 일어날 정도는 아닌 것 같은데, 추후 확장을 생각했을 때 고려해야한다.)
5. 윤리적/비윤리적 데이터의 소스가 비슷해서 그런지 서로 겹치는 단어들이 너무 많다. 추후 확장성을 생각한다면 윤리적 데이터를 추가적으로 더해서 학습해야할 것 같다. 
6. 형태소 분석에 시간이 꽤나 오래 걸려서, 미리 전처리를 해놔야겠다. 

 

지금까지 데이터를 분석해보았다. 다음 장부터, 본격적으로 데이터 모델을 만들고 처리하는 과정을 담도록 하겠다.

+ Recent posts