{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from torchtext.vocab import build_vocab_from_iterator\n", "from torch.utils.data import DataLoader\n", "import torch\n", "from torch import nn\n", "import pandas as pd\n", "import nltk\n", "import regex as re\n", "import csv\n", "import itertools\n", "from nltk import word_tokenize\n", "from os.path import exists\n", "\n", "\n", "def clean(text):\n", " text = str(text).strip().lower()\n", " text = re.sub(\"’|>|<|\\.|\\\\|\\\"|”|-|,|\\*|:|\\/\", \"\", text)\n", " text = text.replace('\\\\n', \" \").replace(\"'t\", \" not\").replace(\"'s\", \" is\").replace(\"'ll\", \" will\").replace(\"'m\", \" am\").replace(\"'ve\", \" have\")\n", " text = text.replace(\"'\", \"\")\n", " return text\n", "\n", "def get_words_from_line(line, specials = True):\n", " line = line.rstrip()\n", " if specials:\n", " yield ''\n", " for m in re.finditer(r'[\\p{L}0-9\\*]+|\\p{P}+', line):\n", " yield m.group(0).lower()\n", " if specials:\n", " yield ''\n", "\n", "def get_word_lines_from_data(d):\n", " for line in d:\n", " yield get_words_from_line(line)\n", "\n", "\n", "class SimpleBigramNeuralLanguageModel(torch.nn.Module):\n", " \n", " def __init__(self, vocabulary_size, embedding_size):\n", " super(SimpleBigramNeuralLanguageModel, self).__init__()\n", " self.model = nn.Sequential(\n", " nn.Embedding(vocabulary_size, embedding_size),\n", " nn.Linear(embedding_size, vocabulary_size),\n", " nn.Softmax()\n", " )\n", "\n", " def forward(self, x):\n", " return self.model(x)\n", "\n", "def look_ahead_iterator(gen):\n", " w1 = None\n", " for item in gen:\n", " if w1 is not None:\n", " yield (w1, item)\n", " w1 = item\n", " \n", "class Bigrams(torch.utils.data.IterableDataset):\n", " def __init__(self, data, vocabulary_size):\n", " self.vocab = build_vocab_from_iterator(\n", " get_word_lines_from_data(data),\n", " max_tokens = vocabulary_size,\n", " specials = [''])\n", " self.vocab.set_default_index(self.vocab[''])\n", " self.vocabulary_size = vocabulary_size\n", " self.data = data\n", "\n", " def __iter__(self):\n", " return look_ahead_iterator(\n", " (self.vocab[t] for t in itertools.chain.from_iterable(get_word_lines_from_data(self.data))))\n", "\n", "\n", "# ładowanie danych treningowych\n", "in_file = 'train/in.tsv.xz'\n", "out_file = 'train/expected.tsv'\n", "\n", "X_train = pd.read_csv(in_file, sep='\\t', header=None, quoting=csv.QUOTE_NONE, nrows=200000, on_bad_lines=\"skip\", encoding=\"UTF-8\")\n", "Y_train = pd.read_csv(out_file, sep='\\t', header=None, quoting=csv.QUOTE_NONE, nrows=200000, on_bad_lines=\"skip\", encoding=\"UTF-8\")\n", "\n", "X_train = X_train[[6, 7]]\n", "X_train = pd.concat([X_train, Y_train], axis=1)\n", "X_train = X_train[6] + X_train[0] + X_train[7]\n", "X_train = X_train.apply(clean)\n", "vocab_size = 30000\n", "embed_size = 150\n", "Dataset = Bigrams(X_train, vocab_size)\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Epoka 0--------------------------------------------------------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/przemek/anaconda3/envs/env/lib/python3.9/site-packages/torch/nn/modules/container.py:141: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", " input = module(input)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0 tensor(10.4640, device='cuda:0', grad_fn=)\n", "100 tensor(8.8699, device='cuda:0', grad_fn=)\n", "200 tensor(7.8760, device='cuda:0', grad_fn=)\n", "300 tensor(7.3941, device='cuda:0', grad_fn=)\n", "400 tensor(6.9599, device='cuda:0', grad_fn=)\n", "500 tensor(6.7027, device='cuda:0', grad_fn=)\n", "600 tensor(6.5332, device='cuda:0', grad_fn=)\n", "700 tensor(6.4762, device='cuda:0', grad_fn=)\n", "800 tensor(6.2756, device='cuda:0', grad_fn=)\n", "900 tensor(6.2160, device='cuda:0', grad_fn=)\n", "1000 tensor(6.2766, device='cuda:0', grad_fn=)\n", "1100 tensor(6.2922, device='cuda:0', grad_fn=)\n", "1200 tensor(6.0532, device='cuda:0', grad_fn=)\n", "1300 tensor(6.0914, device='cuda:0', grad_fn=)\n", "1400 tensor(5.9667, device='cuda:0', grad_fn=)\n", "1500 tensor(6.1284, device='cuda:0', grad_fn=)\n", "1600 tensor(6.1015, device='cuda:0', grad_fn=)\n", "1700 tensor(6.1512, device='cuda:0', grad_fn=)\n", "1800 tensor(6.1428, device='cuda:0', grad_fn=)\n", "1900 tensor(6.1808, device='cuda:0', grad_fn=)\n", "2000 tensor(6.3026, device='cuda:0', grad_fn=)\n", "2100 tensor(5.9979, device='cuda:0', grad_fn=)\n", "2200 tensor(6.1723, device='cuda:0', grad_fn=)\n", "2300 tensor(6.0850, device='cuda:0', grad_fn=)\n", "2400 tensor(5.9631, device='cuda:0', grad_fn=)\n", "2500 tensor(6.0300, device='cuda:0', grad_fn=)\n", "2600 tensor(5.9996, device='cuda:0', grad_fn=)\n", "2700 tensor(5.9015, device='cuda:0', grad_fn=)\n", "2800 tensor(5.9195, device='cuda:0', grad_fn=)\n", "2900 tensor(5.8945, device='cuda:0', grad_fn=)\n", "3000 tensor(6.1416, device='cuda:0', grad_fn=)\n", "3100 tensor(6.1716, device='cuda:0', grad_fn=)\n", "3200 tensor(6.1329, device='cuda:0', grad_fn=)\n", "3300 tensor(6.0073, device='cuda:0', grad_fn=)\n", "3400 tensor(6.0445, device='cuda:0', grad_fn=)\n", "3500 tensor(6.0357, device='cuda:0', grad_fn=)\n", "3600 tensor(5.9790, device='cuda:0', grad_fn=)\n", "3700 tensor(5.8562, device='cuda:0', grad_fn=)\n", "3800 tensor(5.8810, device='cuda:0', grad_fn=)\n", "3900 tensor(5.9466, device='cuda:0', grad_fn=)\n", "4000 tensor(6.0413, device='cuda:0', grad_fn=)\n", "4100 tensor(5.8879, device='cuda:0', grad_fn=)\n", "4200 tensor(5.9470, device='cuda:0', grad_fn=)\n", "4300 tensor(5.9991, device='cuda:0', grad_fn=)\n", "4400 tensor(6.1229, device='cuda:0', grad_fn=)\n", "4500 tensor(5.8253, device='cuda:0', grad_fn=)\n", "4600 tensor(5.8551, device='cuda:0', grad_fn=)\n", "4700 tensor(5.8695, device='cuda:0', grad_fn=)\n", "4800 tensor(5.8018, device='cuda:0', grad_fn=)\n", "4900 tensor(5.9809, device='cuda:0', grad_fn=)\n", "5000 tensor(5.8554, device='cuda:0', grad_fn=)\n", "5100 tensor(5.9074, device='cuda:0', grad_fn=)\n", "5200 tensor(5.8030, device='cuda:0', grad_fn=)\n", "5300 tensor(5.8432, device='cuda:0', grad_fn=)\n", "5400 tensor(5.8057, device='cuda:0', grad_fn=)\n", "5500 tensor(5.9464, device='cuda:0', grad_fn=)\n", "5600 tensor(6.0155, device='cuda:0', grad_fn=)\n", "5700 tensor(5.8322, device='cuda:0', grad_fn=)\n", "5800 tensor(5.8041, device='cuda:0', grad_fn=)\n", "5900 tensor(5.9783, device='cuda:0', grad_fn=)\n", "6000 tensor(6.0641, device='cuda:0', grad_fn=)\n", "6100 tensor(5.8326, device='cuda:0', grad_fn=)\n", "6200 tensor(5.9006, device='cuda:0', grad_fn=)\n", "6300 tensor(5.8767, device='cuda:0', grad_fn=)\n", "6400 tensor(5.8549, device='cuda:0', grad_fn=)\n", "6500 tensor(5.9623, device='cuda:0', grad_fn=)\n", "6600 tensor(5.7852, device='cuda:0', grad_fn=)\n", "6700 tensor(5.9007, device='cuda:0', grad_fn=)\n", "6800 tensor(6.0006, device='cuda:0', grad_fn=)\n", "6900 tensor(5.8717, device='cuda:0', grad_fn=)\n", "7000 tensor(5.8211, device='cuda:0', grad_fn=)\n", "7100 tensor(6.0302, device='cuda:0', grad_fn=)\n", "7200 tensor(5.8377, device='cuda:0', grad_fn=)\n", "7300 tensor(6.0008, device='cuda:0', grad_fn=)\n", "7400 tensor(5.9733, device='cuda:0', grad_fn=)\n", "7500 tensor(6.0819, device='cuda:0', grad_fn=)\n", "7600 tensor(5.8545, device='cuda:0', grad_fn=)\n", "7700 tensor(5.8242, device='cuda:0', grad_fn=)\n", "7800 tensor(5.8449, device='cuda:0', grad_fn=)\n", "7900 tensor(5.9512, device='cuda:0', grad_fn=)\n", "8000 tensor(5.6949, device='cuda:0', grad_fn=)\n", "8100 tensor(5.8212, device='cuda:0', grad_fn=)\n", "8200 tensor(6.2209, device='cuda:0', grad_fn=)\n", " Epoka 1--------------------------------------------------------\n", "8300 tensor(5.9703, device='cuda:0', grad_fn=)\n", "8400 tensor(5.8215, device='cuda:0', grad_fn=)\n", "8500 tensor(5.8680, device='cuda:0', grad_fn=)\n", "8600 tensor(5.6376, device='cuda:0', grad_fn=)\n", "8700 tensor(5.8291, device='cuda:0', grad_fn=)\n", "8800 tensor(5.8815, device='cuda:0', grad_fn=)\n", "8900 tensor(5.7486, device='cuda:0', grad_fn=)\n", "9000 tensor(5.8889, device='cuda:0', grad_fn=)\n", "9100 tensor(5.8058, device='cuda:0', grad_fn=)\n", "9200 tensor(5.8526, device='cuda:0', grad_fn=)\n", "9300 tensor(5.8363, device='cuda:0', grad_fn=)\n", "9400 tensor(5.7206, device='cuda:0', grad_fn=)\n", "9500 tensor(5.7525, device='cuda:0', grad_fn=)\n", "9600 tensor(5.8370, device='cuda:0', grad_fn=)\n", "9700 tensor(5.8589, device='cuda:0', grad_fn=)\n", "9800 tensor(5.7505, device='cuda:0', grad_fn=)\n", "9900 tensor(5.7570, device='cuda:0', grad_fn=)\n", "10000 tensor(5.9025, device='cuda:0', grad_fn=)\n", "10100 tensor(5.7193, device='cuda:0', grad_fn=)\n", "10200 tensor(5.8267, device='cuda:0', grad_fn=)\n", "10300 tensor(5.9407, device='cuda:0', grad_fn=)\n", "10400 tensor(5.8414, device='cuda:0', grad_fn=)\n", "10500 tensor(5.9946, device='cuda:0', grad_fn=)\n", "10600 tensor(5.8745, device='cuda:0', grad_fn=)\n", "10700 tensor(5.7626, device='cuda:0', grad_fn=)\n", "10800 tensor(5.7495, device='cuda:0', grad_fn=)\n", "10900 tensor(5.8720, device='cuda:0', grad_fn=)\n", "11000 tensor(5.8455, device='cuda:0', grad_fn=)\n", "11100 tensor(5.7123, device='cuda:0', grad_fn=)\n", "11200 tensor(5.7896, device='cuda:0', grad_fn=)\n", "11300 tensor(5.8969, device='cuda:0', grad_fn=)\n", "11400 tensor(5.7743, device='cuda:0', grad_fn=)\n", "11500 tensor(5.6588, device='cuda:0', grad_fn=)\n", "11600 tensor(5.8743, device='cuda:0', grad_fn=)\n", "11700 tensor(5.8964, device='cuda:0', grad_fn=)\n", "11800 tensor(5.7968, device='cuda:0', grad_fn=)\n", "11900 tensor(5.8222, device='cuda:0', grad_fn=)\n", "12000 tensor(5.7421, device='cuda:0', grad_fn=)\n", "12100 tensor(5.8565, device='cuda:0', grad_fn=)\n", "12200 tensor(5.7788, device='cuda:0', grad_fn=)\n", "12300 tensor(5.7469, device='cuda:0', grad_fn=)\n", "12400 tensor(5.8372, device='cuda:0', grad_fn=)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "12500 tensor(5.7905, device='cuda:0', grad_fn=)\n", "12600 tensor(5.8497, device='cuda:0', grad_fn=)\n", "12700 tensor(5.7814, device='cuda:0', grad_fn=)\n", "12800 tensor(5.7847, device='cuda:0', grad_fn=)\n", "12900 tensor(5.6603, device='cuda:0', grad_fn=)\n", "13000 tensor(5.7659, device='cuda:0', grad_fn=)\n", "13100 tensor(5.8337, device='cuda:0', grad_fn=)\n", "13200 tensor(5.7703, device='cuda:0', grad_fn=)\n", "13300 tensor(5.8301, device='cuda:0', grad_fn=)\n", "13400 tensor(5.6971, device='cuda:0', grad_fn=)\n", "13500 tensor(5.8216, device='cuda:0', grad_fn=)\n", "13600 tensor(5.7899, device='cuda:0', grad_fn=)\n", "13700 tensor(5.7258, device='cuda:0', grad_fn=)\n", "13800 tensor(5.9402, device='cuda:0', grad_fn=)\n", "13900 tensor(5.8674, device='cuda:0', grad_fn=)\n", "14000 tensor(5.7627, device='cuda:0', grad_fn=)\n", "14100 tensor(5.8849, device='cuda:0', grad_fn=)\n", "14200 tensor(5.7721, device='cuda:0', grad_fn=)\n", "14300 tensor(5.7737, device='cuda:0', grad_fn=)\n", "14400 tensor(5.7790, device='cuda:0', grad_fn=)\n", "14500 tensor(5.8570, device='cuda:0', grad_fn=)\n", "14600 tensor(5.8281, device='cuda:0', grad_fn=)\n", "14700 tensor(5.7613, device='cuda:0', grad_fn=)\n", "14800 tensor(5.8226, device='cuda:0', grad_fn=)\n", "14900 tensor(5.7584, device='cuda:0', grad_fn=)\n", "15000 tensor(5.7686, device='cuda:0', grad_fn=)\n", "15100 tensor(5.8094, device='cuda:0', grad_fn=)\n", "15200 tensor(5.7397, device='cuda:0', grad_fn=)\n", "15300 tensor(5.7407, device='cuda:0', grad_fn=)\n", "15400 tensor(5.5733, device='cuda:0', grad_fn=)\n", "15500 tensor(5.5254, device='cuda:0', grad_fn=)\n", "15600 tensor(5.7856, device='cuda:0', grad_fn=)\n", "15700 tensor(5.6769, device='cuda:0', grad_fn=)\n", "15800 tensor(5.5810, device='cuda:0', grad_fn=)\n", "15900 tensor(5.8195, device='cuda:0', grad_fn=)\n", "16000 tensor(5.8086, device='cuda:0', grad_fn=)\n", "16100 tensor(5.8340, device='cuda:0', grad_fn=)\n", "16200 tensor(5.8087, device='cuda:0', grad_fn=)\n", "16300 tensor(5.8688, device='cuda:0', grad_fn=)\n", "16400 tensor(5.6974, device='cuda:0', grad_fn=)\n", "16500 tensor(5.8742, device='cuda:0', grad_fn=)\n" ] } ], "source": [ "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", "model = SimpleBigramNeuralLanguageModel(vocab_size, embed_size).to(device)\n", "\n", "if(not exists('nn_model2.bin')):\n", " data = DataLoader(Dataset, batch_size=8000)\n", " optimizer = torch.optim.Adam(model.parameters())\n", " criterion = torch.nn.NLLLoss()\n", "\n", " model.train()\n", " step = 0\n", " for i in range(2):\n", " print(f\" Epoka {i}--------------------------------------------------------\")\n", " for x, y in data:\n", " x = x.to(device)\n", " y = y.to(device)\n", " optimizer.zero_grad()\n", " ypredicted = model(x)\n", " loss = criterion(torch.log(ypredicted), y)\n", " if step % 100 == 0:\n", " print(step, loss)\n", " step += 1\n", " loss.backward()\n", " optimizer.step()\n", "\n", " torch.save(model.state_dict(), 'nn_model2.bin')\n", "else:\n", " model.load_state_dict(torch.load('nn_model2.bin')) \n", "\n", "\n", "vocab = Dataset.vocab\n", "\n", "\n", "# nltk.download('punkt')\n", "def predict_word(ws):\n", " ixs = torch.tensor(vocab.forward(ws)).to(device)\n", " out = model(ixs)\n", " top = torch.topk(out[0], 8)\n", " top_indices = top.indices.tolist()\n", " top_probs = top.values.tolist()\n", " top_words = vocab.lookup_tokens(top_indices)\n", " pred_str = \"\"\n", " for word, prob in list(zip(top_words, top_probs)):\n", " pred_str += f\"{word}:{prob} \"\n", "# pred_str += f':0.01'\n", " return pred_str\n", "\n", "\n", "def word_gap_prediction(file):\n", " X_test = pd.read_csv(f'{file}/in.tsv.xz', sep='\\t', header=None, quoting=csv.QUOTE_NONE, on_bad_lines='skip', encoding=\"UTF-8\")[6]\n", " X_test = X_test.apply(clean)\n", " with open(f'{file}/out.tsv', \"w+\", encoding=\"UTF-8\") as f:\n", " for row in X_test:\n", " result = {}\n", " before = None\n", " for before in get_words_from_line(clean(str(row)), False):\n", " pass\n", " before = [before]\n", " if(len(before) < 1):\n", " pred_str = \"a:0.2 the:0.2 to:0.2 of:0.1 and:0.1 of:0.1 :0.1\"\n", " else:\n", " pred_str = predict_word(before)\n", " pred_str = pred_str.strip()\n", " f.write(pred_str + \"\\n\")\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/przemek/anaconda3/envs/env/lib/python3.9/site-packages/torch/nn/modules/container.py:141: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", " input = module(input)\n" ] } ], "source": [ "word_gap_prediction(\"dev-0/\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/przemek/anaconda3/envs/env/lib/python3.9/site-packages/torch/nn/modules/container.py:141: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", " input = module(input)\n" ] } ], "source": [ "word_gap_prediction(\"test-A/\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.9.12" } }, "nbformat": 4, "nbformat_minor": 4 }