{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "da12b74b",
   "metadata": {},
   "source": [
    "# Lesson 39: Text vectorization demonstration\n",
    "\n",
    "This notebook demonstrates key concepts and tools for converting text into numerical vectors.\n",
    "\n",
    "**1. Sparse representations**\n",
    "- 1.1. One-hot encoding\n",
    "- 1.2. Bag-of-Words\n",
    "- 1.3. TF-IDF\n",
    "\n",
    "**2. Dense representations**\n",
    "- 2.1. Word2Vec\n",
    "\n",
    "**3. Comparison**\n",
    "- 3.1. Classification accuracy\n",
    "- 3.2. Visualizing encoding methods with t-SNE\n",
    "\n",
    "\n",
    "## Notebook set up\n",
    "\n",
    "**Note**: depending on your environment, you may need to install NLTK and gensim:\n",
    "\n",
    "```text\n",
    "pip install nltk gensim\n",
    "```\n",
    "\n",
    "### Imports\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "02b68845",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from matplotlib.patches import Patch\n",
    "from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.manifold import TSNE\n",
    "from gensim.models import Word2Vec\n",
    "from nltk.tokenize import word_tokenize\n",
    "from nltk.corpus import movie_reviews, stopwords\n",
    "\n",
    "import nltk\n",
    "nltk.download('punkt', quiet=True)\n",
    "nltk.download('punkt_tab', quiet=True)\n",
    "nltk.download('movie_reviews', quiet=True)\n",
    "nltk.download('stopwords', quiet=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cedbd7c0",
   "metadata": {},
   "source": [
    "### Load movie reviews corpus"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b5fe261a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total reviews: 2000\n",
      "Categories: {'neg', 'pos'}\n"
     ]
    }
   ],
   "source": [
    "# Load movie reviews dataset\n",
    "documents = [(movie_reviews.raw(fileid), category)\n",
    "             for category in movie_reviews.categories()\n",
    "             for fileid in movie_reviews.fileids(category)]\n",
    "\n",
    "all_texts = [doc[0] for doc in documents]\n",
    "all_labels = [doc[1] for doc in documents]\n",
    "\n",
    "print(f'Total reviews: {len(all_texts)}')\n",
    "print(f'Categories: {set(all_labels)}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7352d1d4",
   "metadata": {},
   "source": [
    "### Sample corpus for demonstrations\n",
    "\n",
    "Select a few sample reviews for encoding demonstrations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c67ff5e7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sample reviews from movie reviews dataset:\n",
      "\n",
      "Review 1: plot : two teen couples go to a church party , drink and then drive . they get i...\n",
      "Review 2: the happy bastard's quick movie review damn that y2k bug . it's got a head start...\n",
      "Review 3: it is movies like these that make a jaded movie viewer thankful for the inventio...\n",
      "Review 4: \" quest for camelot \" is warner bros . ' first feature-length , fully-animated a...\n",
      "Review 5: synopsis : a mentally unstable man undergoing psychotherapy saves a boy from a p...\n"
     ]
    }
   ],
   "source": [
    "# Select 5 sample reviews for demonstration and clean up whitespace\n",
    "corpus = [' '.join(review.split()) for review in all_texts[:5]]\n",
    "\n",
    "# Tokenize and remove stop words\n",
    "stop_words = set(stopwords.words('english'))\n",
    "\n",
    "tokenized_corpus = [\n",
    "    [w for w in word_tokenize(review.lower()) if w.isalpha() and w not in stop_words]\n",
    "    for review in corpus\n",
    "]\n",
    "\n",
    "print('Sample reviews from movie reviews dataset:')\n",
    "print()\n",
    "\n",
    "for i, review in enumerate(corpus):\n",
    "    print(f'Review {i+1}: {review[:80]}...' if len(review) > 80 else f'Review {i+1}: {review}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "821df645",
   "metadata": {},
   "source": [
    "## 1. Sparse representations\n",
    "\n",
    "### 1.1. One-hot encoding\n",
    "\n",
    "One-hot encoding represents each word as a sparse binary vector where only one element is 1 and all others are 0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "de4eea5a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vocabulary size: 867\n",
      "Vocabulary: able, accident, accidentally, across, acting, action, actor, actors, actually, adequate, ads, adults, adventures, affair, ago, allowing, already, also, although, always, american, anastasia, angry, animation, another, answers, anything, apart, apparent, apparently, apparitions, appears, applaud, arguing, around, arrival, arrow, arthur, aside, assuming, attempt, attempting, audience, average, avoid, away, awful, awfully, back, bad...\n"
     ]
    }
   ],
   "source": [
    "# Build vocabulary\n",
    "all_words = set()\n",
    "\n",
    "for sentence in tokenized_corpus:\n",
    "    all_words.update(sentence)\n",
    "\n",
    "vocab = sorted(list(all_words))\n",
    "word_to_idx = {word: idx for idx, word in enumerate(vocab)}\n",
    "\n",
    "print(f'Vocabulary size: {len(vocab)}')\n",
    "print(f'Vocabulary: {\", \".join(vocab[:50])}...')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "213dc7d7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sample sentences (truncated for display):\n",
      "  Review 1: plot : two teen couples go to a church party , drink and the...\n",
      "  Review 2: the happy bastard's quick movie review damn that y2k bug . i...\n",
      "  Review 3: it is movies like these that make a jaded movie viewer thank...\n",
      "  Review 4: \" quest for camelot \" is warner bros . ' first feature-lengt...\n",
      "  Review 5: synopsis : a mentally unstable man undergoing psychotherapy ...\n",
      "\n",
      "One-hot encoding (binary word presence per review):\n",
      "(Showing first 15 features only)\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>able</th>\n",
       "      <th>accident</th>\n",
       "      <th>accidentally</th>\n",
       "      <th>across</th>\n",
       "      <th>acting</th>\n",
       "      <th>action</th>\n",
       "      <th>actor</th>\n",
       "      <th>actors</th>\n",
       "      <th>actually</th>\n",
       "      <th>adequate</th>\n",
       "      <th>ads</th>\n",
       "      <th>adults</th>\n",
       "      <th>adventures</th>\n",
       "      <th>affair</th>\n",
       "      <th>ago</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Review 1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 5</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          able  accident  accidentally  across  acting  action  actor  actors  \\\n",
       "Review 1     0         1             0       0       0       0      0       1   \n",
       "Review 2     0         0             0       1       1       1      0       0   \n",
       "Review 3     0         0             0       0       1       0      0       0   \n",
       "Review 4     1         0             1       0       0       0      0       1   \n",
       "Review 5     0         1             0       0       0       0      1       0   \n",
       "\n",
       "          actually  adequate  ads  adults  adventures  affair  ago  \n",
       "Review 1         1         0    0       0           0       0    1  \n",
       "Review 2         0         0    0       0           0       0    0  \n",
       "Review 3         0         0    1       0           0       0    0  \n",
       "Review 4         0         0    0       1           1       0    0  \n",
       "Review 5         1         1    0       0           0       1    0  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# One-hot encode a document (binary presence of each word)\n",
    "def one_hot_encode_document(tokens, vocab_size, word_to_idx):\n",
    "\n",
    "    vector = np.zeros(vocab_size)\n",
    "\n",
    "    for word in tokens:\n",
    "        if word in word_to_idx:\n",
    "            vector[word_to_idx[word]] = 1\n",
    "\n",
    "    return vector\n",
    "\n",
    "# Show one-hot encoding for corpus reviews\n",
    "onehot_df = pd.DataFrame(\n",
    "    [one_hot_encode_document(tokens, len(vocab), word_to_idx) for tokens in tokenized_corpus],\n",
    "    index=[f'Review {i+1}' for i in range(len(corpus))],\n",
    "    columns=vocab\n",
    ").astype(int)\n",
    "\n",
    "print('Sample sentences (truncated for display):')\n",
    "\n",
    "for i, review in enumerate(corpus):\n",
    "    display_text = review[:60] + '...' if len(review) > 60 else review\n",
    "    print(f'  Review {i+1}: {display_text}')\n",
    "\n",
    "print('\\nOne-hot encoding (binary word presence per review):')\n",
    "print('(Showing first 15 features only)\\n')\n",
    "onehot_df.iloc[:, :15]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e4f5e3a",
   "metadata": {},
   "source": [
    "### 1.2. Bag-of-Words\n",
    "\n",
    "Bag-of-Words represents each document as a vector of word counts, ignoring word order.\n",
    "\n",
    "Scikit-learn [CountVectorizer](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html) documentation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "50ab94b3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sample reviews (truncated for display):\n",
      "  Review 1: plot two teen couples go church party drink drive get accide...\n",
      "  Review 2: happy bastard quick movie review damn bug got head start mov...\n",
      "  Review 3: movies like make jaded movie viewer thankful invention timex...\n",
      "  Review 4: quest camelot warner bros first attempt steal clout disney c...\n",
      "  Review 5: synopsis mentally unstable man undergoing psychotherapy save...\n",
      "\n",
      "Bag-of-Words (word counts per review):\n",
      "(Showing first 15 features only)\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>able</th>\n",
       "      <th>accident</th>\n",
       "      <th>accidentally</th>\n",
       "      <th>across</th>\n",
       "      <th>acting</th>\n",
       "      <th>action</th>\n",
       "      <th>actor</th>\n",
       "      <th>actors</th>\n",
       "      <th>actually</th>\n",
       "      <th>adequate</th>\n",
       "      <th>ads</th>\n",
       "      <th>adults</th>\n",
       "      <th>adventures</th>\n",
       "      <th>affair</th>\n",
       "      <th>ago</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Review 1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 5</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          able  accident  accidentally  across  acting  action  actor  actors  \\\n",
       "Review 1     0         1             0       0       0       0      0       1   \n",
       "Review 2     0         0             0       1       2       1      0       0   \n",
       "Review 3     0         0             0       0       1       0      0       0   \n",
       "Review 4     1         0             1       0       0       0      0       1   \n",
       "Review 5     0         1             0       0       0       0      2       0   \n",
       "\n",
       "          actually  adequate  ads  adults  adventures  affair  ago  \n",
       "Review 1         2         0    0       0           0       0    1  \n",
       "Review 2         0         0    0       0           0       0    0  \n",
       "Review 3         0         0    1       0           0       0    0  \n",
       "Review 4         0         0    0       1           1       0    0  \n",
       "Review 5         1         2    0       0           0       1    0  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Create Bag-of-Words representation\n",
    "# Join tokenized corpus back into strings for CountVectorizer\n",
    "tokenized_corpus_str = [' '.join(tokens) for tokens in tokenized_corpus]\n",
    "\n",
    "bow_vectorizer = CountVectorizer()\n",
    "bow_matrix = bow_vectorizer.fit_transform(tokenized_corpus_str)\n",
    "\n",
    "# Display as dataframe\n",
    "bow_df = pd.DataFrame(\n",
    "    bow_matrix.toarray(),\n",
    "    columns=bow_vectorizer.get_feature_names_out(),\n",
    "    index=[f'Review {i+1}' for i in range(len(tokenized_corpus_str))]\n",
    ")\n",
    "\n",
    "print('Sample reviews (truncated for display):')\n",
    "\n",
    "for i, review in enumerate(tokenized_corpus_str):\n",
    "    display_text = review[:60] + '...' if len(review) > 60 else review\n",
    "    print(f'  Review {i+1}: {display_text}')\n",
    "\n",
    "print('\\nBag-of-Words (word counts per review):')\n",
    "print('(Showing first 15 features only)\\n')\n",
    "bow_df.iloc[:, :15]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a917c75a",
   "metadata": {},
   "source": [
    "### 1.3. TF-IDF\n",
    "\n",
    "TF-IDF (Term Frequency-Inverse Document Frequency) weights words by their importance, giving lower weight to common words.\n",
    "\n",
    "**How TF-IDF is calculated:**\n",
    "\n",
    "TF-IDF = TF × IDF\n",
    "\n",
    "Where:\n",
    "- **TF (Term Frequency)** = Number of times term appears in document / Total terms in document\n",
    "- **IDF (Inverse Document Frequency)** = log(Total documents / Documents containing term)\n",
    "\n",
    "**Example calculation:**\n",
    "\n",
    "Consider 3 documents:\n",
    "- Doc 1: \"movie great\"\n",
    "- Doc 2: \"movie boring\"  \n",
    "- Doc 3: \"great film\"\n",
    "\n",
    "For the word \"movie\" in Doc 1:\n",
    "- TF = 1/2 = 0.5 (appears once, doc has 2 words)\n",
    "- IDF = log(3/2) ≈ 0.176 (3 total docs, \"movie\" in 2 docs)\n",
    "- **TF-IDF = 0.5 × 0.176 = 0.088**\n",
    "\n",
    "For the word \"boring\" in Doc 2:\n",
    "- TF = 1/2 = 0.5 (appears once, doc has 2 words)\n",
    "- IDF = log(3/1) ≈ 0.477 (3 total docs, \"boring\" in 1 doc)\n",
    "- **TF-IDF = 0.5 × 0.477 = 0.239**\n",
    "\n",
    "For the word \"boring\" in Doc 3:\n",
    "- TF = 0/2 = 0 (doesn't appear in Doc 3)\n",
    "- IDF = log(3/1) ≈ 0.477 (3 total docs, \"boring\" in 1 doc)\n",
    "- **TF-IDF = 0 × 0.477 = 0**\n",
    "\n",
    "**Key insight:** Words that appear in fewer documents get higher IDF scores, making them more distinctive.\n",
    "\n",
    "Scikit-learn [TfidfVectorizer](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html) documentation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "b76d8c17",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sample reviews (truncated for display):\n",
      "  Review 1: plot two teen couples go church party drink drive get accide...\n",
      "  Review 2: happy bastard quick movie review damn bug got head start mov...\n",
      "  Review 3: movies like make jaded movie viewer thankful invention timex...\n",
      "  Review 4: quest camelot warner bros first attempt steal clout disney c...\n",
      "  Review 5: synopsis mentally unstable man undergoing psychotherapy save...\n",
      "\n",
      "TF-IDF (weighted word importance per review):\n",
      "(Showing first 15 features only)\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>able</th>\n",
       "      <th>accident</th>\n",
       "      <th>accidentally</th>\n",
       "      <th>across</th>\n",
       "      <th>acting</th>\n",
       "      <th>action</th>\n",
       "      <th>actor</th>\n",
       "      <th>actors</th>\n",
       "      <th>actually</th>\n",
       "      <th>adequate</th>\n",
       "      <th>ads</th>\n",
       "      <th>adults</th>\n",
       "      <th>adventures</th>\n",
       "      <th>affair</th>\n",
       "      <th>ago</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Review 1</th>\n",
       "      <td>0.000</td>\n",
       "      <td>0.041</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.041</td>\n",
       "      <td>0.083</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.051</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 2</th>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.084</td>\n",
       "      <td>0.135</td>\n",
       "      <td>0.084</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 3</th>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.045</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.056</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 4</th>\n",
       "      <td>0.058</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.058</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.047</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.058</td>\n",
       "      <td>0.058</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Review 5</th>\n",
       "      <td>0.000</td>\n",
       "      <td>0.031</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.076</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.031</td>\n",
       "      <td>0.076</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.038</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           able  accident  accidentally  across  acting  action  actor  \\\n",
       "Review 1  0.000     0.041         0.000   0.000   0.000   0.000  0.000   \n",
       "Review 2  0.000     0.000         0.000   0.084   0.135   0.084  0.000   \n",
       "Review 3  0.000     0.000         0.000   0.000   0.045   0.000  0.000   \n",
       "Review 4  0.058     0.000         0.058   0.000   0.000   0.000  0.000   \n",
       "Review 5  0.000     0.031         0.000   0.000   0.000   0.000  0.076   \n",
       "\n",
       "          actors  actually  adequate    ads  adults  adventures  affair    ago  \n",
       "Review 1   0.041     0.083     0.000  0.000   0.000       0.000   0.000  0.051  \n",
       "Review 2   0.000     0.000     0.000  0.000   0.000       0.000   0.000  0.000  \n",
       "Review 3   0.000     0.000     0.000  0.056   0.000       0.000   0.000  0.000  \n",
       "Review 4   0.047     0.000     0.000  0.000   0.058       0.058   0.000  0.000  \n",
       "Review 5   0.000     0.031     0.076  0.000   0.000       0.000   0.038  0.000  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Create TF-IDF representation\n",
    "tfidf_vectorizer = TfidfVectorizer()\n",
    "tfidf_matrix = tfidf_vectorizer.fit_transform(tokenized_corpus_str)\n",
    "\n",
    "# Display as dataframe\n",
    "tfidf_df = pd.DataFrame(\n",
    "    tfidf_matrix.toarray().round(3),\n",
    "    columns=tfidf_vectorizer.get_feature_names_out(),\n",
    "    index=[f'Review {i+1}' for i in range(len(tokenized_corpus_str))]\n",
    ")\n",
    "\n",
    "print('Sample reviews (truncated for display):')\n",
    "\n",
    "for i, review in enumerate(tokenized_corpus_str):\n",
    "    display_text = review[:60] + '...' if len(review) > 60 else review\n",
    "    print(f'  Review {i+1}: {display_text}')\n",
    "\n",
    "print('\\nTF-IDF (weighted word importance per review):')\n",
    "print('(Showing first 15 features only)\\n')\n",
    "tfidf_df.iloc[:, :15]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "282f99ad",
   "metadata": {},
   "source": [
    "## 2. Dense representations\n",
    "\n",
    "### 2.1. Word2Vec\n",
    "\n",
    "Word2Vec learns dense vector representations where semantically similar words have similar vectors.\n",
    "\n",
    "**How Word2Vec learns:**\n",
    "- Uses a shallow neural network trained to predict word co-occurrences (e.g., given \"movie\" predict nearby words like \"loved\", \"great\")\n",
    "- The word embeddings are the weights of the hidden layer in the network\n",
    "- This creates a semantic space where words with similar meanings cluster together\n",
    "\n",
    "**Simple architecture example (3-word vocabulary, 2D embeddings):**\n",
    "```text\n",
    "\n",
    "  Input Layer       Hidden Layer       Output Layer\n",
    "  (One-hot)         (Embeddings)       (Predictions)\n",
    "                            \n",
    "cat   [1]  ────┐        [e₁]       ┌──── [P(cat)  ]\n",
    "dog   [0]  ────┼─────►  [e₂]  ─────┼──── [P(dog)  ]\n",
    "movie [0]  ────┘                   └──── [P(movie)]\n",
    "\n",
    "                \n",
    "                Word     Embedding\n",
    "                ────     ─────────\n",
    "                cat   →  [0.2, 0.8]\n",
    "                dog   →  [0.3, 0.7]\n",
    "                movie →  [0.9, 0.1]\n",
    "        \n",
    "The weights for a given word IS the embedding!\n",
    "```\n",
    "\n",
    "Gensim [Word2Vec](https://radimrehurek.com/gensim/models/word2vec.html) documentation\n",
    "\n",
    "Let's train Word2Vec on the full movie reviews corpus to capture rich semantic relationships.\n",
    "\n",
    "#### 2.1.1. Train Word2Vec model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c9647568",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Word2Vec on 2000 movie reviews...\n",
      "Vocabulary size: 14878\n"
     ]
    }
   ],
   "source": [
    "n_features = 500\n",
    "\n",
    "# Tokenize all movie reviews for Word2Vec training\n",
    "all_tokens = [word_tokenize(text.lower()) for text in all_texts]\n",
    "\n",
    "print(f'Training Word2Vec on {len(all_tokens)} movie reviews...')\n",
    "\n",
    "# Train Word2Vec model\n",
    "w2v_model = Word2Vec(\n",
    "    sentences=all_tokens,        # List of tokenized documents\n",
    "    vector_size=n_features,      # Dimensionality of the embedding\n",
    "    window=5,                    # Context window size (words before/after target)\n",
    "    min_count=5,                 # Minimum word frequency to include in vocabulary\n",
    "    seed=315                     # Random seed for reproducibility\n",
    ")\n",
    "\n",
    "print(f'Vocabulary size: {len(w2v_model.wv)}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "79fb2dbd",
   "metadata": {},
   "source": [
    "#### 2.1.2. Examining word vectors\n",
    "\n",
    "Let's look at the actual vector representations for some words."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "43639691",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Word2Vec vector size: 500\n",
      "Word vectors (dense, continuous values, showing first 10 dimensions):\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>dim_0</th>\n",
       "      <th>dim_1</th>\n",
       "      <th>dim_2</th>\n",
       "      <th>dim_3</th>\n",
       "      <th>dim_4</th>\n",
       "      <th>dim_5</th>\n",
       "      <th>dim_6</th>\n",
       "      <th>dim_7</th>\n",
       "      <th>dim_8</th>\n",
       "      <th>dim_9</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>loved</th>\n",
       "      <td>0.008</td>\n",
       "      <td>0.045</td>\n",
       "      <td>-0.116</td>\n",
       "      <td>0.199</td>\n",
       "      <td>-0.091</td>\n",
       "      <td>-0.074</td>\n",
       "      <td>0.188</td>\n",
       "      <td>0.199</td>\n",
       "      <td>-0.048</td>\n",
       "      <td>0.192</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>boring</th>\n",
       "      <td>-0.038</td>\n",
       "      <td>0.071</td>\n",
       "      <td>0.007</td>\n",
       "      <td>0.056</td>\n",
       "      <td>0.103</td>\n",
       "      <td>-0.312</td>\n",
       "      <td>0.228</td>\n",
       "      <td>0.013</td>\n",
       "      <td>-0.092</td>\n",
       "      <td>-0.210</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>movie</th>\n",
       "      <td>-0.298</td>\n",
       "      <td>-0.313</td>\n",
       "      <td>-0.529</td>\n",
       "      <td>0.157</td>\n",
       "      <td>0.485</td>\n",
       "      <td>-0.486</td>\n",
       "      <td>0.885</td>\n",
       "      <td>0.004</td>\n",
       "      <td>-0.159</td>\n",
       "      <td>-0.969</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        dim_0  dim_1  dim_2  dim_3  dim_4  dim_5  dim_6  dim_7  dim_8  dim_9\n",
       "loved   0.008  0.045 -0.116  0.199 -0.091 -0.074  0.188  0.199 -0.048  0.192\n",
       "boring -0.038  0.071  0.007  0.056  0.103 -0.312  0.228  0.013 -0.092 -0.210\n",
       "movie  -0.298 -0.313 -0.529  0.157  0.485 -0.486  0.885  0.004 -0.159 -0.969"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Show word vectors for sample words\n",
    "sample_words = ['loved', 'boring', 'movie']\n",
    "\n",
    "w2v_df = pd.DataFrame(\n",
    "    [w2v_model.wv[w][:10] for w in sample_words if w in w2v_model.wv],\n",
    "    index=[w for w in sample_words if w in w2v_model.wv],\n",
    "    columns=[f'dim_{i}' for i in range(10)]\n",
    ").round(3)\n",
    "\n",
    "print(f'Word2Vec vector size: {w2v_model.wv.vector_size}')\n",
    "print('Word vectors (dense, continuous values, showing first 10 dimensions):\\n')\n",
    "w2v_df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6766ebaa",
   "metadata": {},
   "source": [
    "## 3. Comparison\n",
    "\n",
    "### 3.1. Classification accuracy\n",
    "\n",
    "Let's compare how well each encoding method performs on a simple sentiment classification task using logistic regression. This demonstrates that while Word2Vec has semantic advantages, simpler count-based methods can still be very effective for labeled classification tasks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "62c262ca",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Prepare data for classification\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    all_texts, all_labels, test_size=0.2, random_state=315\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c9f71a13",
   "metadata": {},
   "source": [
    "#### 3.1.1. One-hot encoding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f5fe7930",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "One-hot accuracy: 0.7575\n"
     ]
    }
   ],
   "source": [
    "# One-hot encoding\n",
    "onehot_vec = CountVectorizer(binary=True, max_features=n_features)\n",
    "X_train_onehot = onehot_vec.fit_transform(X_train)\n",
    "X_test_onehot = onehot_vec.transform(X_test)\n",
    "\n",
    "lr_onehot = LogisticRegression(max_iter=1000, random_state=315)\n",
    "lr_onehot.fit(X_train_onehot, y_train)\n",
    "acc_onehot = accuracy_score(y_test, lr_onehot.predict(X_test_onehot))\n",
    "\n",
    "print(f'One-hot accuracy: {acc_onehot:.4f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0fbb7986",
   "metadata": {},
   "source": [
    "#### 3.1.2. Bag-of-Words"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a43eebd4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Bag-of-Words accuracy: 0.7450\n"
     ]
    }
   ],
   "source": [
    "# Bag-of-Words\n",
    "bow_vec = CountVectorizer(max_features=n_features)\n",
    "X_train_bow = bow_vec.fit_transform(X_train)\n",
    "X_test_bow = bow_vec.transform(X_test)\n",
    "\n",
    "lr_bow = LogisticRegression(max_iter=1000, random_state=315)\n",
    "lr_bow.fit(X_train_bow, y_train)\n",
    "acc_bow = accuracy_score(y_test, lr_bow.predict(X_test_bow))\n",
    "\n",
    "print(f'Bag-of-Words accuracy: {acc_bow:.4f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "52186562",
   "metadata": {},
   "source": [
    "#### 3.1.3. TF-IDF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "76525227",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TF-IDF accuracy: 0.7700\n"
     ]
    }
   ],
   "source": [
    "# TF-IDF\n",
    "tfidf_vec = TfidfVectorizer(max_features=n_features)\n",
    "X_train_tfidf = tfidf_vec.fit_transform(X_train)\n",
    "X_test_tfidf = tfidf_vec.transform(X_test)\n",
    "\n",
    "lr_tfidf = LogisticRegression(max_iter=1000, random_state=315)\n",
    "lr_tfidf.fit(X_train_tfidf, y_train)\n",
    "acc_tfidf = accuracy_score(y_test, lr_tfidf.predict(X_test_tfidf))\n",
    "\n",
    "print(f'TF-IDF accuracy: {acc_tfidf:.4f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c3c442b4",
   "metadata": {},
   "source": [
    "#### 3.1.4. Word2Vec"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "c942a2d3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Word2Vec accuracy: 0.6550\n"
     ]
    }
   ],
   "source": [
    "# Word2Vec (average word vectors per document)\n",
    "def get_doc_vector(text, model):\n",
    "\n",
    "    tokens = [w for w in word_tokenize(text.lower()) if w.isalpha()]\n",
    "    vectors = [model.wv[w] for w in tokens if w in model.wv]\n",
    "\n",
    "    if vectors:\n",
    "        return np.mean(vectors, axis=0)\n",
    "\n",
    "    return np.zeros(model.wv.vector_size)\n",
    "\n",
    "X_train_w2v = np.array([get_doc_vector(text, w2v_model) for text in X_train])\n",
    "X_test_w2v = np.array([get_doc_vector(text, w2v_model) for text in X_test])\n",
    "\n",
    "lr_w2v = LogisticRegression(max_iter=1000, random_state=315)\n",
    "lr_w2v.fit(X_train_w2v, y_train)\n",
    "acc_w2v = accuracy_score(y_test, lr_w2v.predict(X_test_w2v))\n",
    "\n",
    "print(f'Word2Vec accuracy: {acc_w2v:.4f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d03f7a5",
   "metadata": {},
   "source": [
    "#### 3.1.5. Results summary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "d4f9e032",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification accuracy comparison:\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Encoding Method</th>\n",
       "      <th>Test Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>One-hot</td>\n",
       "      <td>0.7575</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Bag-of-Words</td>\n",
       "      <td>0.7450</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>TF-IDF</td>\n",
       "      <td>0.7700</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Word2Vec</td>\n",
       "      <td>0.6550</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  Encoding Method  Test Accuracy\n",
       "0         One-hot         0.7575\n",
       "1    Bag-of-Words         0.7450\n",
       "2          TF-IDF         0.7700\n",
       "3        Word2Vec         0.6550"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Display results\n",
    "results_df = pd.DataFrame({\n",
    "    'Encoding Method': ['One-hot', 'Bag-of-Words', 'TF-IDF', 'Word2Vec'],\n",
    "    'Test Accuracy': [acc_onehot, acc_bow, acc_tfidf, acc_w2v]\n",
    "})\n",
    "\n",
    "print('Classification accuracy comparison:')\n",
    "print()\n",
    "results_df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e95e098",
   "metadata": {},
   "source": [
    "**Key observations:**\n",
    "\n",
    "1. **Simple count-based methods work well** for this task. One-hot, BoW, and TF-IDF all achieve strong performance on sentiment classification, demonstrating that frequency patterns are informative for supervised learning with labeled data.\n",
    "\n",
    "2. **Fair comparison:** All methods use 500 features (max_features=500 for count-based methods, vector_size=500 for Word2Vec), making the comparison equitable in terms of representational capacity.\n",
    "\n",
    "3. **Word2Vec with averaging** creates document vectors by averaging all word vectors in the document. While this loses information about word importance and frequency, it captures the overall semantic content of the document.\n",
    "\n",
    "4. **Task matters:** For sentiment classification with abundant labeled data, simpler methods are often sufficient and more interpretable. Word2Vec shines in tasks requiring semantic understanding, transfer learning, or when labeled data is scarce."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c5f9ccc8",
   "metadata": {},
   "source": [
    "### 3.2. Visualizing encoding methods with t-SNE\n",
    "\n",
    "Let's compare TF-IDF and Word2Vec to see the fundamental difference between sparse, frequency-based encodings and dense, semantically aware encodings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "499cc955",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Select interesting words representing different semantic categories\n",
    "interesting_words = [\n",
    "    'loved', 'enjoyed', 'brilliant', 'amazing', 'wonderful',\n",
    "    'boring', 'waste', 'disappointing', 'worst', 'awful',\n",
    "    'movie', 'film', 'story', 'plot', 'script',\n",
    "    'actor', 'actress', 'character', 'director'\n",
    "]\n",
    "\n",
    "# Filter to words in vocabulary\n",
    "words = [w for w in interesting_words if w in w2v_model.wv]\n",
    "\n",
    "# Get Word2Vec embeddings\n",
    "w2v_vectors = np.array([w2v_model.wv[w] for w in words])\n",
    "\n",
    "# TF-IDF: Fit on full corpus to get IDF weights, then extract word vectors\n",
    "tfidf_vectorizer_comp = TfidfVectorizer(vocabulary=words)\n",
    "tfidf_vectorizer_comp.fit(all_texts[:1000])  # Fit on subset to get IDF values\n",
    "\n",
    "# Get TF-IDF representation for each word (as single-word document)\n",
    "tfidf_vectors = tfidf_vectorizer_comp.transform(words).toarray()\n",
    "\n",
    "# Apply t-SNE to each encoding method\n",
    "tsne_tfidf = TSNE(n_components=2, random_state=315, perplexity=5)\n",
    "tsne_w2v = TSNE(n_components=2, random_state=315, perplexity=5)\n",
    "\n",
    "tfidf_2d = tsne_tfidf.fit_transform(tfidf_vectors)\n",
    "w2v_2d = tsne_w2v.fit_transform(w2v_vectors)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "2a58f322",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Create color mapping by word category\n",
    "colors = []\n",
    "\n",
    "for word in words:\n",
    "    if word in ['loved', 'enjoyed', 'brilliant', 'amazing', 'wonderful']:\n",
    "        colors.append('green')\n",
    "\n",
    "    elif word in ['boring', 'waste', 'disappointing', 'worst', 'awful']:\n",
    "        colors.append('red')\n",
    "\n",
    "    elif word in ['movie', 'film', 'story', 'plot', 'script']:\n",
    "        colors.append('blue')\n",
    "\n",
    "    else:\n",
    "        colors.append('purple')\n",
    "\n",
    "# Create 1x2 subplot\n",
    "fig, axes = plt.subplots(1, 2, figsize=(10, 4))\n",
    "\n",
    "# TF-IDF\n",
    "axes[0].scatter(tfidf_2d[:, 0], tfidf_2d[:, 1], c=colors, s=100)\n",
    "\n",
    "for i, word in enumerate(words):\n",
    "    axes[0].annotate(\n",
    "        word, (tfidf_2d[i, 0], tfidf_2d[i, 1]), \n",
    "        xytext=(5, 5), textcoords='offset points', fontsize=8\n",
    "    )\n",
    "\n",
    "axes[0].set_title('TF-IDF')\n",
    "axes[0].set_xlabel('t-SNE dimension 1')\n",
    "axes[0].set_ylabel('t-SNE dimension 2')\n",
    "\n",
    "# Word2Vec\n",
    "axes[1].scatter(w2v_2d[:, 0], w2v_2d[:, 1], c=colors, s=100)\n",
    "\n",
    "for i, word in enumerate(words):\n",
    "    axes[1].annotate(\n",
    "        word, (w2v_2d[i, 0], w2v_2d[i, 1]), \n",
    "        xytext=(5, 5), textcoords='offset points', fontsize=8\n",
    ")\n",
    "    \n",
    "axes[1].set_title('Word2Vec')\n",
    "axes[1].set_xlabel('t-SNE dimension 1')\n",
    "axes[1].set_ylabel('t-SNE dimension 2')\n",
    "\n",
    "# Add legend\n",
    "legend_elements = [\n",
    "    Patch(facecolor='green', label='Positive sentiment'),\n",
    "    Patch(facecolor='red', label='Negative sentiment'),\n",
    "    Patch(facecolor='blue', label='Film elements'),\n",
    "    Patch(facecolor='purple', label='People')\n",
    "]\n",
    "\n",
    "axes[0].legend(handles=legend_elements, loc='lower right')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "164ef982",
   "metadata": {},
   "source": [
    "**Interpreting the comparison:**\n",
    "\n",
    "Each plot shows the same set of words projected into 2D space using t-SNE. The colors indicate semantic categories.\n",
    "\n",
    "**Key observations:**\n",
    "\n",
    "1. **TF-IDF** is a sparse, frequency-based encoding. Each word occupies an independent dimension in the original space with no inherent relationships. When projected to 2D, words appear scattered without meaningful clusters because TF-IDF doesn't capture semantic similarity.\n",
    "\n",
    "2. **Word2Vec** captures semantic relationships in the original space, so semantically similar words cluster together even after dimension reduction. Positive sentiment words (\"loved,\" \"enjoyed,\") group together, negative sentiment words cluster, film-related terms cluster, etc.\n",
    "\n",
    "3. **Why this matters:** If you're building a system that needs to understand that \"excellent\" and \"brilliant\" mean similar things, or that \"actor\" and \"director\" are related concepts, Word2Vec provides that information naturally. TF-IDF treats these as completely independent features.\n",
    "\n",
    "This visualization demonstrates the core advantage of dense embeddings: **semantic awareness**. While TF-IDF is computationally efficient and works well for many tasks, Word2Vec's ability to capture meaning makes it powerful for applications requiring semantic understanding."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
