본문 바로가기
Study/NLP (Natural language processing)

[NLP] Pytorch 영어 뉴스 텍스트 데이터 분류 (AG news dataset) (1) - 전처리

by 후이 (hui) 2022. 4. 12.
728x90
반응형

 

Pytorch로 영어 뉴스 텍스트 데이터 분류 문제를 풀어보겠다. 

 

이번 포스팅에서는 텍스트 전처리 코드만 다루고

다음 포스팅에서 pretrained model glove와 gru로 학습을 진행하려한다.

 

참고 link : https://jdjin3000.tistory.com/15

전체 코드 (colab) : https://colab.research.google.com/drive/1EGW7J1Goey86D5UdUT-aKCBzi7R_Nrsj?usp=sharing 

전체 코드 (github) : https://github.com/SeohuiPark/MLDLstudy/blob/main/NLP/AGnews_preprocessing.ipynb

 

 

 

0. 데이터와 Task 

 

데이터 : AGnews 

https://www.kaggle.com/datasets/amananandrai/ag-news-classification-dataset

 

AG News Classification Dataset

News articles of class "world", "sports", "business", and "Science"

www.kaggle.com

 

뉴스 제목, 기사 데이터와 함께 클래스가 표시 되어있다.

토픽 1은 세계 뉴스, 2는 스포츠 뉴스, 3은 경제 뉴스, 4는 과학 뉴스다.

위의 데이터를 활용해서 뉴스 제목, 기사 만으로 클래스를 분류하는 모델을 만들고자 한다. 

 

 

1. data load 

def data_load():

    ### data load 
    data_path = "/content/drive/MyDrive/Colab Notebooks/2022_pytorch/data/"
    data = pd.read_csv(data_path + 'AGnews_train.csv', header = None)
    data.columns = ['label','title','description']
    display(data.head(10))

    # topics = {1: 'world',
    #           2: 'sports',
    #           3: 'business',
    #           4: 'science'} # Originally "Sci/Tech"

    print(data.shape)
    print(data['label'].value_counts())
    data['all_text'] = data['title'] + ' ' + data['description'] ### 제목과 기사 내용 합치기     

    return data

 

데이터는 AGnews 뉴스 데이터이다.

해당 데이터는 pytorch에서 제공하는 기본 데이터 셋으로 아래와 같이 불러올 수도 있다. 

import torch
from torchtext.datasets import AG_NEWS
train_iter = iter(AG_NEWS(split='train'))

 

대신 위와 같이 받을 경우에는 torch.data.dataset 형태가 되는데, 

여기서 바로 텍스트 전처리 적용하는게 골치가 아프고 데이터 일일이 뜯어보는건 csv 파일이 편해서 나는 첫번째 방법을 택했다.

 

 

 

2. lemmatization - 표제어 추출

def lemmatization(POS_list, DROP_1WORD):
    lemma_list = []
    lemmatizer = nltk.stem.WordNetLemmatizer()
    
    for sentence in POS_list:
        #Lemmatize 함수를 사용할 때, 해당 토큰이 어떤 품사인지 알려줄 수 있다. 만약 품사를 알려주지 않는다면 올바르지 않은 결과가 반환될 수 있다.
        #Lemmatize 함수가 입력받는 품사는 동사, 형용사, 명사, 부사 뿐이다. ===>  각각 v, a, n, r로 입력받는다.
        
        #nltk.pos_tag로 반환받는 품사 중, 형용사는 J로 시작하기 때문에 lemmatize 전에 a로 바꿔줘야 한다.
        func_j2a = lambda x : x if x != 'j' else 'a'
        
        #동사, 형용사, 명사, 부사만 걸러내기 
        pos_contraction = [(token, func_j2a(POS.lower()[0])) for token, POS in sentence if POS[0] in ['V', 'J', 'N', 'R']]
        
        #1글자 drop + lemmatization
        if DROP_1WORD: 
            for token, POS in pos_contraction :
                if len(token) != 1: 
                    lemma_list.append(lemmatizer.lemmatize(token, POS))
        else: #1글자 짜리 token도 포함시키는경우
            lemma_list.append([lemmatizer.lemmatize(token, POS) for token, POS in pos_contraction])

    return lemma_list

0) input "POS_list" 는 pos tagging 된 wordlist 

1) 품사 태깅중 형용사는 a로 바꿔주기 

2) v 동사, a 형용사, j 부사, n 명사 lemmatization 

3) drop 1word 파라미터로 1글자 단어 탈락시킬지 가져갈지 여부 결정 

4) output "lemma_list" 는 표제어 추출한 단어만 담긴 리스트 

 

 

 

3. stop word - 불용어 제거 

 

def remove_stopwords(lemma_list):
    no_stopword_list = list()
    stop_words = set(nltk.corpus.stopwords.words('english')) # 불용어 불러오기 
    for lemma_word in lemma_list:
        if lemma_word not in stop_words:
            no_stopword_list.append(lemma_word)
    return no_stopword_list

 

불용어 list에 담겨있지 않은 토큰만 no_stopword_list에 담기 

최종적으로 표제어 추출, 불용어 제거된 clean 한 텍스트 토큰만 저장된다. 

전체 코드는 위의 링크를 참조 ! 

 

 

전처리 된 데이터를 따로 저장해둔 뒤에

다음 포스팅에서 pytorch GRU 로 뉴스 분류 모델을 만들어보겠다 !

 

728x90
반응형

댓글