[자연어 프로젝트]3주차 데이터 전처리와 서비스 구상

saeran park·2021년 3월 29일
0
post-thumbnail

수정중입니다😀

프로젝트에서 사용하는 데이터를 뉴스나 메일 데이터를 사용했으면 오타나 은어사용이 적었을텐데 학생들이 에브리타임에서 작성한 강의리뷰데이터를 가져와서 사용하다보니 전처리 해야할 부분이 굉장히 많아졌다.😢

1️⃣ 보통 전처리는 불용어 제외하고 글자수가 너무 짧지않은 것으로 정제해서 토큰화처리를 진행한다.

아래는 전처리 기본코드라고 생각하면 될 거 같다.

#1.한글
korean_data =[]
for doc in test:
    doc = re.sub("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]", "", doc)
    korean_data.append(doc)

#2.stopword
path = 'data/stopwords-ko.txt'
with open(path,encoding="utf-8") as f:
    stopwords =[word for word in f]

#3.tokenization - 품사 (형용사, 동사에 감성분석)
tokenized_doc=[]
word_doc = [] #pos사용했을 때
tokenization = input()
from konlpy.tag import Okt
tokenizer = Okt()
for doc in korean_data:
    if(tokenization == "품사"):
        token = [pair for pair in tokenizer.pos(doc) if pair[0] not in stopwords and len(pair[0]) > 1] 
        words = [word for word, pos in token]
        tokenized_doc.append(words)
        word_doc.append(token)
    if(tokenization == "단어"):
        token = [word for word in doc.split() if word not in stopwords and len(word) > 1] 
        tokenized_doc.append(token)

데이터를 출력해보면서 확인해보니 맞춤법, 띄워쓰기 잘못된 부분이 많아 동일한 단어임에도 다른 단어로 처리하고 있었다.

2️⃣ 띄워쓰기

from pykospacing import spacing

3️⃣ 맞춤법 검사

from hanspell import spell_checker

4️⃣ 이후에 또 확인해보니 반복되는 글자들을 제거해주는 패키지도 있다는 걸 알게되었다.

pip install soynlp
from soynlp.normalizer import *

해당 라이브러리를 사용하면 반복되는 글자들을 normalize할 수 있다. (이번주에 추가할 예정!)

5️⃣ lemmatization도 추가 해주기 (이부분도 이번주 추가할 예정)

이런식으로 한글은 활용될 수 있어서 동일한 의미를 갖는 것끼리는 원형으로 묶어주어야 할 거 같다!

현재는 빈도수에 기반한 임베딩을 진행했는데 빈도수바탕이다 보니 모든 단어가 벡터로 들어가게 되어 차원이 엄청나게 커져버렸다. 자연어 공부해본 팀원에게 물어보니 보통 300차원이 기본이라고한다. 다른 임베딩기법을 사용하면 우리가 직접 차원을 정할 수 있어서 이부분은 걱정을 덜어도 될 듯!
아직 기본 코드만 작성했으니 차근차근 우리 데이터에 맞게 코드를 수정해가면 될 거 같다🐰

현재까지 한글데이터 전처리 코드🙉

#1.띄워쓰기
from pykospacing import spacing  
space_doc=[]
for doc in test:
    space_doc.append(spacing(doc))
#2. 맞춤법과 한글만 남기기
from hanspell import spell_checker
checked_doc =[]
for doc in test:
    check = re.sub("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]", "", doc) #한글
    check = spell_checker.check(check).checked #맞춤법
    checked_doc.append(check) 
    
#3.stopword
path = 'data/stopwords-ko.txt'
with open(path,encoding="utf-8") as f:
    stopwords =[word for word in f]

#4.tokenization - 품사 (형용사, 동사에 감성분석)
tokenized_doc=[]
word_doc = []
tokenization = input()
from konlpy.tag import Okt
tokenizer = Okt()
for doc in checked_doc:
    if(tokenization == "품사"):
        token = [pair for pair in tokenizer.pos(doc) if pair[0] not in stopwords and len(pair[0]) > 1] 
        words = [word for word, pos in token]
        tokenized_doc.append(words)
        word_doc.append(token)
    if(tokenization == "단어"):
        token = [word for word in doc.split() if word not in stopwords and len(word) > 1] 
        tokenized_doc.append(token)
    if(tokenization == "형태소"):
        token = [word for word in tokenizer.morphs(doc,stem=True) if word not in stopwords and len(word) > 1] 
        tokenized_doc.append(token)
print(len(tokenized_doc))
print(len(word_doc)) #품사일때

한주동안 느낀점🙈

한글이 전처리하기 정말 어려운거 같다.. 사람들마다 사용하는 단어도 다르고 신조어도 너무 많고 집단마다 사용하는 은어도 다르고 😭 게다가 오타가 있어도 무슨의미인지 다 이해가 된다는 점💭 예전에 에어비앤비 해외에서 이용한 후기를 우리나라 사람들끼리만 알아볼 수 있도록 오타를 일부러 내면서 작성한 것이 있는데 이번 전처리를 하면서 그게 생각났다. 근데 또 이게 하나의 방법이 될 수도,,,! 앞으로 인공지능이 사람들의 생각을 모두 읽을텐데 인공지능으로부터 피할 수 있는 하나의 방법이 될 수 있을 거 같다. 역시 한글 짱짱쓰~👍

profile
데이터사이언스 학부생

0개의 댓글