{ "cells": [ { "cell_type": "markdown", "id": "f66dd046", "metadata": { "id": "f66dd046" }, "source": [ "# Phân loại bình luận độc hại tiếng Việt" ] }, { "cell_type": "markdown", "id": "5fa52cc9", "metadata": { "id": "5fa52cc9" }, "source": [ "## Thư viện" ] }, { "cell_type": "code", "execution_count": 1, "id": "8b5e9e84", "metadata": { "id": "8b5e9e84" }, "outputs": [], "source": [ "# import thu vien\n", "import os\n", "import re\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from pathlib import Path\n" ] }, { "cell_type": "markdown", "id": "32cda8f6", "metadata": { "id": "32cda8f6" }, "source": [ "## Tải dữ liệu" ] }, { "cell_type": "code", "execution_count": 2, "id": "f1969311", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "f1969311", "outputId": "65541e03-4a50-43fc-86d0-0f4a5320ba67" }, "outputs": [], "source": [ "# lay thu muc goc cua project\n", "PROJECT_ROOT = Path.cwd()\n", "if not (PROJECT_ROOT / \"data\").exists() and (PROJECT_ROOT.parent / \"data\").exists():\n", " PROJECT_ROOT = PROJECT_ROOT.parent\n", "\n", "# duong dan du lieu\n", "BASE_DIR = str(PROJECT_ROOT / \"data\")\n", "RAW_DIR = os.path.join(BASE_DIR, \"raw\")\n", "PROCESSED_DIR = os.path.join(BASE_DIR, \"processed\")\n", "\n", "TRAIN_PATH = os.path.join(RAW_DIR, \"train_raw.csv\")\n", "VAL_PATH = os.path.join(RAW_DIR, \"val_raw.csv\")\n", "TEST_PATH = os.path.join(RAW_DIR, \"test_raw.csv\")\n", "\n", "TEXT_COL = \"free_text\"\n", "LABEL_COL = \"label_id\"\n", "\n", "LABEL_MAP = {\n", " 0: \"CLEAN\",\n", " 1: \"OFFENSIVE\",\n", " 2: \"HATE\"\n", "}\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "95e7d04a", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "95e7d04a", "outputId": "98618340-cbbb-469e-fb52-eacf6f124c3e" }, "outputs": [ { "data": { "text/plain": [ "((27767, 2), (2672, 2), (6680, 2))" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# doc du lieu\n", "train_df = pd.read_csv(TRAIN_PATH)\n", "val_df = pd.read_csv(VAL_PATH)\n", "test_df = pd.read_csv(TEST_PATH)\n", "\n", "assert TEXT_COL in train_df.columns and LABEL_COL in train_df.columns\n", "assert TEXT_COL in val_df.columns and LABEL_COL in val_df.columns\n", "assert TEXT_COL in test_df.columns and LABEL_COL in test_df.columns\n", "\n", "train_df.shape, val_df.shape, test_df.shape" ] }, { "cell_type": "markdown", "id": "c33d6d43", "metadata": { "id": "c33d6d43" }, "source": [ "## Kiểm tra dữ liệu" ] }, { "cell_type": "code", "execution_count": 4, "id": "e45fcb8a", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "e45fcb8a", "outputId": "e819b02f-8f54-4776-9f44-2c39dc08454b" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
free_textlabel_id
0Em được làm fan cứng luôn rồi nè ❤️ reaction q...0
1Đúng là bọn mắt híp lò xo thụt :))) bên việt n...2
2Đậu Văn Cường giờ giống thằng sida hơn à0
3CÔN ĐỒ CỤC SÚC VÔ NHÂN TÍNH ĐỀ NGHI VN. NHÀ NƯ...2
4Từ lý thuyết đến thực hành là cả 1 câu chuyện ...0
\n", "
" ], "text/plain": [ " free_text label_id\n", "0 Em được làm fan cứng luôn rồi nè ❤️ reaction q... 0\n", "1 Đúng là bọn mắt híp lò xo thụt :))) bên việt n... 2\n", "2 Đậu Văn Cường giờ giống thằng sida hơn à 0\n", "3 CÔN ĐỒ CỤC SÚC VÔ NHÂN TÍNH ĐỀ NGHI VN. NHÀ NƯ... 2\n", "4 Từ lý thuyết đến thực hành là cả 1 câu chuyện ... 0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# xem du lieu\n", "train_df.head()" ] }, { "cell_type": "code", "execution_count": 5, "id": "23e0aa49", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "23e0aa49", "outputId": "5a68d4e3-9a67-469f-97d3-ed774a668c21" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "free_text 2\n", "label_id 0\n", "dtype: int64\n", "\n", "label_id\n", "0 20592\n", "1 3864\n", "2 3311\n", "Name: count, dtype: int64\n" ] } ], "source": [ "# kiem tra null va phan bo nhan\n", "print(train_df[[TEXT_COL, LABEL_COL]].isnull().sum())\n", "print()\n", "print(train_df[LABEL_COL].value_counts().sort_index())" ] }, { "cell_type": "code", "execution_count": 6, "id": "966bf99c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== RAW DATA OVERLAPS ===\n", "Train-Val overlap: 318\n", "Train-Test overlap: 782\n", "Val-Test overlap: 91\n", "\n", "Total unique texts:\n", "Train: 26277, Val: 2650, Test: 6576\n", "Combined unique: 34322\n" ] } ], "source": [ "# check for raw overlaps between datasets\n", "train_raw_texts = set(train_df[TEXT_COL].fillna(\"\").astype(str).values)\n", "val_raw_texts = set(val_df[TEXT_COL].fillna(\"\").astype(str).values)\n", "test_raw_texts = set(test_df[TEXT_COL].fillna(\"\").astype(str).values)\n", "\n", "train_val_overlap_raw = len(train_raw_texts & val_raw_texts)\n", "train_test_overlap_raw = len(train_raw_texts & test_raw_texts)\n", "val_test_overlap_raw = len(val_raw_texts & test_raw_texts)\n", "\n", "print(\"=== RAW DATA OVERLAPS ===\")\n", "print(f\"Train-Val overlap: {train_val_overlap_raw}\")\n", "print(f\"Train-Test overlap: {train_test_overlap_raw}\")\n", "print(f\"Val-Test overlap: {val_test_overlap_raw}\")\n", "print(f\"\\nTotal unique texts:\")\n", "print(f\"Train: {len(train_raw_texts)}, Val: {len(val_raw_texts)}, Test: {len(test_raw_texts)}\")\n", "print(f\"Combined unique: {len(train_raw_texts | val_raw_texts | test_raw_texts)}\")" ] }, { "cell_type": "markdown", "id": "15939010", "metadata": { "id": "15939010" }, "source": [ "## Khám phá dữ liệu" ] }, { "cell_type": "code", "execution_count": 7, "id": "d9f00a84", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 410 }, "id": "d9f00a84", "outputId": "e992448d-5162-4878-febb-ac77c4960ea3" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# ve phan bo nhan\n", "label_count = train_df[LABEL_COL].value_counts().sort_index()\n", "label_name = [LABEL_MAP.get(i, str(i)) for i in label_count.index]\n", "\n", "plt.figure(figsize=(7, 4))\n", "plt.bar(label_name, label_count.values)\n", "plt.title(\"Train label distribution\")\n", "plt.xlabel(\"Label\")\n", "plt.ylabel(\"Count\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 8, "id": "44634080", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "44634080", "outputId": "68f31dbb-30de-45b5-bd34-387d88a6ece4" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
statchar_lenword_len
0mean60.9414.27
1median37.009.00
2p95194.0046.00
3p99330.0077.34
4max20992.001701.00
\n", "
" ], "text/plain": [ " stat char_len word_len\n", "0 mean 60.94 14.27\n", "1 median 37.00 9.00\n", "2 p95 194.00 46.00\n", "3 p99 330.00 77.34\n", "4 max 20992.00 1701.00" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# thong ke do dai\n", "train_text = train_df[TEXT_COL].fillna(\"\").astype(str)\n", "\n", "char_len = train_text.str.len()\n", "word_len = train_text.str.split().str.len()\n", "\n", "char_p99 = char_len.quantile(0.99)\n", "word_p99 = word_len.quantile(0.99)\n", "\n", "length_stats = pd.DataFrame({\n", " \"stat\": [\"mean\", \"median\", \"p95\", \"p99\", \"max\"],\n", " \"char_len\": [\n", " round(char_len.mean(), 2),\n", " round(char_len.median(), 2),\n", " round(char_len.quantile(0.95), 2),\n", " round(char_p99, 2),\n", " int(char_len.max())\n", " ],\n", " \"word_len\": [\n", " round(word_len.mean(), 2),\n", " round(word_len.median(), 2),\n", " round(word_len.quantile(0.95), 2),\n", " round(word_p99, 2),\n", " int(word_len.max())\n", " ]\n", "})\n", "\n", "length_stats" ] }, { "cell_type": "code", "execution_count": 9, "id": "8af0af6d", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 803 }, "id": "8af0af6d", "outputId": "40e80021-a7c6-44e7-b4b5-adf7d90931f7" }, "outputs": [ { "data": { "image/png": "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RJ7yISEhZvEUFhYmxUFDHEGOa8Xnyjf4/nGt+Fz5Dt+/vC5XE+dSSgJAcHCwtGvXTtasWeNVy6br0dHRPj03AACAqxUQNXJKm0oHDhwoN954o5k7TqcfOXv2rDzyyCO+PjUAAICrEjBB7sEHH5QTJ07IxIkTzYTA119/vSQkJOQZAOEr2pQ7adKkPE264FrxueL750/4fxXXis+UfwmYeeQAAABKmoDoIwcAAFASEeQAAAAsRZADAACwFEEOAADAUgQ5PzF79mypV6+elCtXTjp06CCbN2+WQDZ58mRzFw3PpWnTpu79mZmZEhcXZ+62UalSJendu3eeCZ9Lqi+++EJ69OhhZvvW6/Lhhx967dfxSzo6OzIyUsqXL2/uKfzDDz94ldE7lfTr189MwKmTXQ8ePFjOnDkjgXatBg0alOdzdvfddwfctdLbErZv314qV64sNWvWlJ49e8q+ffu8yhTkO5ecnCzdu3eXChUqmOOMGTNGLl26JIF2rTp16pTnczVs2LCAulZz586V1q1buyf51TlbV65c6d7P56nwEOT8wHvvvWfmudPpR7755htp06aNxMbGSmpqqgSyFi1ayLFjx9zLV1995d43atQo+eSTT2TJkiWyfv16OXr0qPTq1UsCgc5/qJ8RDf/5mT59urz22msyb948+frrr6VixYrm86T/43TRYLJ7925ZtWqVLF++3ASeoUOHSqBdK6XBzfNz9u6773rtD4Rrpd8hDWmbNm0y7/PixYvStWtXc/0K+p3T+1lrMLlw4YJs3LhR3n77bZk/f775oyLQrpUaMmSI1+dKv5eBdK1q164t06ZNk23btsnWrVulc+fOct9995nvkuLzVIh0+hH41k033eTExcW517Ozs51atWo58fHxTqCaNGmS06ZNm3z3paWlOWXLlnWWLFni3rZnzx6dRsdJSkpyAom+52XLlrnXc3JynIiICGfGjBle1yskJMR59913zfr3339vnrdlyxZ3mZUrVzpBQUHOzz//7ATKtVIDBw507rvvvt98TqBeq9TUVPO+169fX+Dv3KeffuqUKlXKSUlJcZeZO3euU6VKFScrK8sJlGul7rjjDufJJ5/8zecE6rW65pprnDfffJPPUyGjRs7H9C8y/YtFm79cSpUqZdaTkpIkkGlzoDaJNWjQwNSKaFOE0uulfwV7XjNtdq1Tp07A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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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C8CvItgBQA7alFq7dm3T7KoPDXSqVq1aUqdOHfnss8/M8q5du17RuStXrtwVldfRudo0+/7775s+eOPHj5c2bdpIWloa1wxAngh2AJAH7TuntXL68J7mRPu46SCIbdu2mTI6IjYkJES2bNniKaM1eFrb17x58189t/o+rdnTGkDXL7/8Il9//bVPueDgYImKipIpU6bInj175NChQ5KYmMg1A5Cn4LwXA0Bg09A2ZMgQE9LcGjulPw8dOtQ0o2oZrYUbPHiwGQihTak6/YmGMG0yHThw4K9uX0fC6np9X9WqVc2I2hdeeEFKlPj//7+9cuVK+e6770yYrFy5snz00UeSnZ3t01wLAN4IdgCQBw1tOvK1adOmZpoR72B3+vRpz7QoSke6auDSfnC6TvvSrV271oSxy5k6daqZM++BBx4wza7PPvus6bPnCgsLkw8//FAmTJhg+vXptCfaLNuiRQuuGYA8BekIirxXAQAA4HpCHzsAAABLEOwAAAAsQbADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAABA7/B+VpX6nJfdargAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# ve do dai binh luan\n", "plt.figure(figsize=(7, 4))\n", "plt.hist(char_len[char_len <= char_p99], bins=50)\n", "plt.title(\"Train char length\")\n", "plt.xlabel(\"Chars\")\n", "plt.ylabel(\"Count\")\n", "plt.show()\n", "\n", "plt.figure(figsize=(7, 4))\n", "plt.hist(word_len[word_len <= word_p99], bins=50)\n", "plt.title(\"Train word length\")\n", "plt.xlabel(\"Words\")\n", "plt.ylabel(\"Count\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "30df01c9", "metadata": { "id": "30df01c9" }, "source": [ "## Tiền xử lý" ] }, { "cell_type": "code", "execution_count": 10, "id": "b6bf9435", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "b6bf9435", "outputId": "0bf3ffa7-cdef-48e0-b5e4-7017cf977bd1" }, "outputs": [ { "data": { "text/plain": [ "((27765, 5), (2672, 5), (6680, 5))" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ham xu ly text\n", "url_pattern = re.compile(r\"https?://\\S+|www\\.\\S+\")\n", "\n", "def clean_text(text):\n", " if pd.isna(text):\n", " return np.nan\n", " text = str(text)\n", " text = text.replace(\"\\n\", \" \").replace(\"\\t\", \" \")\n", " text = url_pattern.sub(\"[URL]\", text)\n", " text = re.sub(r\"\\s+\", \" \", text).strip()\n", " return text\n", "\n", "def to_label_id(value):\n", " if pd.isna(value):\n", " return np.nan\n", " if isinstance(value, str):\n", " value = value.strip().upper()\n", " if value in [\"CLEAN\", \"OFFENSIVE\", \"HATE\"]:\n", " return {\"CLEAN\": 0, \"OFFENSIVE\": 1, \"HATE\": 2}[value]\n", " try:\n", " value = int(value)\n", " if value in LABEL_MAP:\n", " return value\n", " except:\n", " pass\n", " return np.nan\n", "\n", "def preprocess(df):\n", " data = df[[TEXT_COL, LABEL_COL]].copy()\n", " data[\"text_original\"] = data[TEXT_COL]\n", " data[\"text_clean\"] = data[TEXT_COL].apply(clean_text)\n", " data = data.dropna(subset=[\"text_clean\", LABEL_COL]).copy()\n", " data = data[data[\"text_clean\"].str.strip() != \"\"].copy()\n", " data[\"label_id\"] = data[LABEL_COL].apply(to_label_id)\n", " data = data.dropna(subset=[\"label_id\"]).copy()\n", " data[\"label_id\"] = data[\"label_id\"].astype(int)\n", " data[\"label_name\"] = data[\"label_id\"].map(LABEL_MAP)\n", " data[\"label_binary\"] = data[\"label_id\"].apply(lambda x: 0 if x == 0 else 1)\n", " return data[[\"text_original\", \"text_clean\", \"label_id\", \"label_name\", \"label_binary\"]]\n", "\n", "train_processed = preprocess(train_df)\n", "val_processed = preprocess(val_df)\n", "test_processed = preprocess(test_df)\n", "\n", "train_processed.shape, val_processed.shape, test_processed.shape" ] }, { "cell_type": "code", "execution_count": 11, "id": "b4b8f813", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "b4b8f813", "outputId": "74811f2e-37b9-4126-934c-0eb25a329fc0" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
text_originaltext_cleanlabel_idlabel_namelabel_binary
0Em được làm fan cứng luôn rồi nè ❤️ reaction q...Em được làm fan cứng luôn rồi nè ❤️ reaction q...0CLEAN0
1Đúng là bọn mắt híp lò xo thụt :))) bên việt n...Đúng là bọn mắt híp lò xo thụt :))) bên việt n...2HATE1
2Đậu Văn Cường giờ giống thằng sida hơn àĐậu Văn Cường giờ giống thằng sida hơn à0CLEAN0
3CÔN ĐỒ CỤC SÚC VÔ NHÂN TÍNH ĐỀ NGHI VN. NHÀ NƯ...CÔN ĐỒ CỤC SÚC VÔ NHÂN TÍNH ĐỀ NGHI VN. NHÀ NƯ...2HATE1
4Từ lý thuyết đến thực hành là cả 1 câu chuyện ...Từ lý thuyết đến thực hành là cả 1 câu chuyện ...0CLEAN0
\n", "
" ], "text/plain": [ " text_original \\\n", "0 Em được làm fan cứng luôn rồi nè ❤️ reaction q... \n", "1 Đúng là bọn mắt híp lò xo thụt :))) bên việt n... \n", "2 Đậu Văn Cường giờ giống thằng sida hơn à \n", "3 CÔN ĐỒ CỤC SÚC VÔ NHÂN TÍNH ĐỀ NGHI VN. NHÀ NƯ... \n", "4 Từ lý thuyết đến thực hành là cả 1 câu chuyện ... \n", "\n", " text_clean label_id label_name \\\n", "0 Em được làm fan cứng luôn rồi nè ❤️ reaction q... 0 CLEAN \n", "1 Đúng là bọn mắt híp lò xo thụt :))) bên việt n... 2 HATE \n", "2 Đậu Văn Cường giờ giống thằng sida hơn à 0 CLEAN \n", "3 CÔN ĐỒ CỤC SÚC VÔ NHÂN TÍNH ĐỀ NGHI VN. NHÀ NƯ... 2 HATE \n", "4 Từ lý thuyết đến thực hành là cả 1 câu chuyện ... 0 CLEAN \n", "\n", " label_binary \n", "0 0 \n", "1 1 \n", "2 0 \n", "3 1 \n", "4 0 " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# xem du lieu sau xu ly\n", "train_processed.head()" ] }, { "cell_type": "code", "execution_count": 12, "id": "a3e2e77e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train duplicates: 1489\n", "Val duplicates: 22\n", "Test duplicates: 104\n", "\n", "Train-Val overlap: 318\n", "Train-Test overlap: 782\n", "Val-Test overlap: 91\n" ] } ], "source": [ "# check for duplicates in each dataset\n", "train_duplicates = train_processed['text_original'].duplicated().sum()\n", "val_duplicates = val_processed['text_original'].duplicated().sum()\n", "test_duplicates = test_processed['text_original'].duplicated().sum()\n", "\n", "print(f\"Train duplicates: {train_duplicates}\")\n", "print(f\"Val duplicates: {val_duplicates}\")\n", "print(f\"Test duplicates: {test_duplicates}\")\n", "\n", "# check for overlaps between datasets\n", "train_texts = set(train_processed['text_clean'].values)\n", "val_texts = set(val_processed['text_clean'].values)\n", "test_texts = set(test_processed['text_clean'].values)\n", "\n", "train_val_overlap = len(train_texts & val_texts)\n", "train_test_overlap = len(train_texts & test_texts)\n", "val_test_overlap = len(val_texts & test_texts)\n", "\n", "print(f\"\\nTrain-Val overlap: {train_val_overlap}\")\n", "print(f\"Train-Test overlap: {train_test_overlap}\")\n", "print(f\"Val-Test overlap: {val_test_overlap}\")" ] }, { "cell_type": "code", "execution_count": 13, "id": "510ff305", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== DUPLICATES REMOVED ===\n", "Train: 27765 -> 26276 (removed 1489)\n", "Val: 2672 -> 2650 (removed 22)\n", "Test: 6680 -> 6576 (removed 104)\n", "\n", "Verification - Remaining duplicates:\n", "Train: 0, Val: 0, Test: 0\n" ] } ], "source": [ "# remove duplicates from processed datasets\n", "train_processed_clean = train_processed.drop_duplicates(subset=['text_clean']).copy()\n", "val_processed_clean = val_processed.drop_duplicates(subset=['text_clean']).copy()\n", "test_processed_clean = test_processed.drop_duplicates(subset=['text_clean']).copy()\n", "\n", "print(\"=== DUPLICATES REMOVED ===\")\n", "print(f\"Train: {len(train_processed)} -> {len(train_processed_clean)} (removed {len(train_processed) - len(train_processed_clean)})\")\n", "print(f\"Val: {len(val_processed)} -> {len(val_processed_clean)} (removed {len(val_processed) - len(val_processed_clean)})\")\n", "print(f\"Test: {len(test_processed)} -> {len(test_processed_clean)} (removed {len(test_processed) - len(test_processed_clean)})\")\n", "\n", "# verify no duplicates\n", "train_check = train_processed_clean['text_clean'].duplicated().sum()\n", "val_check = val_processed_clean['text_clean'].duplicated().sum()\n", "test_check = test_processed_clean['text_clean'].duplicated().sum()\n", "\n", "print(f\"\\nVerification - Remaining duplicates:\")\n", "print(f\"Train: {train_check}, Val: {val_check}, Test: {test_check}\")" ] }, { "cell_type": "markdown", "id": "5d76273e", "metadata": { "id": "5d76273e" }, "source": [ "## Lưu dữ liệu" ] }, { "cell_type": "markdown", "id": "9b1a5d15", "metadata": {}, "source": [ "## Remove comments in train that overlap with val" ] }, { "cell_type": "code", "execution_count": 14, "id": "9e743e56", "metadata": {}, "outputs": [], "source": [ "# remove overlap samples from train\n", "train_final = train_processed_clean[~train_processed_clean['text_clean'].isin(val_texts | test_texts)].copy()" ] }, { "cell_type": "code", "execution_count": 15, "id": "63e23089", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(25186, 5)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_final.shape" ] }, { "cell_type": "code", "execution_count": 25, "id": "3ac07300", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1090" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(train_processed_clean)-train_final.shape[0]" ] }, { "cell_type": "code", "execution_count": 16, "id": "71b7ab9c", "metadata": { "id": "71b7ab9c" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Files saved:\n", "Train: 25186 samples\n", "Val: 2650 samples\n", "Test: 6576 samples\n" ] } ], "source": [ "# luu file processed (duplicates removed)\n", "os.makedirs(PROCESSED_DIR, exist_ok=True)\n", "\n", "train_final.to_csv(os.path.join(PROCESSED_DIR, \"train_processed.csv\"), index=False)\n", "val_processed_clean.to_csv(os.path.join(PROCESSED_DIR, \"val_processed.csv\"), index=False)\n", "test_processed_clean.to_csv(os.path.join(PROCESSED_DIR, \"test_processed.csv\"), index=False)\n", "\n", "print(f\"\\nFiles saved:\")\n", "print(f\"Train: {len(train_final)} samples\")\n", "print(f\"Val: {len(val_processed_clean)} samples\")\n", "print(f\"Test: {len(test_processed_clean)} samples\")" ] }, { "cell_type": "markdown", "id": "c7da380c", "metadata": {}, "source": [ "## Class balance status post processing" ] }, { "cell_type": "code", "execution_count": 17, "id": "de497997", "metadata": {}, "outputs": [ { "data": { "image/png": "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hX44SqU/SkehJ+n6Sbt27fLf9MNAKvOy0047VfhDwpJq27Ztvt0PP/yw3Cj09957b7H3kSZHTcuf/vSnPEIxhSl33313npxzcYPnJRmJMb/0GJU+PqUjvysqoTL/qPElObbSxynd/iabbFJYnybQSz/epO0AdUV6n09BeRphnt7308jzbbfdtrA9fYHfY4894uabby53vfR+mUbH/VL6V/0rQF2zpN8Dl+Z3NP2wfhgqi9IuUM1KRwKX/UU01Ri//vrra8SxpH8PGjRooddJs66XbZsup9nXS+vO/u53v8sjANIIv/nNmTMnhxRLolu3bvnvNddcU279wIEDF3ndVKZk/l+et9xyy/y39NTBxo0b579LelwLM2LEiDyiv9Qrr7wSL7/8cuF+lH7ITLXw//3vfxfWjR8/Ps9kX9aSHNvee+9d4eNy1VVX5b/du3f/2fcJoLYpHX1+8cUXx7hx48qNRi/t/+bvH1Jt17Lv37+E/lX/ClDXLO73wKr4jqYf1g9DZTEiHapZmsgzjUju0aNHnkAz/dp+xx13VMupRunU9xTqnnXWWTk8SOVm/va3vy20TnYqQTNy5Mh87GkCzX/84x95Est06nzpqXqpbM1xxx0X/fv3z+FFly5dctCeRkqnkCKF9AcddNBiH2P6UHXooYfmHxpSzb30+I0ePTo++OCDRV43jbRP10v16NP9TBO73njjjfl+lgbPabREmnjznnvuySPt0+n9m222WV5+jlSjfOedd84Tt6QPginYXm211eKcc84ptEmnLqaAu2vXrtGzZ89cL3DIkCHRoUOHmDZtWqHdkhzbFltskZ+XG264oVA+KIX46TFIE6CmkZcAdUX79u1zf/HAAw/ky/MH6b/5zW9yebU0IXhql0aupVPR558H5OfSv+pfAeqaxf0eWBXf0fTD+mGoNCVApevdu3dKwcut22233Uo6dOhQYfsXXnihZPvtty9ZccUVS1q3bl1yzjnnlDz22GN5H0899VShXY8ePUratm1buPzxxx/nNldeeeUC+0zrL7nkkqLHmfY9/228/fbbJZ07dy5ZaaWVSlq0aFFy7LHHlowfPz63u/XWW8sdS5MmTUo+/PDDki5dupQ0bty4ZI011si3OXfu3AVu64YbbijZZptt8n1ceeWVSzp27Jjv5+eff17uMUrLovz0008lp5xySslqq62Wj2GfffYp+eyzzxa4z+l407r0OCWvv/56yaGHHlqyzjrrlDRq1KikZcuWJb/5zW9KXnvttXL7f/HFF/OxNmzYsNw+S+9zRYo9NwMGDChp06ZNvs1ddtklP57zu/POO0vWXXfdfJtbbrllfv7n32exY0t/53/NzZ49u+TSSy8tad++fcnyyy+fj+H8888vmTFjRrl26Ta6d+++wDEt7vMBUBtcd911+X1yu+22W2Bbel8888wzS1q1apX7qZ122qlkzJgxC7wPlr63l+0PK6J/1b8m+legrn8HXpzvgb/0O1pF9MP64UQ/zNJQL/2n8mJ5AAAAAABYtqiRDgAAAAAARQjSAQAAAACgCEE6AAAAAAAUIUgHAAAAAIAiBOkAAAAAAFCEIB0AAAAAAIpoUGwji2/evHnx+eefx8orrxz16tXz0AFQ65WUlMT3338frVu3jvr1a95v7/peAJY1+l4AqLl9ryC9kqQQvU2bNpW1OwCoMT777LNYe+21o6bR9wKwrNL3AkDN63sF6ZUkjUQvfdCbNm1aWbsFgGozbdq0/CNxaR9X0+h7AVjW6HsBoOb2vYL0SlJaziWF6IJ0AJYlNbVkmb4XgGWVvhcAal7fW/MKnlIrDB48OH71q19Fo0aNYv/99y+37e23344999wzVllllVhzzTWjV69e8eOPPxa2H3TQQdGqVav8g0P79u3jsssuK2z73//93/jtb3+br9e8efPYaaed4oUXXii3/5kzZ8ZZZ52V97HSSitFx44dY9KkSVVwrwEAAACAukiQzs+SCvBfeOGFceyxxy6w7bDDDouNNtooJk+eHG+99VaMHz8++vXrV9h+ySWX5OA7nTrxzDPPxPDhw+POO+/M26ZMmRLdunXL1/vmm2/iqKOOir333ju+/vrrwvWPPvro+PDDD2Ps2LF5MoD77rsvh+4AAAAAAEuDIJ2f5YADDsgj0Vu0aLHAto8++iiOOOKIaNiwYay++uqx77775mC8VBpBnkayl542kWbEff/99/Pl7bbbLo9gT9dbbrnlclCf/r755pt5+8SJE+OBBx6IW265JYf56fobb7yxIB0AAAAAWGoE6VS6VHbl9ttvj59++im+/PLLuP/++2OfffYp1+bEE0+Mxo0bxzrrrBPTp0/PI88rkgL4NOp80003zZfTCPZ27drl0fApbN9ggw3iiiuu8CwCAAAAAEuNIJ1Kl0qzPP/883m221THPM18+8c//rFcm+uvvz4H6K+++moceeSRuZ76/FKZl0MOOSQuuOCCXDM9+fbbb3MN9lQb/bPPPosRI0bEoEGD4o477vBMAgAAAABLhSCdSvXdd99F586dc0mWNMFoCr6bNGmSS70s8OKrXz9PWJoC9zSKvaypU6dG165dY+edd44+ffoU1qcAPZV66du3b6ywwgrRoUOHHNI/9NBDnkkAAAAAYKlosHR2S12VJgFNJV1OOeWUXL881Uk/7rjj8ij1hZk9e3ahRnrZED2F5EOGDMn7KbXFFlvkv2XXAQAAAAAsTUak87PMmTMnZsyYkf/Omzcv/3vWrFl54s80ajyVbknbUn3zG2+8Mbbaaqt8vU8++ST+9re/5bIu6XovvvhiXHPNNTk4T6ZNmxZ77bVXbLjhhnHTTTctEJjvuuuuuS76pZdemgP49957L4YOHRr77befZxIAAAAAWCoE6fwsl112Way44orxpz/9KZdVSf/u0qVLDtHT5bvuuitatGiRJwZNtc5vu+22wnUHDhwYa6+9djRv3jyXZTn55JPjvPPOy9vSxKQvvfRSDtubNm2a95eWYcOG5e2prMuDDz4YY8aMyddPofupp54ahx9+uGcSAAAAAFgq6pWUlJQsnV3XLWkkdbNmzXJZkhQAA0BtV9P7tpp+fACwrPVtNf34AGBp9m1GpAMAAAAAQBGCdAAAAAAAKKJBsY1Ur3bnPeIpWAZMurx7dR8CAAAAAPALGJEOAAAAAABFCNIBAAAAAKAIQToAAAAAABQhSAcAAAAAgCIE6QAAAAAAUIQgHQAAAAAAihCkAwAAAABATQ3Sn3322dhnn32idevWUa9evRgxYkS57WldRcuVV15ZaNOuXbsFtl9++eXl9vPmm2/GLrvsEiussEK0adMmrrjiigWO5b777ouNN944t+nYsWM8+uijS/GeAwAAAABQW1RrkP7DDz/EFltsEdddd12F27/44otyyy233JKD8gMPPLBcu759+5Zrd/LJJxe2TZs2Lbp06RJt27aNsWPH5hC+T58+ccMNNxTavPjii3HooYdGz54944033oj9998/LxMmTFiK9x4AAAAAgNqgQXXeeLdu3fKyMGuuuWa5yw888EDssccese6665Zbv/LKKy/QttSwYcNi1qxZOYRv2LBhdOjQIcaNGxdXXXVV9OrVK7cZNGhQ7LXXXnH22Wfny/369YtRo0bF4MGDY8iQIZVwTwEAAAAAqK1qTY30yZMnxyOPPJJHjc8vlXJZbbXVYquttsojzufMmVPYNmbMmNh1111ziF6qa9eu8d5778V3331XaNO5c+dy+0xt0noAAAAAAOq2ah2RviRuu+22PPL8gAMOKLf+lFNOia233jpWXXXVXKLl/PPPz+Vd0ojz5Msvv4z27duXu84aa6xR2LbKKqvkv6XryrZJ6xdm5syZeSlbQgYAWHr0vQBQtfS9AFALg/RUmuXwww/Pk4GWdcYZZxT+vfnmm+eR58cdd1z0798/GjVqtNSOJ+3/0ksvXWr7BwD0vQBQnXzvBYBaVtrlueeey6VYjjnmmEW27dSpUy7tMmnSpHw51U5PZWHKKr1cWld9YW0WVnc9SSPfp06dWlg+++yzn3XfAIDFo+8FgKql7wWAWhak33zzzbHNNtvEFltssci2aSLR+vXrR8uWLfPlHXbYIZ599tmYPXt2oU2aSHSjjTbKZV1K24wePbrcflKbtH5h0mj3pk2bllsAgKVH3wsAVUvfCwA1JEifPn16Dr7Tknz88cf5359++mm52uP33XdfhaPR02SgAwcOjPHjx8dHH30Uw4YNi9NPPz2OOOKIQkh+2GGH5XIvaZLSiRMnxj333BODBg0qVxLm1FNPjZEjR8aAAQPi3XffjT59+sRrr70WJ510UpU8DgAAAAAA1FzVWiM9hdV77LFH4XJpuN2jR48YOnRo/vfdd98dJSUlceihh1b463janoLvNAlKmlQ0BellQ/JmzZrF448/Hr17986j2lu0aBEXX3xx9OrVq9Bmxx13jOHDh8eFF14YF1xwQWywwQYxYsSI2GyzzZbyIwAAAAAAQE1XrySl1PxiaeR8Cu1TvfTKKvPS7rxHKmU/VK9Jl3f3FAC10tLo2+rS8QHAsta31fTjA4Cl2bfVihrpAAAAAABQXQTpAAAAAABQhCAdAAAAAACKEKQDAAAAAEARgnQAAAAAAChCkA4AAAAAAEUI0gEAAAAAoAhBOgAAAAAAFCFIBwAAAACAIgTpAAAAAABQhCAdAAAAAACKEKQDAAAAAEARgnQAAAAAAChCkA4AAAAAAEUI0gEAAAAAoAhBOgAAAAAAFCFIBwAAAACAIgTpAAAAAABQhCAdAAAAAACKEKQDAAAAAEARgnQAAAAAAChCkA4AAAAAAEUI0gEAAAAAoAhBOgAAAAAAFCFIBwAAAACAIgTpAAAAAABQhCAdAAAAAACKEKQDAAAAAEARgnQAAAAAAKipQfqzzz4b++yzT7Ru3Trq1asXI0aMKLf9qKOOyuvLLnvttVe5Nt9++20cfvjh0bRp02jevHn07Nkzpk+fXq7Nm2++GbvsskussMIK0aZNm7jiiisWOJb77rsvNt5449ymY8eO8eijjy6lew0AAAAAQG1SrUH6Dz/8EFtssUVcd911C22TgvMvvviisNx1113ltqcQfeLEiTFq1Kh4+OGHczjfq1evwvZp06ZFly5dom3btjF27Ni48soro0+fPnHDDTcU2rz44otx6KGH5hD+jTfeiP333z8vEyZMWEr3HAAAAACA2qJBdd54t27d8lJMo0aNYs0116xw2zvvvBMjR46MV199NX71q1/ldddee23svffe8d///d95pPuwYcNi1qxZccstt0TDhg2jQ4cOMW7cuLjqqqsKgfugQYNyYH/22Wfny/369cvB/ODBg2PIkCGVfr8BAAAAAKg9anyN9KeffjpatmwZG220UZxwwgnxzTffFLaNGTMml3MpDdGTzp07R/369ePll18utNl1111ziF6qa9eu8d5778V3331XaJOuV1Zqk9YvzMyZM/No97ILALD06HsBoGrpewGglgTpaZT47bffHqNHj44///nP8cwzz+QR7HPnzs3bv/zyyxyyl9WgQYNYddVV87bSNmussUa5NqWXF9WmdHtF+vfvH82aNSssqfY6ALD06HsBoGrpewGglgTphxxySOy777558s9UszzVQE9lXNIo9ep2/vnnx9SpUwvLZ599Vt2HBADLNH0vAOh7AaBO1khfUuuuu260aNEiPvjgg9hzzz1z7fSvvvqqXJs5c+bEt99+W6irnv5Onjy5XJvSy4tqs7Da7KW129MCAFQNfS8AVC19LwDUkhHp8/vnP/+Za6S3atUqX95hhx1iypQpMXbs2EKbJ598MubNmxedOnUqtHn22Wdj9uzZhTZpItFUc32VVVYptEnlY8pKbdJ6AAAAAADqtmoN0qdPnx7jxo3LS/Lxxx/nf3/66ad529lnnx0vvfRSTJo0KQfd++23X6y//vp5ItBkk002yXXUjz322HjllVfihRdeiJNO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qAEj0ufNmxfLL7/8AuvTurQNAMBnBwCoPr63A0ANCNL/4z/+I0499dT4/PPPC+v+9a9/xemnnx577rlnZR4fALAM8NkBAPS9AFDngvTBgwfneujt2rWL9dZbLy/t27fP66699trKP0oAoFbz2QEA9L0AUOdqpLdp0yZef/31XCf93XffzetSvfTOnTtX9vEBAMsAnx0AQN8LAHVmRPqTTz6ZJxVNI8/r1asXv/71r+Pkk0/Oy7bbbhsdOnSI5557bukdLQBQq/jsAAD6XgCoc0H6wIED49hjj42mTZsusK1Zs2Zx3HHHxVVXXVWZxwcA1GI+OwCAvhcA6lyQPn78+Nhrr70Wur1Lly4xduzYyjguAGAZ4LMDAOh7AaDOBemTJ0+O5ZdffqHbGzRoEP/+978r47gAgGWAzw4AoO8FgDoXpK+11loxYcKEhW5/8803o1WrVpVxXADAMsBnBwDQ9wJAnQvS995777joootixowZC2z76aef4pJLLonf/OY3lXl8AEAt5rMDAOh7AWBZUK+kpKRkSU7P3nrrrWO55ZaLk046KTbaaKO8/t13343rrrsu5s6dG6+//nqsscYaUddMmzYtT7g6derUCidj/TnanfdIpeyH6jXp8u6eAqBWqoy+bWl+dlgafS8AVCd9LwDU3L63wZLsOH3JffHFF+OEE06I888/P0oz+Hr16kXXrl3zF+K6GKIDABXz2QEAqpa+FwCWjiUK0pO2bdvGo48+Gt9991188MEHOUzfYIMNYpVVVlk6RwgA1Go+OwCAvhcA6lyQXioF59tuu23lHg0AsMzy2QEA9L0AUCcmGwUAAAAAgLpGkA4AAAAAAEUI0gEAAAAAoAhBOgAAAAAAFCFIBwAAAACAIgTpAAAAAABQhCAdAAAAAABqc5Derl27qFev3gJL79698/bdd999gW3HH398uX18+umn0b1792jcuHG0bNkyzj777JgzZ065Nk8//XRsvfXW0ahRo1h//fVj6NChVXo/AQAAAAComRpEDffqq6/G3LlzC5cnTJgQv/71r+Pggw8urDv22GOjb9++hcspMC+VrptC9DXXXDNefPHF+OKLL+LII4+M5ZdfPv7rv/4rt/n4449zmxTADxs2LEaPHh3HHHNMtGrVKrp27Vpl9xUAAAAAgJqnxgfpq6++ernLl19+eay33nqx2267lQvOU1BekccffzzefvvteOKJJ2KNNdaILbfcMvr16xfnnntu9OnTJxo2bBhDhgyJ9u3bx4ABA/J1Ntlkk3j++efj6quvFqQDAAAAANRxNb60S1mzZs2KO++8M/74xz/mEi6l0ijyFi1axGabbRbnn39+/Pjjj4VtY8aMiY4dO+YQvVQaZT5t2rSYOHFioU3nzp3L3VZqk9YvzMyZM/M+yi4AwNKj7wWAqqXvBYBaGqSPGDEipkyZEkcddVRh3WGHHZbD9aeeeiqH6HfccUccccQRhe1ffvlluRA9Kb2cthVrk8Lxn376qcJj6d+/fzRr1qywtGnTplLvKwCg7wWA6uR7LwDU0iD95ptvjm7dukXr1q0L63r16pVHj6dR54cffnjcfvvtcf/998eHH364VI8lhfZTp04tLJ999tlSvT0AqOv0vQCg7wWA6lLja6SX+uSTT3Kd87///e9F23Xq1Cn//eCDD3It9VQ7/ZVXXinXZvLkyflvaV319Ld0Xdk2TZs2jRVXXLHC22nUqFFeAICqoe8FgKql7wWAWjgi/dZbb42WLVtG9+7di7YbN25c/tuqVav8d4cddoi33norvvrqq0KbUaNG5ZB80003LbQZPXp0uf2kNmk9AAAAAAB1W60I0ufNm5eD9B49ekSDBv83iD6Vb+nXr1+MHTs2Jk2aFA8++GAceeSRseuuu8bmm2+e23Tp0iUH5n/4wx9i/Pjx8dhjj8WFF14YvXv3LowoP/744+Ojjz6Kc845J9599924/vrr4957743TTz+92u4zAAAAAAA1Q60I0lNJl08//TT++Mc/llvfsGHDvC2F5RtvvHGceeaZceCBB8ZDDz1UaLPccsvFww8/nP+mEeZpItIUtvft27fQpn379vHII4/kUehbbLFFDBgwIG666aZcex0AAAAAgLqtVtRIT0F5SUnJAuvbtGkTzzzzzCKv37Zt23j00UeLttl9993jjTfe+EXHCQAAAADAsqdWjEgHAAAAAIDqIkgHAAAAAIAiBOkAAAAAAFCEIB0AAAAAAIoQpAMAAAAAQBGCdAAAAAAAKEKQDgAAAAAARQjSAQAAAACgCEE6AAAAAAAUIUgHAAAAAIAiBOkAAAAAAFCEIB0AAAAAAIoQpAMAAAAAQBGCdAAAAIAijjrqqGjYsGGstNJKhWXMmDELtPvpp59i/fXXj+bNm5dbv/vuu0ejRo3KXf/zzz8vbB87dmzsvPPO0bRp01h33XXj9ttv93wA1DCCdAAAAIBFOPHEE2P69OmFZYcddligzcUXXxxt27at8Pp//vOfy12/devWef2UKVNi7733jiOOOCK+++67uOuuu+Lkk0+O559/3nMCUIMI0gEAAAB+oTSqfOTIkXHuuecu0fVefPHFPFr9+OOPj+WWWy46deoUBxxwQNx0002eE4AaRJAOAAAAsAip3Mqqq64aHTp0iAEDBsS8efMK2+bMmRPHHntsXHfddbkETEUuu+yyfP2tttqqXOmWtJ+SkpJybdO6N99803MCUIMI0gEAAACKOOWUU+K9996Lf//733HzzTfHoEGD8lLqyiuvzAH5rrvuWuH1+/fvHx9++GFMnjw5Lr/88ly65f7778/bUomYH374IQYPHhyzZ8+OF154IW+bNm2a5wSgBhGkAwAAABSx9dZbx+qrr55Lr2y//fZx3nnnxT333JO3ffDBBzFkyJAcpi9MCsubNWsWyy+/fHTt2jWOO+64wvVXW221eOihh2L48OGx5ppr5n0fffTReT0ANUeD6j4AAAAAgNqkfv3/G5eYJgVNI8033HDDfDmNKv/++++jRYsW8cgjj+Sa58Wun+y00065Vnqp3//+97Hbbrst1fsAwJIxIh0AAACgiHvvvTeXWkm1zF977bVcnuXAAw/M2373u9/lUenjxo3LS5okdOWVV87/TuVepkyZEo8++mj8+OOPMXfu3Bg9enQewV56/eSNN96ImTNnxk8//RQ33nhjPP3003Haaad5TgBqECPSAQAAAIpI9ct79eqVJxVda6214sQTT4wzzzwzb2vcuHFeSqUSMPXq1Yu11147X546dWpceumlccghh+TL7dq1i6uuuioOPvjgwnWuueaaXBc97X/HHXeMJ598Mlq3bu05AahBBOkAAAAARTz77LOL/fjsvvvueRR62WD95ZdfLnqdW2+9NS8A1FxKuwAAAAAAQBGCdAAAAAAAKEJpFwAAAKBatDvvEY/8MmDS5d2r+xAAljoj0gEAAAAAoAhBOgAAAAAA1NYgvU+fPlGvXr1yy8Ybb1zYPmPGjOjdu3esttpqsdJKK8WBBx4YkydPLrePTz/9NLp37x6NGzeOli1bxtlnnx1z5swp1+bpp5+OrbfeOho1ahTrr79+DB06tMruIwAAAAAANVuNDtKTDh06xBdffFFYnn/++cK2008/PR566KG477774plnnonPP/88DjjggML2uXPn5hB91qxZ8eKLL8Ztt92WQ/KLL7640Objjz/ObfbYY48YN25cnHbaaXHMMcfEY489VuX3FQAAAACAmqfGTzbaoEGDWHPNNRdYP3Xq1Lj55ptj+PDh8R//8R953a233hqbbLJJvPTSS7H99tvH448/Hm+//XY88cQTscYaa8SWW24Z/fr1i3PPPTePdm/YsGEMGTIk2rdvHwMGDMj7SNdPYf3VV18dXbt2rfL7CwAAAABAzVLjR6S///770bp161h33XXj8MMPz6VakrFjx8bs2bOjc+fOhbap7Ms666wTY8aMyZfT344dO+YQvVQKx6dNmxYTJ04stCm7j9I2pfsAAAAAAKBuq9Ej0jt16pRLsWy00Ua5rMull14au+yyS0yYMCG+/PLLPKK8efPm5a6TQvO0LUl/y4bopdtLtxVrk8L2n376KVZcccUKj23mzJl5KZXaAwBLj74XAKqWvhcAasmI9G7dusXBBx8cm2++eR4l/uijj8aUKVPi3nvvre5Di/79+0ezZs0KS5s2bar7kABgmabvBQB9LwBUlxodpM8vjT7fcMMN44MPPsh109MkoilYL2vy5MmFmurpb7o8//bSbcXaNG3adKGj0ZPzzz8/12kvXT777LNKu58AgL4XAKqb770AUEuD9OnTp8eHH34YrVq1im222SaWX375GD16dGH7e++9l2uo77DDDvly+vvWW2/FV199VWgzatSoHJJvuummhTZl91HapnQfC9OoUaO8n7ILALD06HsBoGrpewGglgTpZ511VjzzzDMxadKkePHFF+O3v/1tLLfccnHooYfmcio9e/aMM844I5566qk8+ejRRx+dA/Dtt98+X79Lly45MP/DH/4Q48ePj8ceeywuvPDC6N27d/5AkBx//PHx0UcfxTnnnBPvvvtuXH/99bl0zOmnn17N9x4AAAAAgJqgRk82+s9//jOH5t98802svvrqsfPOO8dLL72U/51cffXVUb9+/TjwwAPzJCipjnoKwkul0P3hhx+OE044IQfsTZo0iR49ekTfvn0Lbdq3bx+PPPJIDs4HDRoUa6+9dtx00015XwAAAAAAUKOD9Lvvvrvo9hVWWCGuu+66vCxM27Zt8ySlxey+++7xxhtv/OzjBAAAAABg2VWjS7sAAAAAAEB1E6QDAAAAAEARgnSgWp188snRpk2baNq0aay11lpx2mmnxaxZs+LTTz+NlVZaqdzSoEGD2HfffQvXveiii6Jjx455fbpeWf/7v/+bJyhec801o3nz5rHTTjvFCy+8UA33EAAAAIDaTpAOVKsTTzwx3n333Zg2bVqMHz8+L1dccUWss846MX369MLy7bff5kD8kEMOKVx3/fXXz23LhuulpkyZEt26dYu33norT1h81FFHxd577x1ff/11Fd9DAAAAAGo7QTpQrTbZZJNo0qRJ/ndJSUnUr18/3n///QXajRgxIubNmxcHHHBAYV2PHj1yWJ5Gs89vu+22i169esXqq68eyy23XBx77LH575tvvrmU7xEAAAAAyxpBOlDtLr/88ly6pWXLlnlEeir3Mr+bb745Dj/88FhhhRV+1m2kkenff/99bLrpppVwxAAAAADUJYJ0oNqdd955uXzL22+/Hccff3yua17WJ598Ek888UQcc8wxP2v/qcxLKglzwQUXLLBvAAAAAFgUQTpQo8q8bLHFFrmeeVm33nprbLXVVnnbkpo6dWp07do1dt555+jTp08lHi0AAAAAdYUgHahRZs+eXa5GeqqLnoL0nzMavTRE79ChQwwZMiTq1atXyUcLAAAAQF0gSAeqTSrnkkLyVHolTTSa6phfdtllOfwuNWrUqPj666/j0EMPrTB0nzFjRsydOzcv6d9pXTJt2rTYa6+9YsMNN4ybbrpJiA4AAADAzyZIB6pNGiE+fPjwWG+99WLllVeO/fbbL7p37x4DBw4sN8noQQcdFM2aNVvg+scee2ysuOKKceedd8bgwYPzv9O65P7774+XXnop/va3v0XTpk3zZKZpGTZsWJXeRwAAAABqP0E6UG2aNGmSR5x/8803eXT6Rx99FFdeeWU0bty40Obee++N2267rcLrDx06NI9kL7ukdUmPHj3y5R9++CHvu3Q5/PDDq+z+sXSdfPLJ0aZNm/xDyVprrRWnnXZazJo1K2+76KKLomPHjtGgQYO8fmEmTJgQDRs2jP3337/c+gceeCA233zzvO/27dvH1Vdf7ekEAACAOkyQDkCtdOKJJ8a7776by/iMHz8+L1dccUXetv766+d/77vvvgu9fqq/n85g2Gmnncqt/+qrr+J3v/tdnHvuubnO/ogRI+LSSy+Nxx57bKnfJwAAAKBmEqQDUCttsskm+ayGJJ19UL9+/cJEtemMhG7duuUR5QtzzTXX5H3stttu5db/85//zPtLZy+k8kNbbLFFbLvttrmGPwAAAFA3NajuAwAqX7vzHvGwLgMmXd69ug+hxrv88svzBLWphM9qq60Wf/7znxfrep988kkMGjQoXnvttbj22mvLbdtyyy1zuJ5KCh1xxBGF0e4DBgxYSvcCAAAAqOmMSAeg1jrvvPNy7fu33347jj/++FhzzTUX63rHHXdc9O3bN4fv80sj24866qg4/fTTo1GjRvGrX/0qzjrrrFwzHQAAAKibBOkA1HqpREsqwZIC8EW58847Y86cOfGHP/yhwu1PPvlkDuX//ve/58lLU7mYYcOGxV/+8pelcOQAAABAbaC0CwDLhNmzZxdqpBfzxBNPxMsvvxwtWrTIl3/88ceYO3duHs3+5Zdfxuuvvx6dOnWK3XffPW9fb7314qCDDopHHnkkTjjhhKV+PwAAAICax4h0AGqdVM7l1ltvjSlTpuSJQdNEoKlWeteuXQuh+owZM3JAnpb077Quufrqq+Odd96JcePG5SWNPt9jjz1i7NixefsOO+wQr776arzwwgt536me+t/+9rfYaqutqvU+AwAAANVHkA5ArVOvXr0YPnx4Hi2+8sorx3777Rfdu3ePgQMH5u3HHntsrLjiirmMy+DBg/O/07pklVVWibXXXruwNG3aNFZYYYVYa6218vaddtoprrrqqjjmmGPyth133DGv+8///M9qvc8AAABA9VHaBYBap0mTJjFq1KiFbh86dGheFkefPn0WWNezZ8+8AAAAACRGpAMAAAAAQBGCdAAAAAAAKEJpFwCyduc94pFYRky6vHt1HwIAAAAsU4xIBwAAAACAIgTpAAAAAABQhCAdAKCWmTlzZhx77LHRvn37WHnllWPjjTeOW265pbD9oosuio4dO0aDBg3itNNOK3fd5557LlZaaaVyS/369eOUU04ptPn8889j7733jiZNmsQ666wTN954Y5XePwAAgJpGjXQAgFpmzpw50apVq3jiiSdi3XXXjZdffjm6desWa6+9dnTp0iXWX3/9uOKKKyoMwHfZZZeYPn164fLkyZPz9Q455JDCukMPPTTWW2+9+Oqrr2LChAnRtWvX2HDDDWO33XarsvsIAABQkxiRDgBQy6SR4n379s1hd7169WL77bePPfbYI55//vm8vUePHjlYb9q06SL3ddttt8UGG2wQO+64Y7784Ycf5v30798/306nTp3i8MMPLzfiHQAAoK6p0UF6+gK37bbb5lOWW7ZsGfvvv3+899575drsvvvu+Qtk2eX4448v1+bTTz+N7t27R+PGjfN+zj777DySq6ynn346tt5662jUqFEexTV06NAquY8AAL/UjBkz4pVXXonNN998ia+bAvKePXsWLr/55pt5tPsaa6xRWLflllvm9QAAAHVVjQ7Sn3nmmejdu3e89NJLMWrUqJg9e3Y+XfmHH34o1y7VCP3iiy8KSzqVudTcuXNziD5r1qx48cUX86irFJJffPHFhTYff/xxbpNGco0bNy7XEj3mmGPiscceq9L7CwCwpEpKSvLnljSq/IADDlii66Z66R999FEceeSRhXWp7Evz5s3LtUuXv//+e08OAABQZ9XoGukjR44sdzkF4GlE+dixY2PXXXctrE8jzddcc80K9/H444/H22+/nWuIppFVaURVv3794txzz40+ffpEw4YNY8iQIXmyrgEDBuTrbLLJJvmU5quvvjrXBAUAqKkh+oknnpjP2EufddKkoUvi5ptvjn333TdWX331wro0+ejUqVPLtUuX0xmCAAAAdVWNHpE+v9Ivdauuumq59cOGDYsWLVrEZpttFueff378+OOPhW1jxoyJjh07ljs9OYXj06ZNi4kTJxbadO7cudw+U5u0fmFmzpyZ91F2AQCWHn3vgiF6OnMvTTSaBg40a9ZsiR7P9Nnlvvvuy6PZy0rlYT7//PM80WipdMZe+jwFQN2i7wWAWhikz5s3L5dc2WmnnXJgXuqwww6LO++8M5566qkcot9xxx1xxBFHFLZ/+eWX5UL0pPRy2lasTfqC+dNPPy20fnv6wlq6tGnTplLvLwCg7y3mpJNOihdeeCGXv1tllVXKbUvl8FLd9FTiLi3p32ldWXfddVesttpquWxeWWkC0/R564ILLsiDE1Lt9TRooWwddQDqBt97AaAWBulpxNWECRPi7rvvLre+V69eefR4GiV1+OGHx+233x73339/fPjhh0v1eFJon0bIly6fffbZUr09AKjr9L3/55NPPonrr78+l3Rp27ZtLseSltIJ19P8MSuuuGIebDB48OD877Ru/rIuRx99dIXlYFLI/q9//SuXfDnwwAPz/DO77bbbUn+OAahZ9L0AUEtqpJcdcfXwww/Hs88+G2uvvXbRtp06dcp/P/jggzyiKtVOTyOpypo8eXL+W1pXPf0tXVe2TdOmTfMXz4o0atQoLwBA1dD3/p8UnqfSLguT5pVJSzHzfz4qa6211op//OMfP+t5AmDZoe8FgFoyIj19QUwhehph/uSTT+YJQRcl1fBMWrVqlf/usMMO8dZbb5Wr85lOgU4h+aabblpoM3r06HL7SW3SegAAAAAA6rb6Nb2cSzolefjw4bHyyivnWuZpKa1bnsq39OvXL8aOHRuTJk2KBx98MI488sjYdddd80RZSar7mQLzP/zhDzF+/Ph47LHH4sILL8z7Lh1Rnk6D/uijj+Kcc86Jd999N58qfe+998bpp59erfcfAAAAAIDqV6NLu/zlL3/Jf3ffffdy62+99dY46qijomHDhvHEE0/EwIED44cffsgTfqY6nikoL7XccsvlsjAnnHBCHmHepEmT6NGjR/Tt27fQJo10f+SRR3JwPmjQoFw+5qabbsq11wGAuqPdeY9U9yFQCSZd3t3jCAAA1J0gvVjtzyQF588888xi1RF99NFHi7ZJYf0bb7yxxMcIAAAAAMCyrUaXdgEAAAAAgOomSAcAAAAAgCIE6QAAAAAAUIQgHQAAAAAAihCkAwAAAABAEYJ0AAAAAAAoQpAOAAAAAABFCNIBAAAAAKAIQToAAAAAABQhSAcAAAAAgCIE6QAAAAAANdyDDz4YW265ZTRp0iRat24dQ4YMyevffvvt2HPPPWOVVVaJNddcM3r16hU//vhj4XrTpk2Lww47LJo2bRprrLFG9OvXrxrvRe0lSAcAAAAAqMFGjhwZJ554YgwcODAH4xMnTozdd989b0sh+UYbbRSTJ0+Ot956K8aPH18uLD/55JPj22+/jU8//TSee+65uPHGG+P222+vxntTOwnSAQAAAABqsIsuuiguvvjiHJ4vt9xyefT5xhtvnLd99NFHccQRR0TDhg1j9dVXj3333TcH6kkamX733XfHZZddFs2bN48NN9wwB+s333xzNd+j2keQDgAAAABQQ/3www8xduzY+Ne//pWD8FS+5eCDD44vvvgibz/rrLPyCPOffvopvvzyy7j//vtjn332ydvee++9mDVrVi4JUyr9+80336y2+1NbCdIBAAAAoAqlwHP99dfPI4RLHXTQQdGqVatcx7p9+/Z5BHGpVI5jpZVWKrfUr18/TjnlFM9bHfDdd99FSUlJjBgxIkaNGhUffPBBNGrUKI9CT7p16xbPP/98rLzyyvk11KZNm/jjH/+Yt02fPj3XVG/QoEFhf+l19/3331fb/amtBOkAAAAAUIVSiY62bduWW3fJJZfEpEmTcv3rZ555JoYPHx533nln3rbLLrvkQLR0+fDDD3N5j0MOOcTzVgekH06S9MNJet2ky5deemk89dRTeZR6586d49hjj81lXFIt9BScl4bsqW1aP2fOnML+pk6dmkN3lowgHQAAgMU2c+bM/GU9jZZMX8JTfdZbbrklb0uTmM0/YjKNgEu1WkulgChNipZGXK6xxhrlJkMDqAtSiY40ceS5555bbn3Hjh3zKOOkXr16ecT5+++/X+E+brvttthggw1ixx13rJJjpnqlEeTrrLNOhds+/vjjfIZDCtlTjfRUO/24446LRx55JG9Pk5Auv/zyeQLSUuPGjcuvN5aMIB0AAOqoYoFo6aRW6UtWCkJPO+20Ba7/+eefx957751HPaUvdzfeeGMV3wOqQxrRlk4bf+KJJ3IoPnTo0DjzzDPj8ccfz6+DsiMm06i49OW/7IjJNMFZWp9C91SqIL1uUl1XgLryHpr63uuuuy6HnvM78cQTo3HjxoX306OOOqrC/aT+umfPnlVwxNQUvXr1imuvvTaPQE/Bed++fWPPPffM9c7TD9fXX399fn2lki2pb91qq63y9dLr6fe//33+XJdGoqcfZ9J+jjnmmOq+S7WOIB0AAOqoYoFokmq3XnHFFeVGE5d16KGH5smuvvrqq7jvvvvi7LPPzqeis2xLP5ykL+/rrbdeHjG5/fbbxx577JFrs84v1XKdN29eHHDAAflyOrX87rvvznV/U8CeJkxLwfrNN99cDfcEoOpdeeWVOeDcddddK9yewtAUoL/66qtx5JFH5tHF80s/Qn700Ud5O3XHeeedl4PzLbbYItdAT33qHXfckUP0hx56KO66665o0aJFtGvXLqZMmZLPWig1ePDgaNasWay99tqx00475R9hvH6W3P9VmQcAAOpkIFqqbCDapUuX6NGjR15/zz33LHDdVJs1tbv33nvzfjp16hSHH354HiG32267Ven9oHrNmDEjXnnllVyuZX4pIE+vixVWWCFffu+992LWrFl59Fyp9O//+q//qtJjBqgOaYLIIUOGxBtvvFG0XSrp8qtf/SrXvz7rrLPipptuWuC9Nf3Ivfrqqy/lI6YmSTXxBwwYkJf5pXC8oh+0S6Vyailo55cxIh0AACgXiG6++eaLfETefPPNPJo91bguG4im9dQdJSUl+dTwVKe3dNR5qU8++SSf7VD21PE0yjL98JLKBZVKI9PTaegAy7oUdE6ePDmfjZNGDu+33375jLD075dffnmB9rNnz16gRnpqn84CU5YDqp4gHQAAKBqIViQFoikALUsgWvdeM6mWbxplnkq4pBGUZd166625fEE6Bb1UOv08nYqeygqVSvVaU41+gGXd7373uzwqPU30mJY00jy9/6V/p1Jpf/vb33L/mkpivfjii3HNNddE165dy+0jjSpebbXV8pljQNVS2gUAAOq4soFoGkE8fyBakRSIpgC0LIFo3XrN9O7dO4+gHD16dK67WlYKgVKQfv7555dbv9FGG8Xyyy8f48ePj2222SavSwFSmtQWYFmXJn1MS6lUmiXNNZHqVqezeAYOHJhrV6f30NatW+c5JFJd7PnLuhx99NGL1VezoHbnPeJhWQZMurx7tdyuIB0AAOqwRQWiC5PKv3z++ed5otGWLVvmdQLRuuOkk06KF154IZ588skKJ8IbNWpUfP3113lC2rJSgPT73/8+LrroojyqMr1+rr322ujXr18VHj1AzbD77rvnSSGTtm3b5klEFyWVYAOqh5+vAACgDisNRFPwOX8gmmqzprrpc+fOzUv6d1qXrLfeenliqwsuuCCX6khf7IcNG5ZH0rFsS6Mmr7/++nwGQwp+0tkJaTn++OPLjZg86KCDKvxhZvDgwXl9GoGZXkPpNXPkkUdW8b0AAFgyRqQDAEAdD0QbNWqUA9FSRxxxRAwZMiSOPfbYuO2228oFoD169IihQ4fmy2lEcaqrnk5NX3XVVeOKK66I3XbbrVruC1UnvVbSmQzF3HvvvQvd1rRp0/zaAQCoTQTpAABQRy0qEE2BeWloXpG11lor/vGPfyylowOAiqlzvWyorjrX8HMp7QIAAAAAAEUYkT6f6667Lq688sr48ssvY4sttsgT32y33XbFHkMAAIAlZkTlssGISgCoGwTpZdxzzz1xxhln5HqQnTp1ioEDB0bXrl3zJDotW7asvmcJAIAaTSC6bBCIAgCwMEq7lHHVVVflCZWOPvro2HTTTXOg3rhx47jlllsW+gACAAAAALBsE6T//2bNmhVjx46Nzp07/9+DU79+vjxmzJjqen4AAAAAAKhmSrv8/77++uuYO3durLHGGuUeoHT53XffXeCBmzlzZl5KTZ06Nf+dNm1apT0582b+WGn7ovpU5mticXntLBuq+rXjdbPsqKzXTul+SkpKoibQ97K49L38XPpeqvt1o++ltvL+SW143SS+9y4bplVT3ytI/5n69+8fl1566QLr27Rp83N3yTKq2cDqPgJqK68daspr5/vvv49mzZpFddP3sri8f/Jzee1QU143+l5qG++feN1QF/reeiU1ZZhZDSjtkuqh//Wvf43999+/sL5Hjx4xZcqUeOCBB4qOips3b158++23sdpqq0W9evWq9Nhrq/SLT/rh4bPPPoumTZtW9+FQi3jt4HVTNdJHhPRhonXr1rncWXXT9/5y3j/x2qEqec9ZcvreZY//D/C6wXvOstP3GpH+/2vYsGFss802MXr06EKQnsLxdPmkk05a4IFr1KhRXspq3rx55T2LdUgK0QXpeO3gPadmqgkj0UvpeyuPvhevHaqS95wlo+9dNvn/AK8bvOfU/r5XkF7GGWeckUeg/+pXv4rtttsuBg4cGD/88EMcffTRS+t5AgAAAACghhOkl/H73/8+/v3vf8fFF18cX375ZWy55ZYxcuTIBSYgBQAAAACg7hCkzyeVcamolAtL5xT9Sy65ZIESOeC1w9LgPQf8f4D3UKqWvhf8f4D3T/S9yxKTjQIAAAAAQBHFpyIFAAAAAIA6TpAOAAAAAABFCNIBAAAAAKAIQTpL5Msvv4yTTz451l133Tx5UJs2bWKfffaJ0aNH5+3t2rWLgQMHVnjdSZMmRb169SpcXnrppXJtf/rpp1h11VWjRYsWMXPmzAX2lW6nouuddtppsfvuu3tWl4LPPvss/vjHP0br1q2jYcOG0bZt2zj11FPjm2++KbRJj31Fz++cOXN+0fbjjz++cBvp8gorrBCffPJJuePbf//946ijjipc/ve//x0nnHBCrLPOOvm1uuaaa0bXrl3jhRdeKLQpfb3OmjUrv9Yuv/zyCu97v379Yo011ojZs2fH0KFDKzzGdEwsfek5Ts/1/J5++un8PEyZMqXc+o033jg//+m9q2y7Yktq43mmJtH31l36Xn1vTaDvpa7R79Zt+l59b3XT79ZsDar7AKg9UhC+0047RfPmzePKK6+Mjh075mDxsccei969e8e77767WPt54oknokOHDuXWrbbaauUu/+1vf8ttSkpKYsSIEfH73/9+gf2k4PLcc8+NZ5555hfeMxblo48+ih122CE23HDDuOuuu6J9+/YxceLEOPvss+Mf//hH/kEj/fCRHHvssdG3b99y12/Q4P/ean7O9saNG5e7nMLOiy++OG677baFHvOBBx6YA/LUJv3wM3ny5PyDT9ngv1T6YeCII46IW2+9Nc4777xy29JrMIWqRx55ZCy//PJ5XdOmTeO9995b4JioWZ5//vn8o9xBBx2UXwfp/WLHHXeML774otAm/Rg0bdq0/NyXSq/l9H7neaYm0PfWXfpefW9tpO+lttPv1m36Xn1vbaPfrXqCdBbbiSeemMPCV155JZo0aVJYnwLvNFJ5caXQPI0OLubmm2/OwWYKMdO/KwrSe/XqFUOGDIlHH3009t57b8/kUpR+KElh8+OPPx4rrrhiXpdGem+11Vax3nrrxX/+53/GX/7yl0LoXez5/aXbk5NOOimuuuqqHORvttlmC2xPo5Kfe+65PLJ4t912y+vSCPrttttuofvs2bNnDBo0KHdEO++8c2F9+qEmfaBK20ul/w8WdYxUv/Tecdhhh+XXQArMU5CeXsdln7v0ek5nvVT0fHqeqQn0vXWXvlffWxvpe6nt9Lt1m75X31vb6HerntIuLJZvv/02Ro4cmTuWsiF6qTRKvbJ8+OGHMWbMmPjd736XlxSIzl/GI0mjolPJj/PPPz/mzZtXabfPgs99OusgfagsDdFLpfDx8MMPj3vuuSf/6FFV0pkRv/nNbxYYPV5qpZVWyks6m6Gi0kAVSWdYbLvttnHLLbeUW59GKqdRzKlECLXH999/H/fdd1/+Qe7Xv/51TJ06Nb+XQG2i76279L363tpI30ttp9+t2/S9+t7aRr9bPQTpLJYPPvggB6WVESamULI06CxdykpBZrdu3WKVVVbJJRZSXeuyZRfKuvDCC+Pjjz+OYcOGeSaXkvfffz8/95tsskmF29P67777LtckT66//vpyz+2ZZ55Zrv2Sbk9LRc9v//798487FYWjqVRMKseSynmkH3lS8H7BBRfEm2++WfS+plHnKXyd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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Train:\n", "label_id\n", "CLEAN 18326\n", "OFFENSIVE 3712\n", "HATE 3148\n", "Name: count, dtype: int64\n", "\n", "Val:\n", "label_id\n", "CLEAN 2170\n", "OFFENSIVE 210\n", "HATE 270\n", "Name: count, dtype: int64\n", "\n", "Test:\n", "label_id\n", "CLEAN 5459\n", "OFFENSIVE 437\n", "HATE 680\n", "Name: count, dtype: int64\n" ] } ], "source": [ "# class balance sau xu ly cho train/val/test\n", "datasets = {\n", " \"Train\": train_final,\n", " \"Val\": val_processed_clean,\n", " \"Test\": test_processed_clean\n", "}\n", "\n", "fig, axes = plt.subplots(1, 3, figsize=(15, 4), sharey=True)\n", "\n", "for ax, (split_name, split_df) in zip(axes, datasets.items()):\n", " counts = split_df[LABEL_COL].value_counts().sort_index()\n", " labels = [LABEL_MAP.get(i, str(i)) for i in counts.index]\n", " \n", " ax.bar(labels, counts.values)\n", " ax.set_title(f\"{split_name} label distribution\")\n", " ax.set_xlabel(\"Label\")\n", " ax.set_ylabel(\"Count\")\n", " \n", " for i, v in enumerate(counts.values):\n", " ax.text(i, v, str(v), ha=\"center\", va=\"bottom\", fontsize=9)\n", "\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "for split_name, split_df in datasets.items():\n", " print(f\"\\n{split_name}:\")\n", " print(split_df[LABEL_COL].value_counts().sort_index().rename(index=LABEL_MAP))" ] }, { "cell_type": "code", "execution_count": 18, "id": "b2a7e643", "metadata": {}, "outputs": [], "source": [ "datasets_clean_info = pd.DataFrame({\n", " \"split\": [\"train\", \"val\", \"test\"],\n", " \"CLEAN\": [0, 0, 0],\n", " \"OFFENSIVE\": [0, 0, 0],\n", " \"HATE\": [0, 0, 0],\n", "})\n" ] }, { "cell_type": "code", "execution_count": 19, "id": "540b40d8", "metadata": {}, "outputs": [], "source": [ "for split_name, split_df in datasets.items():\n", " label_counts = split_df[LABEL_COL].value_counts().sort_index()\n", " datasets_clean_info.loc[datasets_clean_info[\"split\"] == split_name.lower(), \"CLEAN\"] = label_counts.get(0, 0)\n", " datasets_clean_info.loc[datasets_clean_info[\"split\"] == split_name.lower(), \"OFFENSIVE\"] = label_counts.get(1, 0)\n", " datasets_clean_info.loc[datasets_clean_info[\"split\"] == split_name.lower(), \"HATE\"] = label_counts.get(2, 0)" ] }, { "cell_type": "code", "execution_count": 20, "id": "833271f2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
splitCLEANOFFENSIVEHATE
0train1832637123148
1val2170210270
2test5459437680
\n", "
" ], "text/plain": [ " split CLEAN OFFENSIVE HATE\n", "0 train 18326 3712 3148\n", "1 val 2170 210 270\n", "2 test 5459 437 680" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "datasets_clean_info" ] }, { "cell_type": "markdown", "id": "77ee3745", "metadata": {}, "source": [ "# Save dist info to disk\n" ] }, { "cell_type": "code", "execution_count": 21, "id": "c6bf77fd", "metadata": {}, "outputs": [], "source": [ "datasets_clean_info.to_csv(os.path.join(PROCESSED_DIR, \"datasets_clean_info.csv\"), index=False)" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "base", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.5" } }, "nbformat": 4, "nbformat_minor": 5 }