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

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

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

이제 11번째 줄에서, 모든 null 항목을 제거하는 pandas 함수를 사용해 fixed_text를 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