파이톨치

[데이터 전처리] Mecab 을 사용하여 단어를 토큰화하기 본문

프로젝트

[데이터 전처리] Mecab 을 사용하여 단어를 토큰화하기

파이톨치 2022. 9. 3. 15:34
728x90

 

기본 전처리

사용 데이터는 AI 허브의 감성 대화 말뭉치이다. 

 

df_train = pd.read_excel('train.xlsx', engine='openpyxl')
df_test = pd.read_excel('test.xlsx', engine='openpyxl')

df_train.replace(np.nan, '', inplace=True)

ls = {}
df = pd.DataFrame(ls)
df['문장'] = df_train[['사람문장1', '사람문장2',
                     '사람문장3', '사람문장4']].apply(' '.join, axis =1)

df['감정'] = df_train['감정_대분류']

df['문장'].replace('', np.nan, inplace=True)
print(df.isnull().values.any())
print(df.isnull().sum())
df = df.dropna(how = 'any')

 

다음과 같이 데이터를 불러와서 사람문장에 해당하는 데이터로 새로운 데이터를 만들어 주면 다음과 같이 나온다.

 

 

 

감정에 해당하는 문장이 잘 들어갔다. 

하지만 다음 코드를 사용해서 문장의 감정 값을 보자. 

df['감정'].unique()

그러면 감정이  array(['기쁨', '불안', '당황', '슬픔', '분노', '상처', '불안 ', '기쁨 '], dtype=object) 다음과 같이 나온다.

'불안 ', '기쁨 '의 경우는 아마 잘 못 들어간 데이터이다. 때문에 이런 데이터를 수정해주어야 한다.

df['감정'][df['감정'] == '기쁨 '] = '기쁨'
df['감정'][df['감정'] == '불안 '] = '불안'

 

다음 코드를 사용하면 수정해줄 수 있다. 

 

# 한글과 공백을 제외하고 모두 제거
df['문장'] = df['문장'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]","")

 

다음 코드 사용시 특수문자와 같은 것들을 지워줄 수 있다.

 

그래프를 그려볼 수 있다. 하지만 그냥 그래프를 그리면 한글이 깨져서 다음 코드를 사용해주어야 한다. 

 

참고로 맥북 기준이다.

 

from matplotlib import rc
rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False

 

이 코드를 사용하면 

df['감정'].value_counts().plot(kind='bar')

다음과 같이 감정의 분포를 살펴볼 수 있다. 불안한 감정이 제일 많지만 대부분의 감정이 비슷하게 있어서 그대로 진행해도 괜찮을 것 같다.

데이터 분포가 불균형한 경우에는 그에 맞는 작업을 해주어야 한다. (예: 오버샘플링)


Mecab 오류 시 다음 링크 참고 

https://jung0228.tistory.com/56

 

[Mecab 오류] Exception: Install MeCab in order to use it: http://konlpy.org/en/latest/install/

Mecab 오류 : Exception: Install MeCab in order to use it: http://konlpy.org/en/latest/install/ 오류를 해결하기 위해서 저 링크를 타고 들어갔다. bash <(curl -s https://raw.githubusercontent.com/konl..

jung0228.tistory.com


from konlpy.tag import Mecab

stopwords = ['도', '는', '다', '의', '가', '이', '은', '한',
             '에', '하', '고', '을', '를', '인', '듯', '과',
             '와', '네', '들', '듯', '지', '임', '게', '것',
             '어', '겠', '있', '군요', '해', '계섯', '시',
             '나', '셨', '을까요', '으로']

mecab = Mecab()

train_data['tokenized'] = train_data['문장'].apply(mecab.morphs)
train_data['tokenized'] = train_data['tokenized'].apply(lambda x: [item for item in x if item not in stopwords])
test_data['tokenized'] = test_data['문장'].apply(mecab.morphs)
test_data['tokenized'] = test_data['tokenized'].apply(lambda x: [item for item in x if item not in stopwords])
train_data

다음 코드를 사용시 아래와 같이 토큰화를 할 수 있다.

 

728x90