튜토리얼: 감성 분석
이 짧은 초보자용 튜토리얼에서는 작은 Twitter 데이터셋으로 감성 분석 분류 모델을 만들어 봅니다. 또한 scikit-learn 라이브러리를 소개합니다. 이 글은 AI 번역본입니다. 오역이 있을 수 있으니 댓글로 알려 주세요.
Created on September 15|Last edited on September 15
Comment
이 영상에서는 작은 Twitter 데이터셋으로 감성 분석 분류기를 만들어 봅니다. 또한 scikit-learn 라이브러리를 소개합니다.
프로젝트
주제
- scikit과 pandas 소개
- 특징 추출과 ‘단어 가방’
- 데이터 변환
- 텍스트 분류를 위한 알고리즘 선택
- 텍스트 분류 알고리즘의 한계
감성 분석
이 튜토리얼에서는 특정 브랜드에 대한 트윗을 긍정 또는 부정 감정으로 분류하고, 트윗의 주제를 추출하는 모델을 만들어 보겠습니다. 이는 매우 흔한 활용 사례로, 대부분의 주요 소비재 기업이 이를 위해 머신러닝을 사용합니다.

가장 먼저 필요한 것은 학습 데이터입니다. 내 브랜드에 대한 긍정 및 부정 트윗의 예시들이죠. 학습 데이터가 없으면 머신러닝은 거의 작동하지 않습니다.
scikit 디렉터리로 이동하여 열세요 tweets.csv 텍스트 편집기, 엑셀 또는 다른 어떤 프로그램에서도 열 수 있습니다. 이 파일은 몇천 개의 트윗이 포함된 라벨링된 원시 데이터 파일이며, 이름은 다음과 같습니다. tweets.csv이것들은 사우스 바이 사우스웨스트에서 수집된 애플 제품 관련 트윗이며, Figure Eight의 사람들에 의해 긍정, 부정, 중립, 또는 판단 불가로 라벨링되었습니다.
특징 추출
텍스트 학습 데이터로 가장 먼저 해야 할 일은 특징 추출입니다. 첫 번째 튜토리얼에서 기억하듯이, 머신러닝 알고리즘의 API는 매우 단순하고 제약적입니다. 고정 길이의 숫자 집합을 입력으로 받아 고정 길이의 숫자 집합을 출력합니다. 일반적으로 텍스트, 오디오, 이미지 같은 형태를 그대로 입력받지 않기 때문에, 각 텍스트를 고정 길이의 숫자 집합으로 변환해야 합니다.

이를 수행하는 데 놀라울 만큼 강력한 방법이 바로 백오브워즈입니다. 이는 각 트윗을 벡터로 변환하되, 벡터의 각 열이 하나의 단어를 의미한다는 뜻입니다. 각 열의 값은 해당 단어가 트윗에 등장한 횟수입니다. 전체 학습 데이터에서 사용된 고유 단어의 총수를 어휘집이라고 합니다. 따라서 벡터의 열 개수는 어휘집의 크기와 같으며, 이 경우 9,706개입니다. 각 트윗에서 대부분의 열 값은 0이 됩니다.
코드
ml-class 폴더 안의 scikit 디렉터리를 여세요. 여기에는 Figure Eight이 분류한 애플 제품 관련 트윗이 들어 있는 .csv 파일이 있습니다. 우리는 이 트윗들의 감성을 긍정과 부정으로 분류하는 신경망을 만들려고 합니다.
가장 먼저 해야 할 일은 데이터를 파이썬으로 불러오는 것입니다. 열어 보세요 load-data.py여기서는 pandas와 numpy 라이브러리를 사용해 트윗을 감정을 나타내는 열과 함께 데이터프레임에 담습니다.
이제 특징 추출을 수행합니다. 열어 보세요 feature-extraction-1.py. 처음 5줄은 load-data와 동일하게 트윗을 불러옵니다. 그런 다음 scikit-learn을 임포트합니다. CountVectorizer. 이 코드는 텍스트를 백오브워즈로 변환합니다. 그런데 프로그램을 실행해 보면 오류가 발생합니다. 데이터의 일부분만 떼어 다시 실행해 보세요. 버그가 어디에서 생기는지 찾을 수 있나요? (힌트: tweets.csv 파일을 열어 보세요)
오류의 원인은 8번 트윗에 빈 항목이 있기 때문입니다. scikit-learn은 빈 입력을 허용하지 않습니다. 열어 봅시다 feature-extraction-2.py 이 문제를 어떻게 처리하는지 확인해 보세요.

이제 11번째 줄에서 pandas 함수로 모든 null 항목을 제거해 text를 fixed_text에 그대로 할당합니다. target에도 동일한 처리를 합니다. 이런 종류의 데이터 정리는 매우 중요합니다. 수동으로 하지 말고 코드에서 처리하세요. 변환 설정을 마쳤으니, 이제 실제로 변환을 수행해 봅시다. feature-extraction-3.py이 코드는 …와 동일합니다 feature-extraction-2.py 마지막에 다음 코드를 추가하여:
counts = count_vect.transform(fixed_text)
이렇게 하면 우리의 어휘로 희소 행렬이 만들어집니다. 이제 알고리즘을 구축할 준비가 되었습니다.
알고리즘 선택하기
좋아요, 이제 분류기를 만들어 봅시다. 하지만 먼저, 어떤 알고리즘을 선택해야 할까요? 사용 사례에 따라 널리 쓰이는 방법들이 몇 가지 있습니다.
알고리즘을 고르는 일은 초보자에게 어렵고 전문가들 사이에서도 논쟁이 많지만, 손쉬운 기준으로는 scikit에서 만든 훌륭한 의사결정 차트를 따르는 것이 좋습니다.

일반적으로 이 의사결정 차트를 따라가면 합리적인 알고리즘에 도달할 수 있습니다. 맨 위부터 시작해 보죠. 우리는 50개 초과의 데이터 샘플이 있고, 범주를 예측하려고 합니다. 라벨이 있는 데이터이며 샘플 수는 100,000개 미만입니다(약 10,000개). 이 경우 차트는 Linear SVC를 권장합니다. 하지만 여기서는 Linear SVC의 성능이 그다지 좋지 않으므로, ‘작동하지 않음’ 화살표를 따라가면 Naive Bayes로 이어집니다.
Naive Bayes는 일반적으로 매우 잘 동작하고 속도도 매우 빠른 간단한 알고리즘입니다. 우리의 데이터셋에 적용해 봅시다.
열어 보세요 classifier.py. scikit-learn에서 다음 코드를 사용해 Multinomial Naive Bayes 알고리즘만 임포트합니다:
from sklearn.naive_bayes import MultinomialNBnb = MultinomialNB()nb.fit(counts, target)
Counts는 트윗에서 등장하는 단어의 빈도를 기록하는 bag-of-words 특징이고, target은 우리가 분류하려는 감성 레이블입니다. 예시 트윗에 대해 모델이 어떻게 동작하는지 확인하려면 classifier.py를 직접 수정하며 실험해 보세요.
Add a comment