Skip to content
This repository has been archived by the owner on Oct 19, 2023. It is now read-only.

Commit

Permalink
minor fix on code
Browse files Browse the repository at this point in the history
  • Loading branch information
ysangj authored Jul 5, 2018
1 parent d809fe9 commit d74037e
Showing 1 changed file with 18 additions and 23 deletions.
41 changes: 18 additions & 23 deletions 07-RNN-For-Sequential-Data/01-text-classification.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# 영화 리뷰 감정 분석\n",
"# 프로젝트 1. 영화 리뷰 감정 분석\n",
"**RNN 을 이용해 IMDB 데이터를 가지고 텍스트 감정분석을 해 봅시다.**\n",
"\n",
"데이터의 순서정보를 학습한다는 점에서 RNN은 CIFAR10 같이 정적인 고정된 형태의 데이터 보다는 동영상, 자연어, 주가 변동 데이터 등의 동적인 시계열 데이터를 이용할때 퍼포먼스가 극대화됩니다.\n",
"데이터의 순서정보를 학습한다는 점에서 RNN은 CIFAR10 같이 정적인 고정된 형태의 데이터 보다는 동영상, 자연어, 주가 변동 데이터 등의 동적인 시계열 데이터를 이용할때 퍼포먼스가 극대화됩니다.\n",
"이번 프로젝트를 통해 가장 기본적인 자연어 처리(Natural Language Processing)작업이라고 할 수 있는 '텍스트 감정분석'(Text Sentiment Analysis)모델을 RNN을 이용해 구현하고 학습시켜 보겠습니다.\n",
"\n",
"이번 책에서 처음으로 접하는 텍스트 형태의 데이터셋인 IMDB 데이터셋은 50,000건의 영화 리뷰로 이루어져 있습니다.\n",
"각 리뷰는 다수의 영어 문장들로 이루어져 있으며, 평점이 7점 이상의 긍정적인 영화 리뷰는 2로, 평점이 4점 이하인 부정적인 영화 리뷰는 1로 레이블링 되어 있습니다. 영화 리뷰 텍스트를 RNN 에 입력시켜 영화평의 전체 내용을 압축하고, 이렇게 압축된 리뷰가 긍정적인지 부정적인지 판단해주는 간단한 분류 모델을 만들어 보겠습니다."
"각 리뷰는 다수의 영어 문장들로 이루어져 있으며, 평점이 7점 이상의 긍정적인 영화 리뷰는 2로, 평점이 4점 이하인 부정적인 영화 리뷰는 1로 레이블링 되어 있습니다. 영화 리뷰 텍스트를 RNN 에 입력시켜 영화평의 전체 내용을 압축하고, 이렇게 압축된 리뷰가 긍정적인지 부정적인지 판단해주는 간단한 분류 모델을 만드는 것이 이번 프로젝트의 목표입니다."
]
},
{
Expand All @@ -20,21 +20,20 @@
"source": [
"### 워드 임베딩\n",
"\n",
"본격적으로 모델에 대한 코드를 짜보기 전, 자연어나 텍스트 데이터를 가지고 딥러닝을 할때 언제나 사용되는 워드 임베딩(Word Embedding)에 대해 간단히 배워보겠습니다.\n",
"본격적으로 모델에 대한 코드를 짜보기 전, 자연어나 텍스트 데이터를 가지고 딥러닝을 할때 언제나 사용되는 ***워드 임베딩(Word Embedding)***에 대해 간단히 배워보겠습니다.\n",
"\n",
"IMDB 데이터셋은 숫자로 이뤄진 텐서나 벡터 형태가 아닌 순전한 자연어로 이뤄져 있습니다. 즉, 데이터를 인공신경망에 입력시키기 전에 여러 사전처리를 해 데이터를 벡터로 나타내 줘야 합니다. 이를 위해 가장 먼저 해야 할 일은 영화 리뷰들을 단어 단위의 토큰으로 나누어 주는 것입니다. 간단한 데이터셋에선 파이썬의 split(‘ ’) 함수를 써서 토크나징을 해 줘도 큰 문제는 없지만, 더 깔끔한 토크나이징을 위해 Spacy 같은 오픈소스를 사용하는걸 추천드립니다.\n",
"IMDB 데이터셋은 숫자로 이뤄진 텐서나 벡터 형태가 아닌 순전한 자연어로 이뤄져 있습니다. 이러한 데이터를 인공신경망에 입력시키기 위해선 여러 사전처리를 해 데이터를 벡터로 나타내 줘야 합니다. 이를 위해 가장 먼저 해야 할 일은 아래와 같이 영화 리뷰들을 단어 단위의 토큰으로 나누어 주는 것입니다. 간단한 데이터셋에선 파이썬의 split(‘ ’) 함수를 써서 토크나징을 해 줘도 큰 문제는 없지만, 더 깔끔한 토크나이징을 위해 Spacy 같은 오픈소스를 사용하는걸 추천드립니다.\n",
"\n",
"```python\n",
"‘It was a good movie.’ --토크나이징→ [‘it’, ‘was’, ‘a’, ‘good’, ‘movie’]\n",
"‘It was a good movie.’ → [‘it’, ‘was’, ‘a’, ‘good’, ‘movie’]\n",
"```\n",
"\n",
"그 후 영화평 속의 모든 단어는 ***one hot encoding*** 이라는 기법을 이용해 나타내어 집니다. 예를 들어 데이터셋에 총 10개의 다른 단어들이 있고 ‘movie’ 라는 단어가 사전에서 3번째 단어 일 경우 단어 'movie'는 다음과 같이 나타내어 집니다.\n",
"그 후 영화평 속의 모든 단어는 one hot encoding 이라는 기법을 이용해 벡터로 변환됩니다. 예를 들어 데이터셋에 총 10개의 다른 단어들이 있고 ‘movie’ 라는 단어가 10개의 단어 중 3번째 단어 일 경우 'movie'는 다음과 같이 나타내어 집니다.\n",
"\n",
"```python\n",
"[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]\n",
"movie = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]\n",
"```\n",
"그 다음으로는 one hot encoding 을 거친 단어 벡터를 **'사전 속 낱말 수' X '임베딩 차원값'** 모양의 랜덤한 임베딩 행렬(Embedding Matrix)과 행렬곱을 해 주어야 합니다. 행렬곱의 결과는 임베딩 차원값 만큼의 특성값을 지닌 벡터입니다.\n",
"이러한 과정을 워드 임베딩이라고 합니다.\n",
"그 다음으로는 one hot encoding을 거친 단어 벡터를 '사전 속 낱말 수' X '임베딩 차원값' 모양의 랜덤한 임베딩 행렬(Embedding Matrix)과 행렬곱을 해 주어야 합니다. 행렬곱의 결과는 'movie'라는 단어를 대표하는 다양한 특성값을 가진 벡터입니다.\n",
"\n",
"워드 임베딩은 언뜻 보기에도 코드로 정의하기엔 골치아픈 동작이지만,\n",
"다행히도 파이토치의 nn.Embedding() 함수를 사용하면 별로 어렵지 않게 이뤄낼 수 있습니다."
Expand Down Expand Up @@ -95,10 +94,6 @@
"즉, 한 영화 리뷰속 모든 단어가 임베딩을 거치면 영화 리뷰는 embed 만큼 특성값을 지닌 단어 텐서들이 차례대로 나열된 배열 형태로 나타내어 집니다.\n",
"\n",
"```python\n",
"class BasicLSTM(nn.Module):\n",
" def __init__(self, n_layers, hidden_dim, n_vocab, embed_dim, n_classes, dropout_p=0.2):\n",
" super(BasicLSTM, self).__init__()\n",
" print(\"Building Basic LSTM model...\")\n",
" self.n_layers = n_layers\n",
" self.embed = nn.Embedding(n_vocab, embed_dim)\n",
"```\n",
Expand Down Expand Up @@ -270,7 +265,7 @@
"본격적으로 학습을 시작하기 전, 모델 객체와 최적화 알고리즘을 정의합니다.\n",
"\n",
"```python\n",
"model = BasicLSTM(1, 256, vocab_size, 128, n_classes, 0.5)#.to(0)#DEVICE)\n",
"model = BasicLSTM(1, 256, vocab_size, 128, n_classes, 0.5).to(DEVICE)\n",
"optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n",
"```\n",
"\n",
Expand Down Expand Up @@ -399,7 +394,7 @@
"print(\"[TRAIN]: %d \\t [TEST]: %d \\t [VOCAB] %d \\t [CLASSES] %d\"\n",
" % (len(train_iter),len(test_iter), vocab_size, n_classes))\n",
"\n",
"model = BasicLSTM(1, 256, vocab_size, 128, n_classes, 0.5)#.to(0)#DEVICE)\n",
"model = BasicLSTM(1, 256, vocab_size, 128, n_classes, 0.5).to(DEVICE)\n",
"optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n",
"print(model)\n",
"\n",
Expand Down Expand Up @@ -428,7 +423,7 @@
},
{
"cell_type": "code",
"execution_count": 25,
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -443,7 +438,7 @@
},
{
"cell_type": "code",
"execution_count": 26,
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -458,7 +453,7 @@
},
{
"cell_type": "code",
"execution_count": 27,
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
Expand Down Expand Up @@ -505,7 +500,7 @@
},
{
"cell_type": "code",
"execution_count": 28,
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -530,7 +525,7 @@
},
{
"cell_type": "code",
"execution_count": 29,
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
Expand Down Expand Up @@ -604,7 +599,7 @@
},
{
"cell_type": "code",
"execution_count": 32,
"execution_count": 34,
"metadata": {},
"outputs": [
{
Expand All @@ -631,7 +626,7 @@
}
],
"source": [
"model = BasicLSTM(1, 256, vocab_size, 128, n_classes, 0.5)#.to(0)#DEVICE)\n",
"model = BasicLSTM(1, 256, vocab_size, 128, n_classes, 0.5).to(DEVICE)\n",
"print('**')\n",
"optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n",
"\n",
Expand Down

0 comments on commit d74037e

Please sign in to comment.