[영화 줄거리로 장르 분류하기]
1. 머신러닝이란?
2. 👉데이터 전처리👈
3. 벡터화
4. 머신러닝
5. 모델 사용하기 및 불용어 제거
벡터화를 시킨 줄거리를 토대로 기계한테 해달 줄거리는 어떤 특정한 장르에 속한다고 지속적으로 학습을 시키는 것이다. 그렇게 학습시킨 결과가 모델 (model)
이다. 기계는 글자를 바로 이해하지 못하므로 입력 받기 위해서는 숫자로 치환하는 벡터화 (vectorization)
이 필요하다.
Embedding Projector
https://projector.tensorflow.org/
3차원 공간에 표시되는 점들은 특정 단어에 해당한다. 특정 단어가 저 공간 중 어디에 위치하는 지 '벡터'로 표시한다. 기계는 공간 사이의 거리를 보고 가까울 수록 유사한 단어라고 생각하고, 멀 수록 유사하지 않은 단어라고 생각한다.
이를 토대로 기계도 숫자만으로 해당 단어의 의미(상대적 관계)를 이해할 수 있게 된다.
이번에 사용될 내용은 텍스트 분류
이다. '스팸 메일 자동 분류', '사용자의 리뷰로부터 긍정, 부정 판단', '뉴스 카테고리 분류' 등이 있다.
Binary Classificaiton
Multiclass Classification
이라고 한다. 줄거리로 장르 분류하기는 다중 클래스 분류 (Multiclass Classification)에 속한다.
이전의 네이버 줄거리 데이터는 개수가 많지 않아서 훈련 데이터로 쓰면 예측 모델의 정확도가 떨어질 수 있다. 그래서 이미 데이터 수집이 되어있는 IMDb 줄거리 데이터 (10만건 이상)를 이용한다.
IMDb : 인터넷 영화 데이터베이스(Internet Movie Database)
영화, 배우, 텔레비전 드라마, 비디오 게임 등에 관한 정보를 제공하는 온라인 데이터베이스이다.
데이터 파일은 2가지가 있는데 이는 학습한 모델을 평가
하기 위해서 구분된다.
훈련 데이터
는 기계에 일정한 내용을 학습시키기 위한 데이터테이스 데이터
는 줄거리만 주고 장르를 예측해보라고 주기 위한 데이터. 해당 줄거리의 장르를 맞추면 정확도가 상승하고, 그렇지 않으면 정확도는 하락한다.import pandas as pd
# sep=":::" 을 이용해서, 열 구분을 ::: 로 해서 불러오라고 말해준다.
train = pd.read_table('train_data.txt', sep=":::", names=['Index', 'Title', 'Genre', 'Content'])
test = pd.read_table('test_data_solution.txt', sep=":::", names=['Index', 'Title', 'Genre', 'Content'])
train.info()
test.info()
#Result
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 54214 entries, 0 to 54213
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Index 54214 non-null int64
1 Title 54214 non-null object
2 Genre 54214 non-null object
3 Content 54214 non-null object
dtypes: int64(1), object(3)
memory usage: 1.7+ MB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 54200 entries, 0 to 54199
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Index 54200 non-null int64
1 Title 54200 non-null object
2 Genre 54200 non-null object
3 Content 54200 non-null object
dtypes: int64(1), object(3)
memory usage: 1.7+ MB
train['Genre'].unique()
#Result
array([' drama ', ' thriller ', ' adult ', ' documentary ', ' comedy ',
' crime ', ' reality-tv ', ' horror ', ' sport ', ' animation ',
' action ', ' fantasy ', ' short ', ' sci-fi ', ' music ',
' adventure ', ' talk-show ', ' western ', ' family ', ' mystery ',
' history ', ' news ', ' biography ', ' romance ', ' game-show ',
' musical ', ' war '], dtype=object)
줄거리를 통해서 장르를 예측한다. 따라서 줄거리가 독립변수 (x)
이고, 장르가 종속변수 (y)
가 된다.
y_train = train['Genre'] # 훈련 데이터의 장르 부분을 y_train 이라는 이름으로 저장
x_train = train['Content'] # 훈련 데이터의 줄거리 부분을 x_train 이라는 이름으로 저장
y_test = test['Genre'] # 테스트 데이터의 장르 부분을 y_test 이라는 이름으로 저장
x_test = test['Content'] # 테스트 데이터의 장르 부분을 x_test 이라는 이름으로 저장
✋ 판다스에서 열 1개 추출하기
# series 형태로 추출 데이터프레임이름['열의이름'] # DataFrame 형태로 추출 데이터프레임이름[['A']]
https://digital-play.tistory.com/31 : Pandas series에 대한 설명
컴퓨터는 단어를 바로 이해하지 못하므로 줄거리와 장르를 모두 숫자나 벡터 형태로 변형시켜준다.
장르는 자체의 의미나 장르 간의 관계가 중요하지 않아서 고유 숫자로 대치시킨다.
줄거리는 후에 벡터화를 진행한다.
mapping = {' drama ':1, ' thriller ':2, ' adult ':3, ' documentary ':4, ' comedy ':5,
' crime ':6, ' reality-tv ':7, ' horror ':8, ' sport ':9, ' animation ':10,
' action ':11, ' fantasy ':12, ' short ':13, ' sci-fi ':14, ' music ':15,
' adventure ':16, ' talk-show ':17, ' western ':18, ' family ':19, ' mystery ':20,
' history ':21, ' news ':22, ' biography ':23, ' romance ':24, ' game-show ':25,
' musical ':26, ' war ':27}
#장르는 동일하게 적용되어서 동일하게 숫자 부여
y_train = y_train.replace(mapping)
y_test = y_test.replace(mapping)
다시 y_train을 출력해보자.
y_train.head(3)
#Result
0 1
1 2
2 3
Name: 2, dtype: int64
그럼 장르는 숫자로 치환이 되었고, 줄거리를 벡터화를 해야한다.
✋ 혹시 y_test에서 치환이 되지 않은 것이 없는 지 알아보려고 두가지로 확인을 해보았다. 분류가 많지 않아서 아래 코드 두개로 확인은 되지만 y값이 많아진다면 어려울 것이다. 적절한 방법은 아직 찾지 못했다..
y_test.drop_duplicates() y_test.sort_values()