{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "v7EvaRVtQakR" }, "source": [ "## Description:\n", "- This dataset, sourced from PyTorch's official tutorial, comprises popular names across 18 distinct languages, namely Arabic, Chinese, Czech, Dutch, English, French, German, Greek, Irish, Italian, Japanese, Korean, Polish, Portuguese, Russian, Scottish, Spanish, and Vietnamese. Each language's names are contained in separate text files for easy extraction and categorization.\n", "\n", "## App link\n", "- https://huggingface.co/spaces/kanneboinakumar/Name_Classification\n", "\n", "## Data link\n", "- https://www.kaggle.com/datasets/shubhampatel231/name-classification" ] }, { "cell_type": "markdown", "metadata": { "id": "sfW4vLsbyJDJ" }, "source": [ "# 1.Packages" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "LKVYNknXyJDM" }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "import os\n", "import glob\n", "import unicodedata\n", "from sklearn.preprocessing import LabelEncoder\n", "from sklearn.model_selection import train_test_split\n", "from joblib import load, dump\n", "import torch\n", "import torch.nn as nn\n", "from torch.nn.utils.rnn import pad_sequence\n", "from torch.utils.data import TensorDataset, DataLoader" ] }, { "cell_type": "markdown", "metadata": { "id": "DBgB-_BHyJDO" }, "source": [ "# 2.Load text files and Create a Dataframe" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "GTlEm1u2yUG5", "outputId": "ecb38c05-f7de-43e8-e7fe-089c2e27226e" }, "outputs": [], "source": [ "# from google.colab import drive\n", "# drive.mount('/content/drive')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "XJjsYuw8yJDP", "outputId": "fc4e4937-435d-473e-dfbf-9658247e5e8d" }, "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", "
NameCountry
0KhouryArabic
1NahasArabic
2DaherArabic
3GergesArabic
4NazariArabic
\n", "
" ], "text/plain": [ " Name Country\n", "0 Khoury Arabic\n", "1 Nahas Arabic\n", "2 Daher Arabic\n", "3 Gerges Arabic\n", "4 Nazari Arabic" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "txt_files = glob.glob(os.path.join(\"./data/*.txt\"))\n", "all_txt_dict = {}\n", "for txt in txt_files:\n", " with open(txt, \"r\", encoding=\"utf-8\") as file:\n", " content = file.read().split(\"\\n\")\n", " all_txt_dict[os.path.basename(txt).rstrip(\".txt\")] = content\n", "name_country = [(name,contry) for contry in all_txt_dict for name in all_txt_dict[contry]]\n", "name_df = pd.DataFrame(name_country,columns=[\"Name\",\"Country\"])\n", "name_df.head()" ] }, { "cell_type": "markdown", "metadata": { "id": "mxcNJaU8yJDQ" }, "source": [ "# 3.EDA" ] }, { "cell_type": "markdown", "metadata": { "id": "AUei-B37FGhY" }, "source": [ "## 3.1.drop duplicated values" ] }, { "cell_type": "code", "execution_count": 329, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Uj_blWz0FEby", "outputId": "87794ac8-e028-4337-a5fd-ef0331f9e3d3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "shape before removing duplicates :(20092, 2)\n", "shape after removing duplicates :(18033, 2)\n" ] } ], "source": [ "print(f\"shape before removing duplicates :{name_df.shape}\")\n", "name_df = name_df.drop_duplicates()\n", "print(f\"shape after removing duplicates :{name_df.shape}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "xdo5Tcx3HOfJ" }, "source": [ "## 3.2.Reset the index of the DataFrame" ] }, { "cell_type": "code", "execution_count": 330, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Q11oMxtaG7rC", "outputId": "9e1b6dd4-a46f-4726-dfeb-5049f600ff8a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Name Country\n", "0 Abel French\n", "1 Abraham French\n", "2 Adam French\n", "3 Albert French\n", "4 Allard French\n" ] } ], "source": [ "name_df = name_df.reset_index(drop=True)\n", "print(name_df.head())\n" ] }, { "cell_type": "code", "execution_count": 331, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 540 }, "id": "_hWATI-kyJDQ", "outputId": "ec803568-8ac7-445e-c178-8e9d7233a180" }, "outputs": [ { "data": { "image/png": "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f//9BycnJyxYsAC//fYb4uLiYGRkBAAYNmwYtm3bhqtXr360ncnJybC2tkZSUhKsrKxkfx5ch4XIWl7sJD9ZyyMiIvoSfc7nd66eIapWrRrCwsJw/fp1AEBkZCSOHDmCRo0aAQBiYmIQFxcHHx8f6Xesra3x7bffIiIiAgAQEREBGxsbKQwBgI+PD/T09HDixAnpmJo1a0phCAB8fX1x7do1PHnyJEu7Xr58ieTkZLUbERERfb0McrPyYcOGITk5GSVLloS+vj7S0tIwfvx4dOjQAQAQFxcHALC3t1f7PXt7e2lfXFwcChYsqLbfwMAAdnZ2ase4ubllKSNjn62trdq+iRMnYuzYsTI9SiIiIsrrcvUM0caNG7F27Vr8+eefOHv2LFauXIlp06Zh5cqVudksDB8+HElJSdLtzp07udoeIiIi0q5cPUM0ePBgDBs2DO3atQMAlClTBrdu3cLEiRPRpUsXODg4AADi4+Ph6Ogo/V58fDzKly8PAHBwcMCDBw/Uyn3z5g0SEhKk33dwcEB8fLzaMRn3M47JzNjYGMbGxvI8SCIiIsrzcvUM0bNnz6Cnp94EfX19pKenAwDc3Nzg4OCAsLAwaX9ycjJOnDgBb29vAIC3tzcSExNx5swZ6ZgDBw4gPT0d3377rXTMoUOH8Pr1a+mYffv2oUSJElkulxEREZHy5GogatKkCcaPH4+QkBDExsbir7/+wowZM9CiRQsAgEqlQr9+/TBu3Djs2LEDFy5cQOfOneHk5ITmzZsDADw8PNCwYUP07NkTJ0+exNGjR9G7d2+0a9cOTk5OAID27dvDyMgI/v7+uHTpEjZs2IDZs2djwIABufXQiYiIKA/J1Utmc+fOxciRI/Hrr7/iwYMHcHJywk8//YRRo0ZJxwwZMgSpqano1asXEhMTUaNGDYSGhsLExEQ6Zu3atejduzfq1asHPT09tGrVCnPmzJH2W1tbY+/evQgICEClSpWQP39+jBo1Sm2uIiIiIlKuXJ2H6EvBeYiIiIi+PF/MPEREREREeQEDERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKV6uB6K7d++iY8eOyJcvH0xNTVGmTBmcPn1a2i+EwKhRo+Do6AhTU1P4+PggKipKrYyEhAR06NABVlZWsLGxgb+/P1JSUtSOOX/+PL777juYmJjA2dkZU6ZM0cnjIyIiorwvVwPRkydPUL16dRgaGuLvv//G5cuXMX36dNja2krHTJkyBXPmzMHChQtx4sQJmJubw9fXFy9evJCO6dChAy5duoR9+/Zh165dOHToEHr16iXtT05ORoMGDeDi4oIzZ85g6tSpGDNmDBYvXqzTx0tERER5k0oIIXKr8mHDhuHo0aM4fPhwtvuFEHBycsLAgQMxaNAgAEBSUhLs7e0RHByMdu3a4cqVK/D09MSpU6fg5eUFAAgNDUXjxo3x33//wcnJCQsWLMBvv/2GuLg4GBkZSXVv27YNV69e/Wg7k5OTYW1tjaSkJFhZWcn06P+P67AQWcuLneQna3lERERfos/5/M7VM0Q7duyAl5cX2rRpg4IFC6JChQpYsmSJtD8mJgZxcXHw8fGRtllbW+Pbb79FREQEACAiIgI2NjZSGAIAHx8f6Onp4cSJE9IxNWvWlMIQAPj6+uLatWt48uSJth8mERER5XG5Gohu3ryJBQsWoFixYtizZw9++eUXBAYGYuXKlQCAuLg4AIC9vb3a79nb20v74uLiULBgQbX9BgYGsLOzUzsmuzIy15HZy5cvkZycrHYjIiKir5dBblaenp4OLy8vTJgwAQBQoUIFXLx4EQsXLkSXLl1yrV0TJ07E2LFjc61+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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "country_counts = name_df[\"Country\"].value_counts()\n", "plt.bar(country_counts.index, country_counts.values)\n", "plt.xlabel('Country')\n", "plt.ylabel('Count')\n", "plt.title('Number of Names per Country')\n", "plt.xticks(rotation=90)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 332, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ckqUYK6DyJDR", "outputId": "6ffe1a5b-cfa9-4bd4-eca8-0c88abd515cd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shape : (18015, 3)\n", "Number of Countrys : 18\n", "maximun len of name : 20\n", "maximun len of name : 2\n", "percentile_95 of name len : 11.0\n" ] } ], "source": [ "name_df[\"Name_len\"] = [len(name) for name in name_df.Name]\n", "name_df = name_df[name_df[\"Name_len\"] != 0]\n", "num_of_countrys = name_df.Country.nunique()\n", "print(f\"Shape : {name_df.shape}\")\n", "print(f\"Number of Countrys : {num_of_countrys}\")\n", "print(f\"maximun len of name : {name_df.Name_len.max()}\")\n", "print(f\"maximun len of name : {name_df.Name_len.min()}\")\n", "print(f\"percentile_95 of name len : {name_df.Name_len.quantile(0.95)}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "HpVWgj8MyJDR" }, "source": [ "## 3.3.Remove spectial keys in name" ] }, { "cell_type": "code", "execution_count": 333, "metadata": { "id": "6uYYJ5QxyJDR" }, "outputs": [], "source": [ "def unicode_to_ascii(s):\n", " s=s.casefold()\n", " return ''.join(\n", " c for c in unicodedata.normalize('NFD', s)\n", " if unicodedata.category(c) != 'Mn'\n", " )\n", "name_df[\"Name\"] = [unicode_to_ascii(name) for name in name_df.Name]" ] }, { "cell_type": "code", "execution_count": 334, "metadata": { "id": "Me7pZPaZyJDS" }, "outputs": [], "source": [ "name_df[\"name_ascii\"] = [[ord(letter) for letter in name] for name in name_df.Name]" ] }, { "cell_type": "markdown", "metadata": { "id": "8wC9SGoIyJDS" }, "source": [ "## 3.4.Encoding Country" ] }, { "cell_type": "code", "execution_count": 335, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "K90bMZVWyJDT", "outputId": "a9ab32e9-04eb-4702-862d-9ac038f85ab9" }, "outputs": [ { "data": { "text/plain": [ "['Country_Encoder']" ] }, "execution_count": 335, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Encoder = LabelEncoder()\n", "name_df[\"Country\"] = Encoder.fit_transform(name_df.Country)\n", "dump(Encoder,\"Country_Encoder\") # save encoder" ] }, { "cell_type": "code", "execution_count": 336, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "jy-cmO-ryJDT", "outputId": "145de0a2-3efd-457c-d3b9-ce4b9cfc27b0" }, "outputs": [ { "data": { "text/plain": [ "array(['Arabic', 'Chinese', 'Czech', 'Dutch', 'English', 'French',\n", " 'German', 'Greek', 'Irish', 'Italian', 'Japanese', 'Korean',\n", " 'Polish', 'Portuguese', 'Russian', 'Scottish', 'Spanish',\n", " 'Vietnamese'], dtype=object)" ] }, "execution_count": 336, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Encoder.classes_" ] }, { "cell_type": "markdown", "metadata": { "id": "Cc-04c2SyJDU" }, "source": [ "## 3.5.Pad sequences to the length of the longest sequence" ] }, { "cell_type": "code", "execution_count": 337, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7EMaOsNUyJDU", "outputId": "a64a6816-ebd8-435e-e782-1278fe8732e2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([18015, 20, 1])\n", "torch.Size([18015])\n" ] } ], "source": [ "sequences = [torch.tensor(ascii_list) for ascii_list in name_df.name_ascii]\n", "padded_sequences = pad_sequence(sequences, batch_first=True, padding_value=0)\n", "X = padded_sequences\n", "X = X.view(X.shape[0], X.shape[1],1).float()\n", "y = torch.tensor([torch.tensor(label) for label in name_df.Country],dtype=int)\n", "print(X.shape)\n", "print(y.shape)" ] }, { "cell_type": "markdown", "metadata": { "id": "rXsa6fR1yJDU" }, "source": [ "## 3.6.Train Test split" ] }, { "cell_type": "code", "execution_count": 338, "metadata": { "id": "i9piJa512_dO" }, "outputs": [], "source": [ "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", "X = X.to(device)\n", "y = y.to(device)" ] }, { "cell_type": "code", "execution_count": 339, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gtVCWxyAyJDV", "outputId": "265a5715-4648-47a2-aa7a-818cf28f4c0e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([14412, 20, 1])\n", "torch.Size([14412])\n", "torch.Size([3603, 20, 1])\n", "torch.Size([3603])\n" ] } ], "source": [ "X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42,test_size=0.2)\n", "print(X_train.shape)\n", "print(y_train.shape)\n", "print(X_test.shape)\n", "print(y_test.shape)" ] }, { "cell_type": "markdown", "metadata": { "id": "Dx_uNHzhyJDV" }, "source": [ "# 4.RNN model" ] }, { "cell_type": "markdown", "metadata": { "id": "zjwh_34uyJDW" }, "source": [ "### 4.1.Defining the RNN Model" ] }, { "cell_type": "code", "execution_count": 340, "metadata": { "id": "zW-YmE7ZyJDW" }, "outputs": [], "source": [ "class SimpleRNN(nn.Module):\n", " def __init__(self, input_size, hidden_size, output_size, num_layers):\n", " super(SimpleRNN, self).__init__()\n", " self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)\n", " self.dropout = nn.Dropout(0.3)\n", " self.fc = nn.Linear(hidden_size, output_size)\n", "\n", " def forward(self, x):\n", " out, _ = self.rnn(x)\n", " out = self.dropout(out[:, -1, :])\n", " out = self.fc(out)\n", " return out" ] }, { "cell_type": "markdown", "metadata": { "id": "g9__xCD8yJDW" }, "source": [ "### 4.2.Initializing the Model, Loss Function, and Optimizer" ] }, { "cell_type": "code", "execution_count": 341, "metadata": { "id": "gmPe8OMQyJDX" }, "outputs": [], "source": [ "input_size = X.shape[2]\n", "hidden_size = 256 # Hidden layer size\n", "output_size = num_of_countrys # Number of classes\n", "num_layers = 1 # Single RNN layer\n", "\n", "model = SimpleRNN(input_size, hidden_size, output_size, num_layers).to(device)\n", "criterion = nn.CrossEntropyLoss() # CrossEntropyLoss for classification\n", "optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)" ] }, { "cell_type": "code", "execution_count": 347, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gpHNKl6HPgPX", "outputId": "6661eafb-0408-4918-8112-71aa169001d3" }, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 20, 1])" ] }, "execution_count": 347, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "1SZ37L7tyJDX" }, "source": [ "### 4.3.Training the Model" ] }, { "cell_type": "code", "execution_count": 342, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "UYN0D2j-yJDX", "outputId": "414bd6fc-a256-4ef9-e7bb-0cd076149cf3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch [10/50], Loss: 2.8346\n", "Epoch [20/50], Loss: 2.7222\n", "Epoch [30/50], Loss: 2.5080\n", "Epoch [40/50], Loss: 2.0311\n", "Epoch [50/50], Loss: 1.9161\n", "Training Complete!\n" ] } ], "source": [ "num_epochs = 50\n", "all_loss = []\n", "for epoch in range(num_epochs):\n", " outputs = model(X)\n", " loss = criterion(outputs,y)\n", " loss.backward()\n", " optimizer.step()\n", " all_loss.append(loss.item())\n", " if (epoch+1) % 10 == 0:\n", " print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}\")\n", "print(\"Training Complete!\")" ] }, { "cell_type": "code", "execution_count": 343, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 472 }, "id": "9GemB-4ByJDY", "outputId": "8e318c9d-9f1c-46d7-d786-67182ebf2437" }, "outputs": [ { "data": { "image/png": "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aPjzzZs3kZKSgnbt2gEA2rVrh3379hm97759+xAQEAC5XI727dtDr9cbreGpi4CAAEyZMgXbtm3DU089hWXLlj3Q+xFR41BIHYCImha1Wo233noLU6ZMgV6vR8+ePaHVarFv3z44ODigVatWAIAPPvgALVq0gJubG9577z24uLhg2LBhAIA333wT4eHh+PDDDzFq1CgcOHAAX3zxBb788ksAgK+vL8aNG4cJEyZgwYIFCAsLw5UrV5CTk4ORI0feM2NpaSmmTZuGESNGwM/PD1evXsWRI0cwfPjwBhsXIqpHUi/6IaKmR6/Xi88++0wEBgYKa2tr4erqKgYOHCgSEhIMi31//vlnERISIpRKpejatas4deqU0XusXbtWBAcHC2tra9GyZUsxZ84co+dLS0vFlClThIeHh1AqlcLf318sXbpUCPHHguKbN28a9j9x4oQAINLS0kR5ebkYPXq08PHxEUqlUnh6eoqYmBjDYmMiMm0yIYSQuF8RERnEx8ejb9++uHnzJpycnKSOQ0RmiGtuiIiIyKKw3BAREZFF4WEpIiIisiicuSEiIiKLwnJDREREFoXlhoiIiCwKyw0RERFZFJYbIiIisigsN0RERGRRWG6IiIjIorDcEBERkUVhuSEiIiKL8v/jH7K224wUDQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(all_loss)\n", "plt.title(\"loss v/s epochs\")\n", "plt.xlabel(\"epochs\")\n", "plt.ylabel(\"loss\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "0oXe5ldTyJDY" }, "source": [ "### 4.4.Predictions" ] }, { "cell_type": "code", "execution_count": 344, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 36 }, "id": "S2BcZFJUyJDZ", "outputId": "0215a8fa-4470-452b-e778-53b7e650864a" }, "outputs": [ { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" }, "text/plain": [ "'Russian'" ] }, "execution_count": 344, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.eval()\n", "name = \"jerebyatiev\"\n", "name = unicode_to_ascii(name)\n", "name_ascii = [ord(letter) for letter in name]\n", "\n", "name_ascii = name_ascii[:20] + [0] * (20 - len(name_ascii))\n", "\n", "# Convert to Tensor (reshape for RNN input)\n", "X = torch.tensor(name_ascii, dtype=torch.float32).view(1, 20, 1) # Shape: (batch, sequence, input)\n", "\n", "with torch.no_grad():\n", " pred = model(X.to(device))\n", "\n", "# Get Predicted Class\n", "idx = torch.argmax(pred).item()\n", "class_ = Encoder.classes_[idx]\n", "class_" ] }, { "cell_type": "markdown", "metadata": { "id": "_Uluci8WyJDZ" }, "source": [ "### 4.5.Save Model" ] }, { "cell_type": "code", "execution_count": 345, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "LCOwmZH7yJDZ", "outputId": "0e22f5c6-2f26-4381-f5c1-59708fb162ea" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model saved successfully!\n" ] } ], "source": [ "torch.save(model.state_dict(), \"rnn_model.pth\")\n", "print(\"Model saved successfully!\")" ] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "T4", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "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.10.7" } }, "nbformat": 4, "nbformat_minor": 0 }