{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "nEjU4TBLcpBD"
},
"outputs": [],
"source": [
"#https://thinkinfi.com/fasttext-for-text-classification-python/"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "Tg_BApa5VMcM",
"outputId": "43af65d2-f06f-4c85-a613-507a71fc0090"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
"Collecting fasttext\n",
" Downloading fasttext-0.9.2.tar.gz (68 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m68.8/68.8 kB\u001b[0m \u001b[31m2.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
"Collecting pybind11>=2.2 (from fasttext)\n",
" Using cached pybind11-2.10.4-py3-none-any.whl (222 kB)\n",
"Requirement already satisfied: setuptools>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from fasttext) (67.7.2)\n",
"Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from fasttext) (1.22.4)\n",
"Building wheels for collected packages: fasttext\n",
" Building wheel for fasttext (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
" Created wheel for fasttext: filename=fasttext-0.9.2-cp310-cp310-linux_x86_64.whl size=4393390 sha256=47014fac7559aea03c11c1451fd14b45733f98b6c922cb97db2227bd36675491\n",
" Stored in directory: /root/.cache/pip/wheels/a5/13/75/f811c84a8ab36eedbaef977a6a58a98990e8e0f1967f98f394\n",
"Successfully built fasttext\n",
"Installing collected packages: pybind11, fasttext\n",
"Successfully installed fasttext-0.9.2 pybind11-2.10.4\n",
"Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
"Requirement already satisfied: nltk in /usr/local/lib/python3.10/dist-packages (3.8.1)\n",
"Requirement already satisfied: click in /usr/local/lib/python3.10/dist-packages (from nltk) (8.1.3)\n",
"Requirement already satisfied: joblib in /usr/local/lib/python3.10/dist-packages (from nltk) (1.2.0)\n",
"Requirement already satisfied: regex>=2021.8.3 in /usr/local/lib/python3.10/dist-packages (from nltk) (2022.10.31)\n",
"Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from nltk) (4.65.0)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[nltk_data] Downloading collection 'all'\n",
"[nltk_data] | \n",
"[nltk_data] | Downloading package abc to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/abc.zip.\n",
"[nltk_data] | Downloading package alpino to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/alpino.zip.\n",
"[nltk_data] | Downloading package averaged_perceptron_tagger to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping taggers/averaged_perceptron_tagger.zip.\n",
"[nltk_data] | Downloading package averaged_perceptron_tagger_ru to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping\n",
"[nltk_data] | taggers/averaged_perceptron_tagger_ru.zip.\n",
"[nltk_data] | Downloading package basque_grammars to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping grammars/basque_grammars.zip.\n",
"[nltk_data] | Downloading package bcp47 to /root/nltk_data...\n",
"[nltk_data] | Downloading package biocreative_ppi to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/biocreative_ppi.zip.\n",
"[nltk_data] | Downloading package bllip_wsj_no_aux to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping models/bllip_wsj_no_aux.zip.\n",
"[nltk_data] | Downloading package book_grammars to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping grammars/book_grammars.zip.\n",
"[nltk_data] | Downloading package brown to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/brown.zip.\n",
"[nltk_data] | Downloading package brown_tei to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/brown_tei.zip.\n",
"[nltk_data] | Downloading package cess_cat to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/cess_cat.zip.\n",
"[nltk_data] | Downloading package cess_esp to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/cess_esp.zip.\n",
"[nltk_data] | Downloading package chat80 to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/chat80.zip.\n",
"[nltk_data] | Downloading package city_database to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/city_database.zip.\n",
"[nltk_data] | Downloading package cmudict to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/cmudict.zip.\n",
"[nltk_data] | Downloading package comparative_sentences to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/comparative_sentences.zip.\n",
"[nltk_data] | Downloading package comtrans to /root/nltk_data...\n",
"[nltk_data] | Downloading package conll2000 to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/conll2000.zip.\n",
"[nltk_data] | Downloading package conll2002 to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/conll2002.zip.\n",
"[nltk_data] | Downloading package conll2007 to /root/nltk_data...\n",
"[nltk_data] | Downloading package crubadan to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/crubadan.zip.\n",
"[nltk_data] | Downloading package dependency_treebank to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/dependency_treebank.zip.\n",
"[nltk_data] | Downloading package dolch to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/dolch.zip.\n",
"[nltk_data] | Downloading package europarl_raw to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/europarl_raw.zip.\n",
"[nltk_data] | Downloading package extended_omw to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Downloading package floresta to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/floresta.zip.\n",
"[nltk_data] | Downloading package framenet_v15 to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/framenet_v15.zip.\n",
"[nltk_data] | Downloading package framenet_v17 to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/framenet_v17.zip.\n",
"[nltk_data] | Downloading package gazetteers to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/gazetteers.zip.\n",
"[nltk_data] | Downloading package genesis to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/genesis.zip.\n",
"[nltk_data] | Downloading package gutenberg to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/gutenberg.zip.\n",
"[nltk_data] | Downloading package ieer to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/ieer.zip.\n",
"[nltk_data] | Downloading package inaugural to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/inaugural.zip.\n",
"[nltk_data] | Downloading package indian to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/indian.zip.\n",
"[nltk_data] | Downloading package jeita to /root/nltk_data...\n",
"[nltk_data] | Downloading package kimmo to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/kimmo.zip.\n",
"[nltk_data] | Downloading package knbc to /root/nltk_data...\n",
"[nltk_data] | Downloading package large_grammars to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping grammars/large_grammars.zip.\n",
"[nltk_data] | Downloading package lin_thesaurus to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/lin_thesaurus.zip.\n",
"[nltk_data] | Downloading package mac_morpho to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/mac_morpho.zip.\n",
"[nltk_data] | Downloading package machado to /root/nltk_data...\n",
"[nltk_data] | Downloading package masc_tagged to /root/nltk_data...\n",
"[nltk_data] | Downloading package maxent_ne_chunker to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping chunkers/maxent_ne_chunker.zip.\n",
"[nltk_data] | Downloading package maxent_treebank_pos_tagger to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping taggers/maxent_treebank_pos_tagger.zip.\n",
"[nltk_data] | Downloading package moses_sample to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping models/moses_sample.zip.\n",
"[nltk_data] | Downloading package movie_reviews to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/movie_reviews.zip.\n",
"[nltk_data] | Downloading package mte_teip5 to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/mte_teip5.zip.\n",
"[nltk_data] | Downloading package mwa_ppdb to /root/nltk_data...\n",
"[nltk_data] | Unzipping misc/mwa_ppdb.zip.\n",
"[nltk_data] | Downloading package names to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/names.zip.\n",
"[nltk_data] | Downloading package nombank.1.0 to /root/nltk_data...\n",
"[nltk_data] | Downloading package nonbreaking_prefixes to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/nonbreaking_prefixes.zip.\n",
"[nltk_data] | Downloading package nps_chat to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/nps_chat.zip.\n",
"[nltk_data] | Downloading package omw to /root/nltk_data...\n",
"[nltk_data] | Downloading package omw-1.4 to /root/nltk_data...\n",
"[nltk_data] | Downloading package opinion_lexicon to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/opinion_lexicon.zip.\n",
"[nltk_data] | Downloading package panlex_swadesh to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Downloading package paradigms to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/paradigms.zip.\n",
"[nltk_data] | Downloading package pe08 to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/pe08.zip.\n",
"[nltk_data] | Downloading package perluniprops to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping misc/perluniprops.zip.\n",
"[nltk_data] | Downloading package pil to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/pil.zip.\n",
"[nltk_data] | Downloading package pl196x to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/pl196x.zip.\n",
"[nltk_data] | Downloading package porter_test to /root/nltk_data...\n",
"[nltk_data] | Unzipping stemmers/porter_test.zip.\n",
"[nltk_data] | Downloading package ppattach to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/ppattach.zip.\n",
"[nltk_data] | Downloading package problem_reports to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/problem_reports.zip.\n",
"[nltk_data] | Downloading package product_reviews_1 to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/product_reviews_1.zip.\n",
"[nltk_data] | Downloading package product_reviews_2 to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/product_reviews_2.zip.\n",
"[nltk_data] | Downloading package propbank to /root/nltk_data...\n",
"[nltk_data] | Downloading package pros_cons to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/pros_cons.zip.\n",
"[nltk_data] | Downloading package ptb to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/ptb.zip.\n",
"[nltk_data] | Downloading package punkt to /root/nltk_data...\n",
"[nltk_data] | Unzipping tokenizers/punkt.zip.\n",
"[nltk_data] | Downloading package qc to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/qc.zip.\n",
"[nltk_data] | Downloading package reuters to /root/nltk_data...\n",
"[nltk_data] | Downloading package rslp to /root/nltk_data...\n",
"[nltk_data] | Unzipping stemmers/rslp.zip.\n",
"[nltk_data] | Downloading package rte to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/rte.zip.\n",
"[nltk_data] | Downloading package sample_grammars to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping grammars/sample_grammars.zip.\n",
"[nltk_data] | Downloading package semcor to /root/nltk_data...\n",
"[nltk_data] | Downloading package senseval to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/senseval.zip.\n",
"[nltk_data] | Downloading package sentence_polarity to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/sentence_polarity.zip.\n",
"[nltk_data] | Downloading package sentiwordnet to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/sentiwordnet.zip.\n",
"[nltk_data] | Downloading package shakespeare to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/shakespeare.zip.\n",
"[nltk_data] | Downloading package sinica_treebank to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/sinica_treebank.zip.\n",
"[nltk_data] | Downloading package smultron to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/smultron.zip.\n",
"[nltk_data] | Downloading package snowball_data to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Downloading package spanish_grammars to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping grammars/spanish_grammars.zip.\n",
"[nltk_data] | Downloading package state_union to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/state_union.zip.\n",
"[nltk_data] | Downloading package stopwords to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/stopwords.zip.\n",
"[nltk_data] | Downloading package subjectivity to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/subjectivity.zip.\n",
"[nltk_data] | Downloading package swadesh to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/swadesh.zip.\n",
"[nltk_data] | Downloading package switchboard to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/switchboard.zip.\n",
"[nltk_data] | Downloading package tagsets to /root/nltk_data...\n",
"[nltk_data] | Unzipping help/tagsets.zip.\n",
"[nltk_data] | Downloading package timit to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/timit.zip.\n",
"[nltk_data] | Downloading package toolbox to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/toolbox.zip.\n",
"[nltk_data] | Downloading package treebank to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/treebank.zip.\n",
"[nltk_data] | Downloading package twitter_samples to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/twitter_samples.zip.\n",
"[nltk_data] | Downloading package udhr to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/udhr.zip.\n",
"[nltk_data] | Downloading package udhr2 to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/udhr2.zip.\n",
"[nltk_data] | Downloading package unicode_samples to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/unicode_samples.zip.\n",
"[nltk_data] | Downloading package universal_tagset to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping taggers/universal_tagset.zip.\n",
"[nltk_data] | Downloading package universal_treebanks_v20 to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Downloading package vader_lexicon to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Downloading package verbnet to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/verbnet.zip.\n",
"[nltk_data] | Downloading package verbnet3 to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/verbnet3.zip.\n",
"[nltk_data] | Downloading package webtext to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/webtext.zip.\n",
"[nltk_data] | Downloading package wmt15_eval to /root/nltk_data...\n",
"[nltk_data] | Unzipping models/wmt15_eval.zip.\n",
"[nltk_data] | Downloading package word2vec_sample to\n",
"[nltk_data] | /root/nltk_data...\n",
"[nltk_data] | Unzipping models/word2vec_sample.zip.\n",
"[nltk_data] | Downloading package wordnet to /root/nltk_data...\n",
"[nltk_data] | Downloading package wordnet2021 to /root/nltk_data...\n",
"[nltk_data] | Downloading package wordnet2022 to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/wordnet2022.zip.\n",
"[nltk_data] | Downloading package wordnet31 to /root/nltk_data...\n",
"[nltk_data] | Downloading package wordnet_ic to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/wordnet_ic.zip.\n",
"[nltk_data] | Downloading package words to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/words.zip.\n",
"[nltk_data] | Downloading package ycoe to /root/nltk_data...\n",
"[nltk_data] | Unzipping corpora/ycoe.zip.\n",
"[nltk_data] | \n",
"[nltk_data] Done downloading collection all\n",
"[nltk_data] Downloading package stopwords to /root/nltk_data...\n",
"[nltk_data] Package stopwords is already up-to-date!\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Saving X_train.csv to X_train.csv\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Saving X_test.csv to X_test.csv\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Saving y_train.csv to y_train.csv\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Saving y_test.csv to y_test.csv\n"
]
}
],
"source": [
"! pip install fasttext\n",
"import fasttext\n",
"import pandas as pd\n",
"\n",
"\n",
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay, accuracy_score, classification_report\n",
"from sklearn.model_selection import KFold\n",
"import warnings\n",
"import matplotlib.pyplot as plt\n",
"import string\n",
"\n",
"\n",
"from nltk.stem import PorterStemmer\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"!pip install nltk\n",
"import nltk\n",
"nltk.download('all')\n",
"nltk.download('stopwords')\n",
"import re\n",
"from nltk.tokenize import word_tokenize\n",
"from nltk.corpus import stopwords\n",
"from nltk import ne_chunk, pos_tag, word_tokenize\n",
"from nltk.tree import Tree\n",
"\n",
"\n",
"from google.colab import files\n",
"uploaded1 = files.upload()\n",
"uploaded2 = files.upload()\n",
"uploaded3 = files.upload()\n",
"uploaded4 = files.upload()\n",
"import io\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "70qt7g-Ju6kS",
"outputId": "0502179a-59cf-4c85-ebae-a0a777fbc7ae"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Int64Index: 4447 entries, 0 to 4446\n",
"Data columns (total 5 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Unnamed: 0 4447 non-null int64 \n",
" 1 first_party 4447 non-null object\n",
" 2 second_party 4447 non-null object\n",
" 3 Facts 4447 non-null object\n",
" 4 winner_index 4447 non-null int64 \n",
"dtypes: int64(2), object(3)\n",
"memory usage: 208.5+ KB\n",
"\n",
"Int64Index: 791 entries, 0 to 790\n",
"Data columns (total 5 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Unnamed: 0 791 non-null int64 \n",
" 1 first_party 791 non-null object\n",
" 2 second_party 791 non-null object\n",
" 3 Facts 791 non-null object\n",
" 4 winner_index 791 non-null int64 \n",
"dtypes: int64(2), object(3)\n",
"memory usage: 37.1+ KB\n"
]
},
{
"data": {
"text/plain": [
"(None, None)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xtrain = pd.read_csv(io.BytesIO(uploaded1['X_train.csv']))\n",
"xtest = pd.read_csv(io.BytesIO(uploaded2['X_test.csv']))\n",
"ytrain = pd.read_csv(io.BytesIO(uploaded3['y_train.csv']))\n",
"ytest = pd.read_csv(io.BytesIO(uploaded4['y_test.csv']))\n",
"\n",
"train_data = xtrain.merge(ytrain,on=[\"Unnamed: 0\"])\n",
"test_data = xtest.merge(ytest,on=[\"Unnamed: 0\"])\n",
"#train.head()\n",
"train_data.info(),test_data.info()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"id": "4sFgqn7uu6kT"
},
"outputs": [],
"source": [
"def K_fold (train_data1):\n",
" n=4\n",
" data = []\n",
" \n",
" kf = KFold(n_splits=n, random_state=42, shuffle=True)\n",
" \n",
" for train_index, val_index in kf.split(train_data1):\n",
" train_df = train_data1.iloc[train_index]\n",
" val_df = train_data1.iloc[val_index]\n",
" data.append([train_df,val_df])\n",
" \n",
" return data"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "B1fdzmgMu6kU"
},
"outputs": [],
"source": [
"data = K_fold (train_data)\n",
"\n",
"#print(train_data.info())"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "0K6oPUVbu6kU"
},
"outputs": [],
"source": [
"def prepare_data(train,val):\n",
" # Write the train data to file\n",
" with open(\"train_data.txt\", \"w\", encoding=\"utf-8\") as f:\n",
" for i in range(len(train)):\n",
" f.write(\"__label__\" + str(train.iloc[i][\"winner_index\"]) + \" \" + train.iloc[i][\"Facts\"] + \"\\n\")\n",
" \n",
" # Write the validation data to file\n",
" with open(\"val_data.txt\", \"w\", encoding=\"utf-8\") as f:\n",
" for i in range(len(val)):\n",
" f.write(\"__label__\" + str(val.iloc[i][\"winner_index\"]) + \" \" + val.iloc[i][\"Facts\"] + \"\\n\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"id": "4jhCkNBDu6kV"
},
"outputs": [],
"source": [
"def train_model():\n",
" model = fasttext.train_supervised(input=\"train_data.txt\", epoch=20, lr=1.0, wordNgrams=5, dim=300, loss=\"ns\")\n",
"\n",
" result = model.test(\"train_data.txt\")\n",
" print(\"train-Accuracy:\",result[1])\n",
" \n",
" result = model.test(\"val_data.txt\")\n",
" print(\"val-Accuracy:\",result[1])\n",
" \n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"id": "bzhqbtJ8u6kV"
},
"outputs": [],
"source": [
"def predict(model):\n",
" # predict the test data\n",
" ypred = test_data[\"Facts\"].apply(lambda x: model.predict(x)[0][0])\n",
" ypred = [eval(x.replace('__label__', '')) for x in ypred]\n",
" \n",
" # Compute the accuracy\n",
" accuracy = int(round(accuracy_score(test_data[\"winner_index\"], ypred)*100))\n",
" \n",
" # Create the confusion matrix\n",
" disp = ConfusionMatrixDisplay(confusion_matrix(test_data[\"winner_index\"], ypred))\n",
" disp.plot()\n",
" plt.show()\n",
" \n",
" report = classification_report(test_data[\"winner_index\"],ypred)\n",
" print(report)\n",
"\n",
" return accuracy"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "2BhD29T8u6kW",
"outputId": "bc455adb-1145-4984-d893-2cc840793ed7"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"train-Accuracy: 0.7070464767616191\n",
"val-Accuracy: 0.33093525179856115\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"