수정중입니다😀
프로젝트에서 사용하는 데이터를 뉴스나 메일 데이터를 사용했으면 오타나 은어사용이 적었을텐데 학생들이 에브리타임에서 작성한 강의리뷰데이터를 가져와서 사용하다보니 전처리 해야할 부분이 굉장히 많아졌다.😢
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)) #품사일때
한글이 전처리하기 정말 어려운거 같다.. 사람들마다 사용하는 단어도 다르고 신조어도 너무 많고 집단마다 사용하는 은어도 다르고 😭 게다가 오타가 있어도 무슨의미인지 다 이해가 된다는 점💭 예전에 에어비앤비 해외에서 이용한 후기를 우리나라 사람들끼리만 알아볼 수 있도록 오타를 일부러 내면서 작성한 것이 있는데 이번 전처리를 하면서 그게 생각났다. 근데 또 이게 하나의 방법이 될 수도,,,! 앞으로 인공지능이 사람들의 생각을 모두 읽을텐데 인공지능으로부터 피할 수 있는 하나의 방법이 될 수 있을 거 같다. 역시 한글 짱짱쓰~👍