• 8주차 과제 : Text data 처리

    image image

    • 사용 언어 : python
    • 해결 날짜 : 2021-11-15
    • 코드 설명 :

      • aclimdb 데이터를 train과 test로 나누어서 가져오고, train/test 데이터 안의 HTML 줄바꿈 태그인
        을 삭제해준다.
      • CounterVectorizer()로 텍스트에서 단위별로 등장 횟수를 카운팅하여 수치 벡터화 하되, 불용어를 사용하지 않은 BOW 표현법/불용어를 사용한 BOW 표현법과 min_df 값을 변화시킬 때의 4가지 경우를 측정하였다.
      • 또한 train/data 데이터를 각각 BOW 방법으로 나타낼 경우 각 feature의 값이 달라 같은 분류기를 사용하지 못하기 때문에 두 데이터 모두 사용하여 단어 사전 구축 및 불용어 처리를 하였다.
      • 분류기로는 LogisticRegression을 사용하였고, 그 결과 데이터 단어 사전 미구축 및 불용어 처리를 안한 경우가 0.88943999999로 가장 높은 성능을 가졌다.
    • 결과 : image image image image image

    • 코드

      from sklearn.datasets import load_files
      import numpy as np
      
      reviews_train = load_files("./aclimdb/train/")
      reviews_test = load_files("./aclimdb/test/")
      
      train_text, train_target = reviews_train.data, reviews_train.target
      test_text, test_target = reviews_test.data, reviews_test.target
      
      train_text = [doc.replace(b"<br />", b" ") for doc in train_text]
      test_text = [doc.replace(b"<br />", b" ") for doc in test_text]
      
      
      from sklearn.feature_extraction.text import CountVectorizer, ENGLISH_STOP_WORDS
      from sklearn.model_selection import cross_val_score
      from sklearn.linear_model import LogisticRegression
      
      # train, test 데이터 모두 단어 사전 구축 및 불용어 처리한 경우 (min df = 5)
      vect = CountVectorizer(min_df = 5, stop_words="english").fit(train_text + test_text)
      train_text_transformed = vect.transform(train_text)
      test_text_transformed = vect.transform(test_text)
      
      logreg = LogisticRegression(max_iter=1000).fit(train_text_transformed, train_target)
      scores = cross_val_score(logreg, test_text_transformed, test_target, cv=5)
      print(np.mean(scores))
      
      
      # train, test 데이터 단어 사전 구축만 한 경우 (불용어 처리 x)
      vect = CountVectorizer(min_df = 5).fit(train_text + test_text)
      train_text_transformed = vect.transform(train_text)
      test_text_transformed = vect.transform(test_text)
      
      logreg = LogisticRegression(max_iter=1000).fit(train_text_transformed, train_target)
      scores = cross_val_score(logreg, test_text_transformed, test_target, cv=5)
      print(np.mean(scores))
      
      
      # train, test 불용어 처리 한 경우 (min_df = default)
      vect = CountVectorizer(stop_words="english").fit(train_text + test_text)
      train_text_transformed = vect.transform(train_text)
      test_text_transformed = vect.transform(test_text)
      
      logreg = LogisticRegression(max_iter=1000).fit(train_text_transformed, train_target)
      scores = cross_val_score(logreg, test_text_transformed, test_target, cv=5)
      print(np.mean(scores))
      
      
      # train, test 데이터 단어 사전 구축 및 불용어 처리 둘 다 안한 경우
      vect = CountVectorizer().fit(train_text + test_text)
      train_text_transformed = vect.transform(train_text)
      test_text_transformed = vect.transform(test_text)
      
      logreg = LogisticRegression(max_iter=1000).fit(train_text_transformed, train_target)
      scores = cross_val_score(logreg, test_text_transformed, test_target, cv=5)
      print(np.mean(scores))