자연어처리(감성분석_머신러닝)
머신러닝을 이용한 감성분석
문서 행렬
- 비정형데이터 머신러닝은 기본적으로 문서행렬을 이용한다
- DTM이라고 부른다.
- 모든 문서에서 나타나는 어휘를 모으고, 일정 빈도 이상이 되는 것들로 컬럼을 만든다.
- 각 문서에서 컬럼에 있는 어휘가 있는지 파악하고, 그 빈도를 기록한다.
- 빈도는 단순빈도 또는 TF-IDF 값이 될 수 있다.
- 각 문서가 어떠한 종류에 속하는지를 기록하여 훈련 데이터를 만든다.
tf-idf
- TF는 단순히 현재 문서에 출현한 단어의 빈도
- TF-IDf는 단어빈도*역문서빈도
- 역문서 빈도(IDF)는 전체 문서의 수를 그 단어가 나오는 문서의 수로 나눈 것 IDF(t) = log(전체 문서수 / t가 나오는 문서수(DF))
- 특정 단어가 모든 문서에서 많이 나오는 경우 단어들의 IDF 값은 작다.
머신러닝을 이용한 감성분석
훈련데이터와 테스트데이터 분리
data_text = [line[1] for line in data] # 데이터 본문
data_senti = [line[2] for line in data] # 데이터 긍부정 부분
from sklearn.model_selection import train_test_split # 본문과 라벨을 각각 분리
# 기본값 비율은 7.5 : 2.5,stratify 는 비율을 맞춰준다.
train_data_text, test_data_text, train_data_senti, test_data_senti = train_test_split(data_text, data_senti, stratify=data_senti)
# Counter 클래스를 이용해 각 분류가 훈련데이터와 테스트데이터에 같은 비율로 들어갔는지 확인해 본다
from collections import Counter
train_data_senti_freq = Counter(train_data_senti)
print('train_data_senti_freq:', train_data_senti_freq)
test_data_senti_freq = Counter(test_data_senti)
print('test_data_senti_freq:', test_data_senti_freq)
행렬 형태로 변환
from sklearn.feature_extraction.text import CountVectorizer
vect = CountVectorizer(min_df=5).fit(train_data_text) # 최소 문서 빈도 5이상의 단어만 대상
X_train = vect.transform(train_data_text) # 행렬 생성
print("X_train:\n", repr(X_train))
머신러닝 알고리즘 적용
from sklearn.feature_extraction.text import CountVectorizer
vect = CountVectorizer(min_df=5).fit(train_data_text) # 최소 문서 빈도 5이상의 단어만 대상
X_train = vect.transform(train_data_text) # 행렬 생성
print("X_train:\n", repr(X_train))
테스트 데이터 입력
X_test = vect.transform(test_data_text)
# test_data_senti가 리스트 형태로 되어있으면 행 번호가 있는 시리즈로 바꿔준다.
y_test = pd.Series(test_data_senti)
print("테스트 데이터 점수:", lr.score(X_test, y_test))
lr.score는 훈련데이터나 테스트 데이터의 점수를 가르쳐준다.
Leave a comment