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()
데이터를 보면 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]
NLP -> Hannanum / okt 명사 추출
NLP1[1]
from konlpy.tag import Hannanum
hannanum = Hannanum()
okt.nouns(NLP1[1])
hannanum.nouns(NLP1[1])
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
'도전 : 더 나은 사람으로 > 텍스트 산업 분류 공모전' 카테고리의 다른 글
[2022 통계청 공모전] 3. embedding_model (0) | 2022.05.09 |
---|---|
[2022 통계청 공모전] 2. remove stopwords (불용어 처리) (0) | 2022.05.08 |
[2022 통계청 공모전] 1. bigword split (0) | 2022.05.06 |
[2022 통계청 공모전] Word2Vec이란? (0) | 2022.05.04 |
[2022 통계청 공모전] 통계데이터 인공지능 활용대회 (0) | 2022.05.03 |