본문 바로가기
  • 데이터에 가치를 더하다, 서영석입니다.
도전 : 더 나은 사람으로/텍스트 산업 분류 공모전

[2022 통계청 공모전] 0. tokenized

by 꿀먹은데이터 2022. 5. 5.

Tokenizing

  • 문장을 분해하여 관계를 만들어 준다.
  • 2차원 이상으로의 벡터로 만들어준다.
  • 자연어의 전처리와 결과의 해석이 중요하다.
  • Document -> Tokenizing -> Tagging 의 방식으로 Word2Vec으로 사용한다.

이외의 토크나이저의 과정에서의 EDA를 진행하였다.

필요패키지 설치
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import matplotlib.pylab as plt
data= pd.read_csv('data.txt', sep ='|',encoding='CP949', header=0)
submission= pd.read_csv('submission.txt', sep ='|',encoding='CP949', header=0)
data.head()

data

데이터를 보면 digit_1,digit_2,digit_3으로 대분류 중분류 소분류로 나눠진 것을 볼 수 있다. 우리가 결정하려는 Y값으로 생각하면 된다.

submission.head()

ks의 경우, 한국표준산업분류에 따라 소분류,중분류,대분류가 결정되므로 가져왔다.

ks = pd.read_csv('한국표준산업분류(10차)_국문_test.csv',encoding='CP949',header=2)

data의 digit_1,2,3과 ks의 대분류,중분류,소분류에서의 비교를 통한 분석을 진행하려고 한다.

#input 세부항목명으로 들어갈 경우
input3 = ks[['코드.3','항목명.3']].dropna()
input3 = input3.reset_index(drop=True)
input3['코드.3']=input3['코드.3'].astype(int)
input3['항목명.3']=input3['항목명.3'].str.rstrip('업')
input3.rename(columns={'코드.3':'digit_3'},inplace=True)
input3.rename(columns={'항목명.3':'NLP'},inplace=True)
input3.head()

NLP의 한문장으로 묶음

col = ['text_obj','text_mthd','text_deal']
NLP = data[col].apply(lambda row: ' '.join(row.values.astype(str)), axis=1)
NLP.head()

df = data[['AI_id','digit_3']].copy()
df['NLP'] = NLP
df_concat=pd.concat([df,input2])
df_concat['NLP']=df_concat1['NLP'].astype(str)
df_concat.reset_index(inplace=True)
NLP = df_concat1['NLP']

텍스트 정제 함수

: 한글 이외의 문자는 전부 제거한다. (text_cleaning)

import re
def text_cleaning(text):
    hangul = re.compile('[^ ㄱ-ㅣ가-힣]+') # 한글의 정규표현식을 나타낸다.
    result = hangul.sub('', text)
    return result

konlpy에서의 tag select

konlpy에서 제공하는 Hannanum(), Kkma(),Komoran(),Okt() 등 중 hannanum과 okt의 성격이 산업분류에 맞는 것 같아 이 둘을 적용하였다.

from konlpy.tag import *

hannanum = Hannanum()
okt = Okt()
#kkma = Kkma()
#komoran = Komoran()

hannanum tagests 확인

hannanum에서의 기호와 품사를 보고 이에 맞는 동사, 명사만을 가져와 처리하면 어떨까 싶었다.

tagsets = pd.DataFrame()
N = 18
tagsets["hannanum-기호"] = list(hannanum.tagset.keys()) + list("*" * (N - len(hannanum.tagset)))
tagsets["hannanum-품사"] = list(hannanum.tagset.values()) + list("*" * (N - len(hannanum.tagset)))
tagsets

 text_cleaning 함수 이용.

for i in NLP1:
  text_cleaning(i)
from nltk import Text
#for i in range(10):
#   a.append(okt.nouns(NLP[i]))
kolaw = Text(NLP, name="kolaw")
kolaw[-1]

가장 마지막 text 확인

NLP -> Hannanum / okt 명사 추출

NLP1[1]

from konlpy.tag import Hannanum
hannanum = Hannanum()
okt.nouns(NLP1[1])

okt에서의 명사 변환 및 추출

hannanum.nouns(NLP1[1])

hannanum에서의 명사 변환 및 추출

okt에서의 tokenized 생성

tokenized_okt = []
for i in range(len(NLP)):
  tokenized_okt.append(okt.nouns(NLP[i]))

 

hannanum에서의 tokenized 생성

#hannanum
tokenized_hannanum = []
for i in range(len(NLP)):
  tokenized_hannanum.append(hannanum.nouns(NLP[i]))

 

pickle 패키지를 이용한 토크나이저 저장

#okt save
import pickle
with open('/content/drive/MyDrive/통계청_AI경진대회/data/tokenized_okt','wb') as f:
    pickle.dump(tokenized_okt,f)
    
#hannanum save
with open('/content/drive/MyDrive/통계청_AI경진대회/data/tokenized_hannanum','wb') as f:
    pickle.dump(tokenized_hannanum,f)

[참고] pickle 패키지를 이용하여 토크나이저 여는 방법

import pickle
with open('tokenized_okt','rb') as f:
    contents = pickle.load(f)

자세한 코드는 저의 깃허브를 참고하시면 됩니다.

https://github.com/rootofdata/kostat_AI_contest

 

GitHub - rootofdata/kostat_AI_contest

Contribute to rootofdata/kostat_AI_contest development by creating an account on GitHub.

github.com