{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Modelowanie języka – laboratoria\n", "### 3 kwietnia 2024\n", "# 4. Statystyczny model językowy – część 2" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "NR_INDEKSU = 375985" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "https://web.stanford.edu/~jurafsky/slp3/3.pdf" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class Model():\n", " \n", " def __init__(self, vocab_size, UNK_token= ''):\n", " pass\n", " \n", " def train(corpus:list) -> None:\n", " pass\n", " \n", " def predict(text: list, probs: str) -> float:\n", " pass" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def get_ppl(text: list) -> float:\n", " pass" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "text = 'Pani Ala ma kota oraz ładnego pieska i 3 chomiki'" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "text_splitted = text.split(' ')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "['Pani', 'Ala', 'ma', 'kota', 'oraz', 'ładnego', 'pieska', 'i', '3', 'chomiki']" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "text_splitted" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "text_masked = text_splitted[:4] + [''] + text_splitted[5:]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Pani',\n", " 'Ala',\n", " 'ma',\n", " 'kota',\n", " '',\n", " 'ładnego',\n", " 'pieska',\n", " 'i',\n", " '3',\n", " 'chomiki']" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "text_masked" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "trigram_model działa na ['ma', 'kota', <'MASK>']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "trigram_model.predict(['ma', 'kota']) → 'i:0.55 oraz:0.25 czarnego:0.1 :0.1'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Jak tunować parametry na zbiorze deweloperskim?\n", "\n", "- tworzymy model opisany jak przez \"klasę abstrakcyjną\" na początku notebooku. Model ma podany jako parametr konstruktora pewien parametr wygładzania np. alpha\n", "- tworzymy wiele modeli z różnymi parametrami, uczymy je i sprawdzamy na zbiorze deweloperskim, dostając np. taką tabelkę:\n", "\n", "\n", "| parametr alfa | pplHashed na dev-0|\n", "| ----------- | ----------- |\n", "| 0.0 | 404 |\n", "| 0.1 | 370 |\n", "| 0.2 | 343 |\n", "| 0.3 | 339 |\n", "| 0.4 | **320** |\n", "| 0.5 | 337 |\n", "| 0.6 | 398 |\n", "| 0.7 | 404 |\n", "| 0.8 | 432 |\n", "| 0.9 | 426 |\n", "| 1.0 | 433 |\n", "\n", "Wybieramy najlepszy parametr względem metryki. Tutaj najlepszy wynik to **320** osiągany dla parametru **alfa=0.4**. Zatem taki model oddajemy w zadaniu na gonito. \n", "\n", "Oczywiście robienie tabelki nie jest konieczne. Podobnie postępujemy, jeżeli parametrów będzie więcej niż 1. Ilość modeli do stworzenia będzie rosła wykładnioczo względem ilości parametrów. Np. jeżeli każdy parametr będzie miał 10 możliwości i chcemy przetestować 3 parametry, to mamy 10^3 możliwości. Dlatego warto wtedy ograniczać zakres, np. zamiast 10 możliwości wziąć 3 możliwości." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ZADANIE:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ZADANIE\n", "\n", "Proszę za pomocą modelu statystycznego ($n$-gramowego) stworzyć rozwiązanie dla https://gonito.csi.wmi.amu.edu.pl/challenge/challenging-america-word-gap-prediction i umieścić je na platformie Gonito\n", " \n", "Warunki zaliczenia:\n", "- wynik widoczny na platformie zarówno dla dev i dla test\n", "- wynik dla dev i test lepszy (niższy) od 1024.00\n", "- deadline do końca dnia 24.04.2024\n", "- commitując rozwiązanie proszę również umieścić rozwiązanie w pliku /run.py (czyli na szczycie katalogu). Można przekonwertować jupyter do pliku python przez File → Download as → Python. Rozwiązanie nie musi być w pythonie, może być w innym języku.\n", "- zadania wykonujemy samodzielnie\n", "- w nazwie commita podaj nr indeksu\n", "- w tagach podaj \"n-grams\" (należy zatwierdzić przecinkiem po wybraniu tagu)!\n", "\n", "Uwagi:\n", "\n", "- warto skorzystać z jakiejś metody wygładazania (plusalpha, interpolacja, Good-Turing, back-off), bez tego wynik może być bardzo kiepski\n", "- nie trzeba korzystać z całego zbioru trenującego\n", "- roziwązanie zadania to **70** punktów,\n", "- **dodatkowo:** za najlepsze rozwiązanie w grupie przyznaję **40** punktów, za drugie miejsce: **20** punktów, a za trzecie miejsce: **10** punktów\n", "- warto monitorować RAM, próbować z różnym vocab_size, można skorzystać z pythonowego Counter\n", "- warto sobie zrobić dodatkowo model unigramowy w ramach ćwiczenia" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "author": "Jakub Pokrywka", "email": "kubapok@wmi.amu.edu.pl", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "lang": "pl", "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.8.3" }, "subtitle": "0.Informacje na temat przedmiotu[ćwiczenia]", "title": "Ekstrakcja informacji", "year": "2021" }, "nbformat": 4, "nbformat_minor": 4 }