텍스트 전처리 수행하기

2020. 12. 13. 12:20

이전 포스팅에서 티스토리 블로그의 글을 수집하였다. 오늘은 이 데이터를 정제하고, 품사 단위로 분리하는 작업을 해보고자 한다. 이보다는 딥러닝 모형에 학습을 시켜, 테스트를 만들어보는 것이 목적이기 때문에, 이 부분은 간단하게만 해 보고자 한다.

 

텍스트



작업은 크게 3가지 단계로 이루어져 있다. 우선 불용어를 제거한다. 그리고, 품사 단위로 텍스트를 분리한다. 보통 이를 '토큰화'한다고 한다. 이후에 불필요한 토큰을 제거한다.

작업을 하다보니, 클래스로 만드는 것이 편리할 것 같아 그렇게 하였다. 품사 태깅은 konlpy라는 패키즈를 이용하면 된다. 해당 패키지에는 품사 태깅을 해주는 여러가지 태거가 있다. 그 중에서 komoran을 이용하여 품사 태깅을 하였다. 작업을 하다보니 품사 태깅이 되지 않은 단어들을 추가해야 하는데, Komoran이 가장 편리햇기 때문이다. 작성한 코드는 아래와 같다.

from konlpy.tag import Okt
from tqdm import tqdm
from konlpy.tag import Komoran

class TextPreprocessing:
    """
        한국어 전처리 클래스
    """
    def __init__(self, method="komoran"):
        # 불용어 정의
        self.stopwords = ['의', '가', '이', '은', '들', '는', '좀', '잘', '걍', '과', '도', '를', '으로',
                          '자', '에', '와', '한', '하다', "차", "수", "것", "쯤"]
        self.twitter = Okt()
        self.komoran = Komoran(userdic="./user_dic.dic")
        self.method = method

        pass

    def text_preprocessing(self,sen):
        """
            문장 전처리
        :param sen: 전처리할 문장
        :return: 처리후 문장
        """
        replace_dic={",":" ", "\xa0":" ", "\n":" ", ".":" "
                     ,"(adsbygoogle = window adsbygoogle || []) push({}):":""
                     ,"[^ㄱ-ㅎㅏ-ㅑ가-힣]":" "}

        for key in replace_dic:
            sen = sen.replace(key, replace_dic.get(key))

        return sen

    def tagging(self, sen):
        """
        형태소 분리
        :param sen: 형태소 분리할 문장
        :return: 형태소 분리된 결과
        """
        sen = self.text_preprocessing(sen)
        if self.method=="twitter":
            # temp-self.twitter.morphs(sen, stem=True)
            temp=self.twitter.nouns(sen)
        elif self.method=="komoran":
            temp = self.komoran.nouns(sen)

        tag_result=[word for word in temp if not word in self.stopwords]

        return tag_result

if __name__ == '__main__':
    tp = TextPreprocessing()
    tag_result=tp.tagging("텍스트 딥러닝과 관련된 내용들은 인터넷이나 유투브로 이미 많은 자료를 찾을 수 있었다.")
    print(tag_result)

 

main을 만들고, 문장 하나를 테스트 해 보았다. 일부 단어가 분리되지 않아 사용자 사전을 추가한 결과, 아래와 같은 결과를 얻을 수 있었다. 단어가 너무 많으면 잘 되지 않을 것 같아서, 일단 명사만 추출하도록 하였다.

 


출력결과)
['텍스트', '딥러닝', '관련', '내용', '인터넷', '유투브', '자료']

 

다음에는 원-핫 인코딩을 통해, 텍스트를 생성하는 작업을 해보고자 한다.

댓글()