{
  "fetched_at": "2026-10-19T18:52:46Z",
  "source_url": "https://www.kaggle.com/competitions/2024-ml-project-korean/data",
  "pages": [
    {
      "name": "data-description",
      "content": "## 영화 리뷰 데이터셋\n- 학습 데이터는 문자열 형태의 리뷰(review)와, 정답 라벨(rating)으로 구성되어 있습니다.\n- 테스트 데이터는 라벨 없이 리뷰만을 담고 있습니다.\n- 학습 데이터와 테스트 데이터는 각각 약 15만개와 5만개로 랜덤하게 나누어졌습니다.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Description",
      "content": "## [프로젝트-1] 영화 리뷰 분석하기\n### 데이터셋 설명\n- 본 데이터셋은 네이버 영화 서비스에 사용자들이 남긴 리뷰들로 구성되었습니다.\n- 데이터셋에는 길이 제한이 없는 리뷰글과, 해당 리뷰가 영화에 대한 **긍정적** 리뷰인지, 혹은 **부정적** 리뷰인지의 여부가 포함되어 있습니다.\n- 자연어(Natural Language) 데이터, 그 중에서도 우리가 사용하는 한국어 데이터를 전처리하여 텍스트 데이터를 머신러닝을 적용하는 과정을 통해, 데이터 전처리와 특징 추출의 과정을 배워보시길 바랍니다.\n\n### 자연어 처리 (Natural Language Processing, NLP)\n- 자연어 데이터를 머신러닝에 사용하기 위해서는 데이터를 머신러닝에 사용할 수 있도록 전처리하는 과정이 필요합니다.\n- 일반적으로 머신러닝에 사용되는 데이터가 어떤 형태이고, 자연어가 이와 어떻게 다른지 생각해봅시다.\n  - 데이터의 크기: 대부분의 머신러닝 모델들은 고정된 크기의 입력 데이터를 받습니다. 그러나, 자연어는 문장에 따라 길이가 상이합니다. 때문에 자연어를 머신러닝 모델에 투입하려면 데이터를 고정된 크기로 변환해줘야 합니다.\n  - 데이터의 형태: 머신러닝 모델들은 실수 데이터를 입력 받습니다. 그러나, 자연어 데이터는 문자형(char, string)으로 되어있습니다.\n- 이러한 문제들로 자연어 처리에서는 전처리 방식이 매우 중요합니다.\n- 이 과제에서, 자연어 데이터의 전처리를 경험해보고 대표적인 두 가지 방법론의 성능을 비교해봅시다.\n\n<hr>\n## [Empty Module #1] \n### 자연어 데이터의 전처리\n- 자연어 데이터는 매우 다양한 형태로 주어지며, 이러한 미묘한 차이를 컴퓨터가 구분할 수 있게 하려면 매우 많은 데이터가 필요합니다.\n- 예를들어, `ㅋ`과 `ㅋㅋㅋㅋ`에 존재하는 미묘한 차이, 다른 특수문자들과 `:)`같은 이모지가 갖는 차이 등을 컴퓨터가 학습하려면 매우 많은 양의 데이터가 요구됩니다.\n- 그렇기 때문에 이런 특수문자나 초성체 등을 차라리 제거해주는 것이, 소규모 자연어 데이터 상에서는 더 좋을 수 있습니다.\n- 먼저, *정규 표현식(Regular Expression)*을 이용해 <mark>한글(초성 제외), 영문자, 띄어쓰기</mark>를 제외한 문자들을 제외해봅시다.\n  - 초성체(ㅋㅋ, ㅋㅋㅋ)나 특수문자(. , ? ! !! 등)와 같이 처리하기 어렵고 문장의 의미에 큰 영향을 주지 않는 데이터들을 제거합니다.\n- 영어의 경우, 같은 단어들이 대소문자에 의해 다른 단어로 인식되지 않도록 모두 대문자로 통일해줍니다.\n  - (apple, APPLE, aPPle 등을 모두 APPLE로 통일합니다.)\n\n## [Empty Module #2] \n### 단어 토큰화(Tokenization)\n- 자연어 데이터는 다양한 길이로 주어질 수 있습니다.\n  - 짧게는 초성부터 문자, 단어, 문장, 문단, 한 편의 글이나 책까지... 다양한 크기의 글이 있습니다.\n- 이런 데이터를 머신러닝 모델이 처리할 수 있도록 어떠한 단위의 토큰(token)으로 나누는 작업을 토큰화라고 합니다.\n- 토큰화는 다양한 단위로 수행할 수 있는데, 이번 프로젝트에서는 언어의 의미가 사라지지 않으면서도 작은 단위인 단어 단위로 나누는 단어 토큰화(Word Tokenization)를 적용합니다.\n- 이때, 어근화(stemming)를 적용합니다. 어근화란 같은 뜻을 갖지만 다양한 형태로 표현되는 단어들을 한 가지 형태로 통일 시켜주는 작업입니다.\n  - 예를 들어, \"~입니다\", \"~에요\", \"~임\" 등을 \"이다\"로 통일하는 작업입니다.\n\n> `konlpy` 라이브러리에서 제공하는 한국어 토크나이저인 `okt`를 활용하여 단어 토큰화를 수행합니다.\n\n## [Empty Module #3] \n### 불용어 제거\n- `[\"은\", \"는\", \"이\", \"가\"]`와 같은 단어들은 그 자체로는 큰 의미를 가지지 않는 불용어(stopword)입니다.\n- 이러한 데이터들 역시 기계학습 모델이 쉽게 이해하게 하기 매우 어려우며, 본 task에서 문장의 내용을 판별하는데 크게 도움이 되지도 않습니다.\n- 그렇기 때문에 이번에는 이러한 불용어들을 데이터에서 제거하고 진행합니다.\n\n## [Empty Module #4]\n### 단어 임베딩(Word Embedding)\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F3684121%2Fe998d4cc32d2f5574f2cadb8e39b636b%2F1.jpg?generation=1683538350775657&alt=media)\n- 토큰화된 단어를 컴퓨터가 이해할 수 있는 실수 벡터 형태로 변환하는 과정을 워드 임베딩(Word Embedding)이라고 합니다. 일반적으로 단어를 고차원 벡터 공간에서 고밀도 벡터로 표현합니다.\n- 이러한 임베딩에도 매우 다양한 방법이 존재하며, 각각의 장점과 단점이 존재합니다.\n  - 원-핫 인코딩(one-hot encoding)은 표현하고자 하는 단어의 인덱스 값만 1이고, 나머지 인덱스는 전부 0인 벡터 표현 방법입니다. 간단하지만 단어 의미 관계를 잘 포착할 수 없고 과도한 벡터 차원을 가질 수 있습니다.\n  - Bag-of-Words(BoW)는 카운트 기반 단어 표현(Count based word representation)법 중 하나로, 단어들의 순서는 고려하지 않고 각 단어의 출현 빈도만을 고려하여 문서 또는 문장을 벡터로 수치화하는 표현 방법입니다. 따라서 어순과 문맥은 무시되고 단어의 발생 여부가 중요해 단어 간 의미 관계를 포착하기는 힘듭니다.\n  - TF-IDF(단어 빈도-역 문서 빈도, Term Frequency-Inverse Document Frequency)는 문서에 자주 등장하지만 말뭉치에서 상대적으로 드문 단어에 높은 가중치를 할당하여 특정 문서에서 단어의 의미를 고려할 수 있는 표현법으로, BoW와 마찬가지로 카운트 기반 단어 표현법입니다. '용어 빈도(TF)'는 단어가 문서에서 얼마나 자주 나타나는지를, '역문서 빈도(IDF)' 단어가 전체 말뭉치에서 얼마나 드물거나 고유한지를 나타낼 수 있습니다. \n  - 워드투벡터(Word2Vec)는 CBOW(Continuous Bag of Words)및 Skip-gram과 같은 신경망을 사용하여 단어 표현을 학습하는 방법으로, 단어 간 의미 관계를 포착하여 유사 의미를 가진 단어가 비슷한 벡터 표현을 가지도록 합니다.\n  - 글로브(Glove. 단어 표현을 위한 글로벌 벡터)는 전체 말뭉치에서 글로벌 단어 동시 발생 동계 및 행렬 분해를 결합하여 단어 표현을 학습하는 방법으로 단어 간 의미론적 관계과 구문론적 관계를 포착할 수 있습니다. \n- 이번 프로젝트에서는 가장 단순한 방법이라 할 수 있는 희소 표현법으로 단어를 임베딩 해보겠습니다.\n\n### 희소 표현법(Sparse Representation)\n- 희소 표현법은 각 단어에 하나의 값들을 부여합니다.\n- 예를들어, \"사과\"에 `1`, \"맛있다.\"에 `2`... 와 같은 방식입니다. (데이터 전처리에서 배운 라벨 인코딩과 유사합니다)\n- 이 방법을 사용하면 데이터에 등장하는 단어의 수가 `m`개라 할 때, `(0~m)` 사이의 값으로 각 단어들이 임베딩됩니다.\n- 이를 원-핫 인코딩 방식으로 표현하면 `[0, 0, 1, 0 ..... 0]`과 같이 대부분의 값이 0이고 하나의 값만 1인, 희소 벡터로 변환되기 때문에 이러한 방식을 희소 표현법이라 합니다.\n\n#### (참고) 한국어 자연어 처리의 어려움\n- 한국어는 영어나 라틴어 계열의 다른 언어에 비해 토큰화를 수행하기 어려운 언어에 속합니다.\n- 영어에서는 \"San Francisco\", \"We're\"와 같이 일부 예외를 제외하고는 띄어쓰기를 활용하면 쉽게 단어 토큰화를 수행할 수 있습니다.\n- 한편, 한국어는 조사, 어미와 같이 다른 단어와 결합되는 단어들을 통해 말이 구성되는 교착어에 속합니다.\n- 예를 들어, 영어에서는 \"I\"로 표현되는 말이 한국어에서는 \"나는\", \"내가\" 등으로 다양하게 나타날 수 있기 때문에, 띄어쓰기를 통한 분리가 어렵습니다.\n\n## [Empty Module #5] \n### Bag of Words 방법을 통한 문장 벡터화\n- 위에서 한 개의 단어를 한 개의 값으로 변환하였습니다.\n- 그러나 여전히 우리가 분류해야 할 문장들은 다양한 길이를 가지고 있기 때문에, 고정된 크기의 입력 값을 요구하는 머신러닝 모델을 적용하기 어렵습니다.\n- Bag of Words(BoW) 방법을 사용하여 모든 문장을 동일한 길이의 벡터로 만들어 줄 수 있습니다.\n- 이렇게 변환된 벡터의 형태를 Bag of Words(BoW)라고 합니다.\n\n### Bag of Words 방법\n- BoW는 그 이름처럼, 어떤 단어들이 담긴 가방(집합)의 형태로 문장을 표현한다고 이해할 수 있습니다.\n- 마치 가방 속에 든 물건의 개수를 세는 것처럼, 어떠한 문장을 고정된 $m$개의 단어들의 등장 횟수로 나타내는 방법입니다.\n- 예를들어, \"사과 주스는 사과 맛이 나는 주스입니다.\"와 같은 문장은 `{\"사과\": 2, \"주스\": 2, \"는\":2, \"맛\": 1, \"이\":1, \"나\":1\", \"입니다.\":1, \"당근\":0, \"인공지능\": 0 ....}`과 같이 나타낼 수 있습니다.\n\n> 임베딩된 자연어 데이터를 BoW 형태로 변환하는 코드를 직접 작성하여, 데이터를 변환해봅시다.\n\n## [Empty Module #6] \n### 차원 축소\n- 우리가 만든 BoW는 불용어를 제외하고 데이터셋에 등장하는 모든 단어를 포함하여 만들었기 때문에, 매우 많은 차원을 가지고 있습니다.\n- 그러나 실제로 이 중에는 전체 데이터에서 한두 번만 등장하는 단어들이 꽤 많이 포함되어 있습니다.\n\n> 전체 데이터에서 50번 미만으로 등장하는 단어들을 BoW에서 제거하는 코드를 작성해봅시다.\n\n## [Empty Module #7] \n### 분류 수행 및 제출: BoW\n- 지금까지 배운 머신러닝 라이브러리를 이용해 분류를 수행하고, 제출해봅시다!\n- 베이스라인은 로지스틱 회귀 모델을 사용하였고, 별다른 하이퍼 파라미터 튜닝은 진행하지 않았습니다.\n- 성능 향상과 독학을 위해 다양한 머신러닝 모델 및 하이퍼 파라미터 튜닝을 적용하기 앞서, 반드시 주어진 조건에 따라 베이스라인을 달성해 보기를 바랍니다(제출 코드에는 분류기를 변경하지 말아주세요).\n\n## [Empty Module #8]\n### TF-IDF 방법\n> 아래 TF-IDF 방법에 대한 설명을 읽고, 직접 구현해봅시다.\n\n- TF-IDF(Term Frequency - Inverse Document Frequency) 방법은 BoW 방법에서 조금 더 나아가, 각 단어들의 중요도를 고려합니다.\n- BoW 방법에서는 리뷰에 여러 차례 등장한 단어가 큰 값을 갖습니다.\n- 그런데 리뷰에 여러 차례 등장하였다고 해서, 꼭 리뷰가 긍정적인 리뷰인지 판단하는데 도움이 될까요?\n\n\n> 1. 이 영화는 좋은 영화입니다. 가히 제가 본 영화 중에 최고의 영화라 할 수 있겠습니다.\n> 2. 이 영화는 나쁜 영화입니다. 가히 제가 본 영화 중에 최악의 영화라 할 수 있습니다.\n\n- 위에 두 개의 비슷한 리뷰가 있습니다. `영화`라는 단어는 많이 등장하기는 하였지만, 리뷰가 긍정적인지 판단하는 데는 전혀 도움이 되지 않습니다.\n- 오히려 중요한 것은, 리뷰에서 각각 한번만 등장한 `좋은`, `나쁜`, `최고`, `최악`과 같은 단어들 입니다.\n- TF-IDF는 텍스트에서 자주 등장하는 단어들보다 오히려 가끔 등장하는 단어들의 중요도가 더 높을 것이란 가정에서 출발합니다.\n\n### TF-IDF 구현\n1. 먼저, 각 단어 t가 전체 데이터 N개 중 몇 개의 샘플(문서)에서 등장하는지를 의미하는 document frequency를 구합니다.\n2. 아래 식을 참고하여 앞서 구한 document frequency에 반비례하는 inverse document frequency를 구합니다.\n3. BoW Feature에 IDF를 곱하여 중요도를 반영해줍니다.\n\n$$ \\text{IDF}(t) = \\log(\\frac{N}{1+\\text{df}(t)}) $$\n\n## [Empty Module #9]\n### 분류 수행 및 제출: TF-IDF\n- BoW와 같이 TF-IDF도 예측을 수행하여 제출해봅시다.\n- 이때, TF-IDF의 적용 여부를 제외하고 전처리 과정, 모델 구조 등에는 변화를 주지 않아야 정확한 비교가 가능합니다.\n- 이렇게 다른 조건들은 동일한 상태로, 어떤 변화가 성능에 미치는 영향을 알아보기 위한 실험을 ablation study라고 합니다.\n\n## 참고자료\n- [딥러닝을 이용한 자연어 처리 입문, 2023, 안상준, 유원준 저, wikidocs](https://wikidocs.net/book/2155)\n\n## 코멘트\n- 이 프로젝트에 사용된 데이터의 출처는 [Lucy Park](https://github.com/e9t)님의 [nsmc 데이터](https://github.com/e9t/nsmc)임을 밝힙니다.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Evaluation",
      "content": "- 리뷰가 긍정적인지 부정적인지 여부를 예측하는 Binary Classification 문제이므로, 평가에 카테고리 정확도(Categorization Accuracy)를 사용합니다.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "rules",
      "content": " - Don't cheat!\n - Apply yourself!\n - Have fun!",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "abstract",
      "content": " ## 과목 정보\n- 세종대학교 AI로봇학과 기계학습 (최유경 교수)\n<hr>\n## 프로젝트 방향성 이해하기\n### 프로젝트의 목적\n- 자연어 텍스트 데이터, 특히 한국어 데이터를 머신러닝에 활용할 수 있는 벡터 형태의 데이터로 가공하는 과정을 학습한다.\n- 같은 데이터를 두 가지 주어진 방법으로 가공하는 과정을 통해, 여러가지 방법론을 비교하고 선택하는 과정을 경험한다.\n### 프로젝트 주의사항\n- 성능 향상을 위해 인공신경망 방법은 사용할 수 없다. (RNN, LSTM 등)\n  - <mark>토크나이저는 제시된 `okt`로 고정하도록 한다.</mark>\n- 코드 작성 시 랜덤성이 발생하는 경우 반드시 랜덤 시드를 고정하도록 한다.\n### 프로젝트 시작하기\n1. 본 프로젝트 설명글을 자세하게 읽는다.\n2. 스켈레톤 코드를 복사/편집한다.\n3. 스켈레톤 코드 내의 [Empty Module]을 구현한다. <== 기존 스켈레톤 코드는 수정하지 않는다.\n4. 결과 파일(csv)을 리더보드에 제출하고 노트북의 버전을 저장한다. (베이스라인을 달성한 경우)\n5. 베이스라인 달성에 실패한 경우, 다시 설명글을 천천히 읽어나가며 디버깅을 시도한다.\n6. 베이스라인 이상의 추가적인 성능 향상 및 학습을 희망할 경우, <mark>베이스라인을 달성한 이후에 별도의 노트북을 사용</mark>하는 것을 권장한다.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    }
  ]
}