{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "6a6de8e2", "metadata": { "id": "6a6de8e2" }, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')\n", "import string\n", "import re\n", "from unicodedata import normalize\n", "import numpy as np\n", "from keras.preprocessing.text import Tokenizer\n", "from keras.preprocessing.sequence import pad_sequences\n", "from keras.utils import to_categorical\n", "from keras.models import Sequential,load_model\n", "from keras.layers import LSTM,Dense,Embedding,RepeatVector,TimeDistributed\n", "from keras.callbacks import EarlyStopping\n", "from keras.preprocessing.text import Tokenizer\n", "from keras.preprocessing.sequence import pad_sequences\n", "from nltk.translate.bleu_score import corpus_bleu\n", "import pandas as pd\n", "from string import punctuation\n", "import matplotlib.pyplot as plt\n", "from IPython.display import Markdown, display\n", "\n", "def printmd(string):\n", " # Print with Markdowns\n", " display(Markdown(string))" ] }, { "cell_type": "code", "execution_count": 2, "id": "cNkcJJtCi_I4", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "cNkcJJtCi_I4", "outputId": "76757ad6-0fed-4b84-9bde-1d7991ff10ee" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Mounted at /content/drive\n" ] } ], "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ] }, { "cell_type": "code", "execution_count": 3, "id": "d7439528", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 151 }, "id": "d7439528", "outputId": "da232d2d-0551-4d62-bc4f-119456037d6a" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "## 10000 \"parallel sentences\" will be loaded (original sentence + its translation)" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "## 9000 \"parallel sentences\" will be used to train the model" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "## 1000 \"parallel sentences\" will be used to test the model" }, "metadata": {} } ], "source": [ "total_sentences = 10000\n", "\n", "# Load the dataset\n", "dataset = pd.read_csv(\"/content/drive/MyDrive/Colab Notebooks/Dataset/eng_-french.csv\", nrows = total_sentences)\n", "\n", "# What proportion of the sentences will be used for the test set\n", "test_proportion = 0.1\n", "train_test_threshold = int( (1-test_proportion) * total_sentences)\n", "\n", "printmd(f'## {total_sentences} \"parallel sentences\" will be loaded (original sentence + its translation)')\n", "printmd(f'## {train_test_threshold} \"parallel sentences\" will be used to train the model')\n", "printmd(f'## {total_sentences-train_test_threshold} \"parallel sentences\" will be used to test the model')" ] }, { "cell_type": "code", "execution_count": 4, "id": "5cf29feb", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 363 }, "id": "5cf29feb", "outputId": "72534a51-013d-4569-8043-d1fbb474675c" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " English words/sentences French words/sentences\n", "1554 Let me die. Laisse-moi mourir.\n", "2087 He's a slob. C'est un flemmard.\n", "5470 I have to try. Il faut que j'essaie.\n", "2363 I was naive. Je fus crédule.\n", "7570 He is bankrupt. Il est en faillite.\n", "6427 That's a fact. C'est un fait.\n", "1651 Talk to me! Parlez-moi !\n", "4164 Keep talking. Continuez de parler.\n", "1231 I broke it. Je l'ai cassée.\n", "9232 Tom is a judge. Tom est juge." ], "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
English words/sentencesFrench words/sentences
1554Let me die.Laisse-moi mourir.
2087He's a slob.C'est un flemmard.
5470I have to try.Il faut que j'essaie.
2363I was naive.Je fus crédule.
7570He is bankrupt.Il est en faillite.
6427That's a fact.C'est un fait.
1651Talk to me!Parlez-moi !
4164Keep talking.Continuez de parler.
1231I broke it.Je l'ai cassée.
9232Tom is a judge.Tom est juge.
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"dataset\",\n \"rows\": 10,\n \"fields\": [\n {\n \"column\": \"English words/sentences\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 10,\n \"samples\": [\n \"I broke it.\",\n \"He's a slob.\",\n \"That's a fact.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"French words/sentences\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 10,\n \"samples\": [\n \"Je l'ai cass\\u00e9e.\",\n \"C'est un flemmard.\",\n \"C'est un fait.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 4 } ], "source": [ "# Shuffle the dataset\n", "dataset = dataset.sample(frac=1, random_state=0)\n", "dataset.iloc[1000:1010]" ] }, { "cell_type": "code", "execution_count": 5, "id": "33f574a5", "metadata": { "id": "33f574a5" }, "outputs": [], "source": [ "def clean(string):\n", " # Clean the string\n", " string = string.replace(\"\\u202f\",\" \") # Replace no-break space with space\n", " string = string.lower()\n", "\n", " # Delete the punctuation and the numbers\n", " for p in punctuation + \"«»\" + \"0123456789\":\n", " string = string.replace(p,\" \")\n", "\n", " string = re.sub('\\s+',' ', string)\n", " string = string.strip()\n", "\n", " return string\n", "\n", "# Clean the sentences\n", "dataset[\"English words/sentences\"] = dataset[\"English words/sentences\"].apply(lambda x: clean(x))\n", "dataset[\"French words/sentences\"] = dataset[\"French words/sentences\"].apply(lambda x: clean(x))\n", "\n", "# Select one part of the dataset\n", "dataset = dataset.values\n", "dataset = dataset[:total_sentences]\n", "\n", "# split into train/test\n", "train, test = dataset[:train_test_threshold], dataset[train_test_threshold:]\n", "\n", "# Define the name of the source and of the target\n", "# This will be used in the outputs of this notebook\n", "source_str, target_str = \"French\", \"English\"\n", "\n", "# The index in the numpy array of the source and of the target\n", "idx_src, idx_tar = 1, 0\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "ZdkiZ76oSt34", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 363 }, "id": "ZdkiZ76oSt34", "outputId": "a3e74a90-561e-48b7-9959-50ee1d697bc0" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 0 1\n", "0 let me die laisse moi mourir\n", "1 he s a slob c est un flemmard\n", "2 i have to try il faut que j essaie\n", "3 i was naive je fus crédule\n", "4 he is bankrupt il est en faillite\n", "5 that s a fact c est un fait\n", "6 talk to me parlez moi\n", "7 keep talking continuez de parler\n", "8 i broke it je l ai cassée\n", "9 tom is a judge tom est juge" ], "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
0let me dielaisse moi mourir
1he s a slobc est un flemmard
2i have to tryil faut que j essaie
3i was naiveje fus crédule
4he is bankruptil est en faillite
5that s a factc est un fait
6talk to meparlez moi
7keep talkingcontinuez de parler
8i broke itje l ai cassée
9tom is a judgetom est juge
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"pd\",\n \"rows\": 10,\n \"fields\": [\n {\n \"column\": 0,\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 10,\n \"samples\": [\n \"i broke it\",\n \"he s a slob\",\n \"that s a fact\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": 1,\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 10,\n \"samples\": [\n \"je l ai cass\\u00e9e\",\n \"c est un flemmard\",\n \"c est un fait\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 6 } ], "source": [ "# Display the result after cleaning\n", "pd.DataFrame(dataset[1000:1010])" ] }, { "cell_type": "code", "execution_count": 7, "id": "275b13e8", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 116 }, "id": "275b13e8", "outputId": "3e708cc0-7e3d-426d-cf56-304df00e544b" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "\nTarget (English) Vocabulary Size: 2099" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "Target (English) Max Length: 5" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "\nSource (French) Vocabulary Size: 4039" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/markdown": "Source (French) Max Length: 12\n" }, "metadata": {} } ], "source": [ "def create_tokenizer(lines):\n", " # fit a tokenizer\n", " tokenizer = Tokenizer()\n", " tokenizer.fit_on_texts(lines)\n", " return tokenizer\n", "\n", "def max_len(lines):\n", " # max sentence length\n", " return max(len(line.split()) for line in lines)\n", "\n", "def encode_sequences(tokenizer, length, lines):\n", " # encode and pad sequences\n", " X = tokenizer.texts_to_sequences(lines) # integer encode sequences\n", " X = pad_sequences(X, maxlen=length, padding='post') # pad sequences with 0 values\n", " return X\n", "\n", "def encode_output(sequences, vocab_size):\n", " # one hot encode target sequence\n", " ylist = list()\n", " for sequence in sequences:\n", " encoded = to_categorical(sequence, num_classes=vocab_size)\n", " ylist.append(encoded)\n", " y = np.array(ylist)\n", " y = y.reshape(sequences.shape[0], sequences.shape[1], vocab_size)\n", " return y\n", "\n", "# Prepare target tokenizer\n", "tar_tokenizer = create_tokenizer(dataset[:, idx_tar])\n", "tar_vocab_size = len(tar_tokenizer.word_index) + 1\n", "tar_length = max_len(dataset[:, idx_tar])\n", "printmd(f'\\nTarget ({target_str}) Vocabulary Size: {tar_vocab_size}')\n", "printmd(f'Target ({target_str}) Max Length: {tar_length}')\n", "\n", "# Prepare source tokenizer\n", "src_tokenizer = create_tokenizer(dataset[:, idx_src])\n", "src_vocab_size = len(src_tokenizer.word_index) + 1\n", "src_length = max_len(dataset[:, idx_src])\n", "printmd(f'\\nSource ({source_str}) Vocabulary Size: {src_vocab_size}')\n", "printmd(f'Source ({source_str}) Max Length: {src_length}\\n')\n", "\n", "# Prepare training data\n", "trainX = encode_sequences(src_tokenizer, src_length, train[:, idx_src])\n", "trainY = encode_sequences(tar_tokenizer, tar_length, train[:, idx_tar])\n", "trainY = encode_output(trainY, tar_vocab_size)\n", "\n", "# Prepare test data\n", "testX = encode_sequences(src_tokenizer, src_length, test[:, idx_src])\n", "testY = encode_sequences(tar_tokenizer, tar_length, test[:, idx_tar])\n", "testY = encode_output(testY, tar_vocab_size)" ] }, { "cell_type": "code", "execution_count": 8, "id": "06fb69d9", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "06fb69d9", "outputId": "ec5dffb6-3bb9-43f0-847d-f9719f1999d5" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/20\n", "127/127 [==============================] - 32s 184ms/step - loss: 4.3580 - val_loss: 3.5034\n", "Epoch 2/20\n", "127/127 [==============================] - 20s 159ms/step - loss: 3.3180 - val_loss: 3.2966\n", "Epoch 3/20\n", "127/127 [==============================] - 29s 232ms/step - loss: 3.1166 - val_loss: 3.1305\n", "Epoch 4/20\n", "127/127 [==============================] - 22s 174ms/step - loss: 2.9387 - val_loss: 3.0357\n", "Epoch 5/20\n", "127/127 [==============================] - 20s 160ms/step - loss: 2.8170 - val_loss: 2.9482\n", "Epoch 6/20\n", "127/127 [==============================] - 22s 171ms/step - loss: 2.7020 - val_loss: 2.8696\n", "Epoch 7/20\n", "127/127 [==============================] - 21s 162ms/step - loss: 2.5850 - val_loss: 2.7787\n", "Epoch 8/20\n", "127/127 [==============================] - 22s 171ms/step - loss: 2.4499 - val_loss: 2.7062\n", "Epoch 9/20\n", "127/127 [==============================] - 22s 177ms/step - loss: 2.3151 - val_loss: 2.5752\n", "Epoch 10/20\n", "127/127 [==============================] - 21s 163ms/step - loss: 2.1780 - val_loss: 2.4899\n", "Epoch 11/20\n", "127/127 [==============================] - 22s 171ms/step - loss: 2.0454 - val_loss: 2.3923\n", "Epoch 12/20\n", "127/127 [==============================] - 20s 160ms/step - loss: 1.9261 - val_loss: 2.3220\n", "Epoch 13/20\n", "127/127 [==============================] - 22s 175ms/step - loss: 1.8146 - val_loss: 2.2600\n", "Epoch 14/20\n", "127/127 [==============================] - 20s 160ms/step - loss: 1.7014 - val_loss: 2.1994\n", "Epoch 15/20\n", "127/127 [==============================] - 22s 171ms/step - loss: 1.5957 - val_loss: 2.1526\n", "Epoch 16/20\n", "127/127 [==============================] - 20s 160ms/step - loss: 1.4959 - val_loss: 2.1011\n", "Epoch 17/20\n", "127/127 [==============================] - 22s 173ms/step - loss: 1.4070 - val_loss: 2.0468\n", "Epoch 18/20\n", "127/127 [==============================] - 20s 160ms/step - loss: 1.3184 - val_loss: 2.0204\n", "Epoch 19/20\n", "127/127 [==============================] - 22s 170ms/step - loss: 1.2317 - val_loss: 1.9782\n", "Epoch 20/20\n", "127/127 [==============================] - 20s 161ms/step - loss: 1.1525 - val_loss: 1.9759\n" ] } ], "source": [ "def create_model(src_vocab, tar_vocab, src_timesteps, tar_timesteps, n_units):\n", " # Create the model\n", " model = Sequential()\n", " model.add(Embedding(src_vocab_size, n_units, input_length=src_length, mask_zero=True))\n", " model.add(LSTM(n_units))\n", " model.add(RepeatVector(tar_timesteps))\n", " model.add(LSTM(n_units, return_sequences=True))\n", " model.add(TimeDistributed(Dense(tar_vocab, activation='softmax')))\n", " return model\n", "\n", "# Create model\n", "model = create_model(src_vocab_size, tar_vocab_size, src_length, tar_length, 256)\n", "model.compile(optimizer='adam', loss='categorical_crossentropy')\n", "\n", "history = model.fit(trainX,\n", " trainY,\n", " epochs=20,\n", " batch_size=64,\n", " validation_split=0.1,\n", " verbose=1,\n", " callbacks=[\n", " EarlyStopping(\n", " monitor='val_loss',\n", " patience=10,\n", " restore_best_weights=True\n", " )\n", " ])" ] }, { "cell_type": "code", "execution_count": 9, "id": "6b90c23c", "metadata": { "id": "6b90c23c", "colab": { "base_uri": "https://localhost:8080/", "height": 452 }, "outputId": "07f0bc72-13d7-4709-c8e4-ed4cd1bbfb85" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} } ], "source": [ "pd.DataFrame(history.history).plot()\n", "plt.title(\"Loss\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 10, "id": "138d6368", "metadata": { "id": "138d6368", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "9b93e877-e123-40d1-cf72-c19e9ba617e0" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "### Result on the Training Set ###\n", "FRENCH (SOURCE) ENGLISH (TARGET) AUTOMATIC TRANSLATION IN ENGLISH\n", "\n", "nous en savons assez we know enough we re\n", "garde ton sang froid stay calm keep calm\n", "je ne pleurerai pas i won t cry i didn t go\n", "je ne suis pas contente i m not happy i m not busy\n", "moi je veux ça i want that i ll try\n", "j étais tellement heureuse i was so happy i m too busy\n", "j aime le printemps i like spring i like cookies\n", "c est mon garçon that s my boy it s my dog\n", "mille mercis many thanks thanks a\n", "quelle horreur how horrible how nothing\n", "soyez satisfaites be content be content\n", "toi décide you decide you promised\n", "je m en suis remis i recovered i recovered\n", "ce sont les affaires it s business it is good\n", "je dois m en aller i need to go i must to go\n", "sommes nous prêtes are we ready are we kidding\n", "arrêtez de crier stop shouting stop grumbling\n", "je lis souvent i often read i m ashamed\n", "les plantes croissent plants grow plants stinks\n", "il m a fallu le faire i had to do it i had to it\n", "nous éclatâmes de rire we broke up we lost\n", "\n", "\n", "### Result on the Test Set ###\n", "FRENCH (SOURCE) ENGLISH (TARGET) AUTOMATIC TRANSLATION IN ENGLISH\n", "\n", "ils ont abandonné they gave up they lost\n", "rappelle moi call me back help me\n", "je veux essayer i want to try i want to you\n", "ça fonctionne bien it works well it was hard\n", "grimpe dans la camionnette get in the van get on the bus\n", "je suis mince i m thin i m innocent\n", "elle semble riche she seems rich she sued well\n", "ça me gave this annoys me i m wrong\n", "c était long it was long how thrilling\n", "c était un mensonge it was a lie it was a lie\n", "conduis toi en homme act like a man get to sleep\n", "laissez moi m en occuper leave it to me let me alone\n", "puis je manger ceci may i eat this can i go it\n", "devine make a guess let s go\n", "je ne suis pas jolie i m not pretty i m not fat\n", "demande à quiconque ask anyone stop clichés\n", "venez nous rejoindre come join us are us\n", "vous ennuyez vous are you bored you you you\n", "je ne viendrai pas i won t come i can t go\n", "c est un voleur he is a thief it s a joke\n", "bien joué well done good job\n" ] } ], "source": [ "def word_for_id(integer, tokenizer):\n", " # map an integer to a word\n", " for word, index in tokenizer.word_index.items():\n", " if index == integer:\n", " return word\n", " return None\n", "\n", "def predict_seq(model, tokenizer, source):\n", " # generate target from a source sequence\n", " prediction = model.predict(source, verbose=0)[0]\n", " integers = [np.argmax(vector) for vector in prediction]\n", " target = list()\n", " for i in integers:\n", " word = word_for_id(i, tokenizer)\n", " if word is None:\n", " break\n", " target.append(word)\n", " return ' '.join(target)\n", "\n", "def compare_prediction(model, tokenizer, sources, raw_dataset, limit=20):\n", " # evaluate a model\n", " actual, predicted = [], []\n", " src = f'{source_str.upper()} (SOURCE)'\n", " tgt = f'{target_str.upper()} (TARGET)'\n", " pred = f'AUTOMATIC TRANSLATION IN {target_str.upper()}'\n", " print(f'{src:30} {tgt:25} {pred}\\n')\n", "\n", " for i, source in enumerate(sources): # translate encoded source text\n", " source = source.reshape((1, source.shape[0]))\n", " translation = predict_seq(model, tokenizer, source)\n", " raw_target, raw_src = raw_dataset[i]\n", " print(f'{raw_src:30} {raw_target:25} {translation}')\n", " if i >= limit: # Display some of the result\n", " break\n", "\n", "# test on some training sequences\n", "print('### Result on the Training Set ###')\n", "compare_prediction(model, tar_tokenizer, trainX, train)\n", "\n", "# test on some test sequences\n", "print('\\n\\n### Result on the Test Set ###')\n", "compare_prediction(model, tar_tokenizer, testX, test)" ] }, { "cell_type": "code", "execution_count": 11, "id": "2e935484", "metadata": { "id": "2e935484" }, "outputs": [], "source": [ "# It takes long to compute the BLEU Score\n", "\n", "def bleu_score(model, tokenizer, sources, raw_dataset):\n", " # Get the bleu score of a model\n", " actual, predicted = [], []\n", " for i, source in enumerate(sources):\n", " # translate encoded source text\n", " source = source.reshape((1, source.shape[0]))\n", " translation = predict_seq(model, tar_tokenizer, source)\n", " raw_target, raw_src = raw_dataset[i]\n", " actual.append([raw_target.split()])\n", " predicted.append(translation.split())\n", "\n", " bleu_dic = {}\n", " bleu_dic['1-grams'] = corpus_bleu(actual, predicted, weights=(1.0, 0, 0, 0))\n", " bleu_dic['1-2-grams'] = corpus_bleu(actual, predicted, weights=(0.5, 0.5, 0, 0))\n", " bleu_dic['1-3-grams'] = corpus_bleu(actual, predicted, weights=(0.3, 0.3, 0.3, 0))\n", " bleu_dic['1-4-grams'] = corpus_bleu(actual, predicted, weights=(0.25, 0.25, 0.25, 0.25))\n", "\n", " return bleu_dic\n", "\n", "# Compute the BLEU Score\n", "bleu_train = bleu_score(model, tar_tokenizer, trainX, train)\n", "bleu_test = bleu_score(model, tar_tokenizer, testX, test)" ] }, { "cell_type": "code", "execution_count": 12, "id": "d955dd33", "metadata": { "id": "d955dd33", "colab": { "base_uri": "https://localhost:8080/", "height": 452 }, "outputId": "abcb44b3-1ea2-407b-c09b-a4e31a918949" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGzCAYAAAD9pBdvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAyG0lEQVR4nO3deVhV1cLH8R+gHAYDxAFETZTMeQrDEa0biealvNXNtFK5pdXVJm63tEwzSyyHsLJ81evwZA5lZYOKGenN0jfLobduaZhjKih6BYUEhfX+0cPJE4McBJfg9/M853k866y19tp74eHH3muf42GMMQIAALDE0/YAAADA5Y0wAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAKgXJ599ll5eHi4VTcjI6NCx7B+/Xp5eHho+fLlFdrvxTZs2DCFh4eXq6078wBcqggjuOgWLFggDw8Pl0f9+vV1/fXXa/Xq1UXqe3h4aNSoUaX2ed111xXps/DRsmVLZ73z/VJs27atrrvuuvPuQ15enmbMmKFOnTopICBAQUFBatOmjUaMGKEdO3act311NWnSJK1YsaLC+128eLGSkpIqvN+yOnTokJ599llt377d2hiqO9tzDLtq2B4ALl/PPfecmjZtKmOM0tPTtWDBAt1000366KOP9Oc//9nt/ho1aqTExMQi5YGBgRUxXBe33XabVq9erUGDBmn48OE6c+aMduzYoY8//ljdu3d3CUDV1dixYzV69GiXskmTJun222/XgAEDKnRbixcv1vfff69HH320Qvstq0OHDmnChAkKDw9Xx44dK7z/OXPmqKCgoFxti5uHqsj2HMMuwgis6devnzp37ux8fu+99yokJERLliwpVxgJDAzU3XffXZFDLNbXX3+tjz/+WC+88IKeeuopl9dee+01nThxotLHUOj06dPy9vaWp+fFP8lZo0YN1ajBW0hxcnJy5OfnV+b6NWvWLPe2mAdUB1ymwSUjKChIvr6+l/wb688//yxJ6tGjR5HXvLy8VKdOHZeygwcP6t5771VYWJgcDoeaNm2qBx98UHl5ec46u3fv1l//+lcFBwfLz89PXbt21cqVK136KVwfsXTpUo0dO1YNGzaUn5+fsrKyJElfffWV+vbtq8DAQPn5+al379768ssvS90XY4zq1q2rhIQEZ1lBQYGCgoLk5eXlEqxefPFF1ahRQ6dOnZJUdK2Ch4eHsrOztXDhQuclsmHDhrls78SJExo2bJiCgoIUGBio+Ph45eTklDrG6667TitXrtS+ffuc/f5xfUVBQYFeeOEFNWrUSD4+Prrhhhu0a9euIn2V5xitX79e1157rSQpPj7eOYYFCxY4x9e2bVtt2bJFvXr1kp+fnzOkfvDBB+rfv79z7iMiIjRx4kTl5+e7bOOPa0b27t0rDw8PTZ06VbNnz1ZERIQcDoeuvfZaff311y5ti1szUnhpc8WKFWrbtq0cDofatGmj5OTkYvevc+fO8vHxUUREhP7nf/6nzOtQUlNTddtttyk0NFQ+Pj5q1KiR7rzzTmVmZrrUW7RokSIjI+Xr66vg4GDdeeedOnDggPP1sswxqrdL+10f1VpmZqYyMjJkjNGRI0f06quv6tSpU+U+u5Gfn1/sWhBfX1/5+/tf6HCdmjRpIkl666231KNHj1LD06FDhxQVFaUTJ05oxIgRatmypQ4ePKjly5crJydH3t7eSk9PV/fu3ZWTk6OHH35YderU0cKFC3XzzTdr+fLl+stf/uLS58SJE+Xt7a3HH39cubm58vb21meffaZ+/fopMjJS48ePl6enp+bPn68//elP2rBhg6Kiooodn4eHh3r06KHPP//cWfZ///d/yszMlKenp7788kv1799fkrRhwwZ16tRJtWrVKravN998U/fdd5+ioqI0YsQISVJERIRLnTvuuENNmzZVYmKitm7dqrlz56p+/fp68cUXSzyGTz/9tDIzM/XLL7/o5ZdflqQiY5g8ebI8PT31+OOPKzMzUy+99JLuuusuffXVV8465T1GrVq10nPPPadx48ZpxIgRio6OliR1797dWefYsWPq16+f7rzzTt19990KCQmR9Nv6qFq1aikhIUG1atXSZ599pnHjxikrK0tTpkwpcZ8LLV68WCdPntT9998vDw8PvfTSS7r11lu1e/fu855N+eKLL/Tee+/p73//u6644gq98soruu2227R//35nYN62bZv69u2rBg0aaMKECcrPz9dzzz2nevXqnXdseXl5io2NVW5urh566CGFhobq4MGD+vjjj3XixAnn5dEXXnhBzzzzjO644w7dd999Onr0qF599VX16tVL27ZtU1BQUJnmGNWcAS6y+fPnG0lFHg6H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5en5e8Zp3Lix1qxZo8cee0zt27dXw4YN9cgjj+jJJ5+suL0AAABVlocxxtgexPlkZWUpMDBQmZmZCggIqNC++W4ae/huGgCo3sr6+5vvpgEAAFYRRgAAgFWEEQAAYBVhBAAAWEUYAQAAVhFGAACAVYQRAABgFWEEAABYRRgBAABWEUYAAIBVhBEAAGAVYQQAAFhFGAEAAFYRRgAAgFWEEQAAYBVhBAAAWEUYAQAAVhFGAACAVYQRAABgFWEEAABYRRgBAABWEUYAAIBVhBEAAGAVYQQAAFhFGAEAAFYRRgAAgFWEEQAAYBVhBAAAWEUYAQAAVhFGAACAVTVsDwCoLOGjV9oewmVr7+T+tocAoArhzAgAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAqnKFkZkzZyo8PFw+Pj7q0qWLNm/eXKZ2S5culYeHhwYMGFCezQIAgGrI7TCybNkyJSQkaPz48dq6das6dOig2NhYHTlypNR2e/fu1eOPP67o6OhyDxYAAFQ/boeR6dOna/jw4YqPj1fr1q01a9Ys+fn5ad68eSW2yc/P11133aUJEyaoWbNm591Gbm6usrKyXB4AAKB6quFO5by8PG3ZskVjxoxxlnl6eiomJkabNm0qsd1zzz2n+vXr695779WGDRvOu53ExERNmDDBnaEBuIyEj15pewiXrb2T+9seAqoht86MZGRkKD8/XyEhIS7lISEhSktLK7bNF198oX/961+aM2dOmbczZswYZWZmOh8HDhxwZ5gAAKAKcevMiLtOnjype+65R3PmzFHdunXL3M7hcMjhcFTiyAAAwKXCrTBSt25deXl5KT093aU8PT1doaGhRer//PPP2rt3r+Li4pxlBQUFv224Rg3t3LlTERER5Rk3AACoJty6TOPt7a3IyEilpKQ4ywoKCpSSkqJu3boVqd+yZUt999132r59u/Nx88036/rrr9f27dvVuHHjC98DAABQpbl9mSYh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VwXlndtvv/3WSHI53sVhbu1xZ263bdtmGjZsaA4fPlzmdsxt5SCMVKKy/HCfPXvWtGjRwtx4441m+/btZsOGDSYqKqrYMBIeHm7effdds3v3bnPo0CHzyy+/mClTppht27aZn3/+2bzyyivGy8vLfPXVV87+e/fuba644gozceJE89NPP5mJEycaLy8v069fPzN79mzz008/mQcffNDUqVPHZGdnG2OMGTlypOnYsaP5+uuvzZ49e8zatWvNhx9+WFmH6ZJV3l9Yc+bMMXXr1i21zhdffGE8PT3NlClTzM6dO83MmTNNcHBwkTe1wjefrVu3mm+//dYYY8zy5cvNu+++a1JTU822bdtMXFycadeuncnPzzfG/P7z0rJlS5OcnGx++OEH07VrVxMZGWmuu+4688UXX5itW7eaq666yjzwwAPGGGPOnDljAgMDzeOPP2527dplfvjhB7NgwQKzb98+t/e/KijP3J46dco8+uijpmnTpiY3N7fEesytXWWd2+zsbNOqVSuzYsWKMrdjbisPYaQSleWHe/Xq1aZGjRrm8OHDzrKSzowkJSWdd5v9+/c3//jHP5zPe/fubXr27Ol8fvbsWePv72/uueceZ1nhXwWbNm0yxhgTFxdn4uPjy7KL1Vp5fmEdPXrUXHnlleapp54qtd7AgQNN//79XcruuuuuIm9qNWvWdPkrqKRtSjLfffedMeb3n5e5c+c66yxZssRIMikpKc6yxMRE06JFC2OMMceOHTOSzPr168u0n1WdO3M7c+ZM4+/vbySZFi1anPesCHNrV1nndsSIEebee+91qx1zW3lYM3IRTZo0SbVq1XI+9u/fr507d6px48YKDQ111ouKiiq2fefOnV2e5+fna+LEiWrXrp2Cg4NVq1YtrVmzRvv373ep1759e+e/vby8VKdOHbVr185ZVvi9QkeOHJEkPfjgg1q6dKk6duyoJ554Qhs3brywHa8mipu/c2VlZal///5q3bq1nn32WWd5mzZtnG369esnSdq5c2eReS5u3ps0aaJ69eq5lKWmpmrQoEFq1qyZAgICFB4eLkmlznvhHP9x3gvnPDg4WMOGDVNsbKzi4uI0Y8YMHT58uCyHpVoobW7vuusubdu2Tf/+97919dVX64477tDp06clMbdVQXFz++GHH+qzzz5TUlJSie2Y24vL7S/KQ/k98MADuuOOO5zPw8LC3Grv7+/v8nzKlCmaMWOGkpKS1K5dO/n7++vRRx8tsmCqZs2aLs89PDxcygoXbxUUFEiS+vXrp3379mnVqlVau3atbrjhBo0cOVJTp051a7zVTWnzd/LkSfXt21dXXHGF3n//fZfju2rVKueCY19fX7e2+cc5l6S4uDg1adJEc+bMUVhYmAoKCtS2bdtS571wjv9YVjjnkjR//nw9/PDDSk5O1rJlyzR27FitXbtWXbt2dWvMVVFpcxsYGKjAwEA1b95cXbt2Ve3atfX+++9r0KBBzG0VUNzcTp8+XT///LOCgoJc6t52222Kjo7W+vXrmduLjDByEQUHBys4ONilrEWLFjpw4IDS09OdKfjrr78uU39ffvmlbrnlFt19992SfgsTP/30k1q3bn3BY61Xr56GDh2qoUOHKjo6Wv/85z8v+zBS3PxJv50RiY2NlcPh0IcffigfHx+X15s0aVKkTYsWLYrMc1nm/dixY9q5c6fmzJmj6OhoSdIXX3zhzm6UqlOnTurUqZPGjBmjbt26afHixVXuTa08SprbPzK/XdpWbm6uJOa2KihubkePHq377rvPpaxdu3Z6+eWXFRcXJ4m5vdgIIxXs1KlT2rVrl/P5nj17tH37dgUHB+vKK68sUv/GG29URESEhg4dqpdeekknT57U2LFjJem8t5s1b95cy5cv18aNG1W7dm1Nnz5d6enpFxxGxo0bp8jISLVp00a5ubn6+OOP1apVqwvqs6pwd/6ysrLUp08f5eTkaNGiRcrKylJWVpak3wKdl5dXsdt56KGH1KtXL02fPl1xcXH67LPPtHr16vPOee3atVWnTh3Nnj1bDRo00P79+zV69OgL2OPf93P27Nm6+eabFRYWpp07dyo1NVVDhgy54L4vFe7O7e7du7Vs2TL16dNH9erV0y+//KLJkyfL19dXN910U4nbYW4vPnfnNjQ01OXSeKErr7xSTZs2LXE7zG0lsr1opbpZt26dkVTkMXTo0BLbFN7a6+3tbVq2bGk++ugjI8kkJycbY35f2LRt2zaXdseOHTO33HKLqVWrlqlfv74ZO3asGTJkiLnlllucdXr37m0eeeQRl3ZNmjQxL7/8skuZzlm8NXHiRNOqVSvj6+trgoODzS233GJ2795dziNStbg7fyXVl2T27NlT6rZmz55tGjZs6LxF8PnnnzehoaHO1wtvEfyjtWvXmlatWhmHw2Hat29v1q9fX+yC53N/XgrH+d///tdZNn/+fOfCu7S0NDNgwADToEED4+3tbZo0aWLGjRvnXOlfHbg7twcPHjT9+vUz9evXNzVr1jSNGjUygwcPNjt27Djvtpjbi6s877t/dO5xLg1zWzk8jDGmErMOyuHLL79Uz549tWvXLkVERNgeDi6S4cOHa8eOHdqwYYPtoaCCMbfVF3NbMbhMcwl4//33VatWLTVv3ly7du3SI488oh49ehBEqrmpU6fqxhtvlL+/v1avXq2FCxfq9ddftz0sVADmtvpibisHYeQScPLkST355JPav3+/6tatq5iYGE2bNs32sFDJNm/e7Fwn1KxZM73yyitFFtWhamJuqy/mtnJwmQYAAFjFh54BAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArPp/qcMbpJG8s6gAAAAASUVORK5CYII=\n" }, "metadata": {} } ], "source": [ "plt.bar(x = bleu_train.keys(), height = bleu_train.values())\n", "plt.title(\"BLEU Score with the training set\")\n", "plt.ylim((0,1))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 13, "id": "f3cf03db", "metadata": { "id": "f3cf03db", "colab": { "base_uri": "https://localhost:8080/", "height": 452 }, "outputId": "bc1f4f46-5e1b-4beb-8c6a-c0be5257b6fb" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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LbbNuHHjlJmZ6XycOHGioocJAAAscWsBa+3ateXl5aX09HSX8vT0dNWtW7fINvXq1VP16tXl5eXlLIuMjFRaWppyc3Pl7e1dqI3D4ZDD4XBnaAAAoJJy68iIt7e3oqKilJqa6izLz89XamqqOnXqVGSbLl266NChQ8rPz3eWHThwQPXq1SsyiAAAgOuL26dpEhMTNX/+fC1evFh79+7VI488ouzsbCUkJEiSBg0apHHjxjnrP/LIIzp//rxGjx6tAwcOaNWqVZo6dapGjhxZfnsBAAAqLbfvM9K/f3+dPXtWEydOVFpamtq1a6eUlBTnotbjx4/L0/OXjBMeHq61a9fqiSeeUJs2bVS/fn2NHj1azzzzTPntBQAAqLTcvs+IDdxnBACAyqdC7jMCAABQ3ggjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKyqZnsAtkWMXWV7CNeto9N62x4CAOAPgCMjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCqTGFkzpw5ioiIkI+Pjzp27Kjt27eXqt3SpUvl4eGhvn37lmWzAACgCnI7jCxbtkyJiYmaNGmSdu3apbZt2youLk5nzpwpsd3Ro0f15JNPKiYmpsyDBQAAVY/bYWTWrFkaNmyYEhIS1KJFC82dO1c1atTQW2+9VWybvLw8Pfjgg5o8ebKaNGly1W3k5OQoKyvL5QEAAKomt8JIbm6udu7cqdjY2F868PRUbGystm7dWmy7F154QSEhIRoyZEiptpOUlKTAwEDnIzw83J1hAgCASsStMJKRkaG8vDyFhoa6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\n" }, "metadata": {} } ], "source": [ "plt.bar(x = bleu_test.keys(), height = bleu_test.values())\n", "plt.title(\"BLEU Score with the test set\")\n", "plt.ylim((0,1))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 18, "id": "LYE8QofL1XC1", "metadata": { "id": "LYE8QofL1XC1" }, "outputs": [], "source": [ "model.save('/content/drive/MyDrive/Colab Notebooks/Models/french_to_english_translator.h5')" ] }, { "cell_type": "code", "execution_count": 19, "id": "PoS_noGF1eXf", "metadata": { "id": "PoS_noGF1eXf", "colab": { "base_uri": "https://localhost:8080/", "height": 626 }, "outputId": "ad5e59c7-b064-4eb0-a85b-5e76d7be1bfb" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Setting queue=True in a Colab notebook requires sharing enabled. Setting `share=True` (you can turn this off by setting `share=False` in `launch()` explicitly).\n", "\n", "Colab notebook detected. To show errors in colab notebook, set debug=True in launch()\n", "Running on public URL: https://2ebce967724a96d7c0.gradio.live\n", "\n", "This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "
" ] }, "metadata": {} }, { "output_type": "execute_result", "data": { "text/plain": [] }, "metadata": {}, "execution_count": 19 } ], "source": [ "import gradio as gr\n", "\n", "# Load the trained model\n", "model = load_model('/content/drive/MyDrive/Colab Notebooks/Models/french_to_english_translator.h5')\n", "\n", "# Function to translate French to English\n", "def translate_french_to_english(french_sentence):\n", " # Clean the input sentence\n", " french_sentence = clean(french_sentence)\n", " # Tokenize and pad the input sentence\n", " input_sequence = encode_sequences(src_tokenizer, src_length, [french_sentence])\n", " # Generate the translation\n", " english_translation = predict_seq(model, tar_tokenizer, input_sequence)\n", " return english_translation\n", "\n", "# Create a Gradio interface\n", "gr.Interface(\n", " fn=translate_french_to_english,\n", " inputs=\"text\",\n", " outputs=\"text\",\n", " title=\"French to English Translator\",\n", " description=\"Translate French sentences to English.\"\n", ").launch()" ] } ], "metadata": { "colab": { "provenance": [] }, "kaggle": { "accelerator": "nvidiaTeslaT4", "dataSources": [ { "datasetId": 592212, "sourceId": 1067156, "sourceType": "datasetVersion" } ], "dockerImageVersionId": 30260, "isGpuEnabled": true, "isInternetEnabled": true, "language": "python", "sourceType": "notebook" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.2" }, "papermill": { "default_parameters": {}, "duration": 3017.154782, "end_time": "2024-01-11T16:19:30.323673", "environment_variables": {}, "exception": null, "input_path": "__notebook__.ipynb", "output_path": "__notebook__.ipynb", "parameters": {}, "start_time": "2024-01-11T15:29:13.168891", "version": "2.3.4" } }, "nbformat": 4, "nbformat_minor": 5 }