KWT-2024/lab/lab_08.ipynb

385 lines
47 KiB
Plaintext
Raw Normal View History

2024-04-13 08:20:53 +02:00
{
"cells": [
{
"cell_type": "markdown",
"id": "improved-register",
"metadata": {},
"source": [
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Komputerowe wspomaganie tłumaczenia </h1>\n",
"<h2> 8. <i>Wykorzystanie tłumaczenia automatycznego we wspomaganiu tłumaczenia</i> [laboratoria]</h2> \n",
"<h3>Rafał Jaworski (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"id": "hungarian-davis",
"metadata": {},
"source": [
"W dzisiejszych czasach, niezwykle ważną techniką wspomagania tłumaczenia jest użycie tłumaczenia maszynowego. Tekst źródłowy do tłumaczenia jest najpierw tłumaczony całkowicie autommatycznie, a następnie tłumacz ludzki dokonuje korekty wyniku. Technologia tłumaczenia maszynowego jest już na tyle dojrzała, że oferuje bardzo wysoką jakość wyników. Coraz częstsze stają się scenariusze, w których ludzka korekta to niemal całkowicie machinalne (sic!) zatwierdzanie wyników tłumaczenia maszynowego. Na dzisiejszych zajęciach poznamy techniki ewaluacji tłumaczenia maszynowego oraz sprawdzania jego przydatności w procesie wspomagania tłumaczenia ludzkiego."
]
},
{
"cell_type": "markdown",
"id": "posted-commons",
"metadata": {},
"source": [
"Jakość tłumaczenia maszynowego możemy oceniać na dwóch niezależnych płaszczyznach: dokładność i płynność. Płynność jest subiektywnie odbieranym odczuciem, że czytany tekst jest napisany językiem naturalnym i zrozumiałym. Systemy tłumaczenia maszynowego oparte na uczeniu głębokim z wykorzystaniem sieci neuronowych osiągają duży stopień płynności tłumaczenia. Niestety jednak ich dokładność nie zawsze jest równie wysoka."
]
},
{
"cell_type": "markdown",
"id": "referenced-implement",
"metadata": {},
"source": [
"Dokładność tłumaczenia maszynowego jest parametrem, który łatwiej zmierzyć. Wartość takich pomiarów daje obraz tego, jaka jest faktyczna jakość tłumaczenia maszynowego i jaka jest jego potencjalna przydatność we wspomaganiu tłumaczenia."
]
},
{
"cell_type": "markdown",
"id": "disturbed-january",
"metadata": {},
"source": [
"Najczęściej stosowaną techniką oceny tłumaczenia maszynowego jest ocena BLEU. Do obliczenia tej oceny potrzebny jest wynik tłumaczenia maszynowego oraz referencyjne tłumaczenie ludzkie wysokiej jakości."
]
},
{
"cell_type": "markdown",
"id": "dental-combination",
"metadata": {},
"source": [
"### Ćwiczenie 1: Zaimplementuj program do obliczania oceny BLEU dla korpusu w folderze data. Użyj implementacji BLEU z pakietu nltk. Dodatkowe wymaganie techniczne - napisz program tak, aby nie musiał rozpakwowywać pliku zip z korpusem na dysku."
]
},
{
"cell_type": "code",
"execution_count": 1,
2024-04-14 22:21:17 +02:00
"id": "d83ccf58",
"metadata": {},
"outputs": [],
"source": [
"import warnings\n",
"warnings.filterwarnings(\"ignore\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "a72875eb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(119008, 117487)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import zipfile\n",
"\n",
"archive = zipfile.ZipFile('./data/corpus_corrected.zip', 'r')\n",
"\n",
"n_samples = -1\n",
"original_text = archive.read('corpus_en.txt').decode('utf-8')[:n_samples]\n",
"reference_text = archive.read('corpus_de_human.txt').decode('utf-8')[:n_samples]\n",
"candidate_text = archive.read('corpus_de_nmt.txt').decode('utf-8')[:n_samples]\n",
"\n",
"len(reference_text), len(candidate_text)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "05a447be",
2024-04-13 08:20:53 +02:00
"metadata": {},
"outputs": [],
2024-04-14 22:21:17 +02:00
"source": [
"from nltk.translate.bleu_score import sentence_bleu"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "moving-clothing",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3.088188515329241e-232"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
2024-04-13 08:20:53 +02:00
"source": [
"def calculate_bleu():\n",
2024-04-14 22:21:17 +02:00
" return sentence_bleu(reference_text, candidate_text)\n",
"\n",
"calculate_bleu()"
2024-04-13 08:20:53 +02:00
]
},
{
"cell_type": "markdown",
"id": "jewish-ethics",
"metadata": {},
"source": [
"### Ćwiczenie 2: Oblicz wartość bleu na różnych fragmentach przykładowego korpusu (np. na pierwszych 100 zdaniach, zdaniach 500-600). Czy w jakimś fragmencie korpusu jakość tłumaczenia znacząco odbiega od średniej?"
]
},
{
"cell_type": "code",
2024-04-14 22:21:17 +02:00
"execution_count": 5,
2024-04-13 08:20:53 +02:00
"id": "lasting-rolling",
"metadata": {},
2024-04-14 22:21:17 +02:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2024-04-13 08:20:53 +02:00
"source": [
2024-04-14 22:21:17 +02:00
"import matplotlib.pyplot as plt\n",
"\n",
2024-04-13 08:20:53 +02:00
"def analyze_bleu():\n",
2024-04-14 22:21:17 +02:00
" reference_sentences = reference_text.split('\\n')\n",
" candidate_sentences = candidate_text.split('\\n')\n",
"\n",
" # Calculate BLEU scores for every group of 100 sentences\n",
" bleu_scores = []\n",
" for i in range(0, len(reference_sentences), 100):\n",
" reference_batch = reference_sentences[i:i+100]\n",
" candidate_batch = candidate_sentences[i:i+100]\n",
" bleu_scores.append(sentence_bleu([reference_batch], candidate_batch))\n",
"\n",
" plt.plot(bleu_scores)\n",
" plt.ylabel('BLEU score')\n",
" plt.xlabel('Batch')\n",
" plt.show()\n",
"\n",
"analyze_bleu()"
2024-04-13 08:20:53 +02:00
]
},
{
"cell_type": "markdown",
"id": "listed-bikini",
"metadata": {},
"source": [
"Inną metodą oceny jakości tłumaczenia maszynowego jest parametr WER - Word Error Rate. Definiuje się on w następujący sposób:\n",
"\n",
"$WER = \\frac{S+D+I}{N}=\\frac{S+D+I}{S+D+C}$\n",
"\n",
"gdzie:\n",
" * S - liczba substytucji (słów)\n",
" * D - liczba usunięć\n",
" * I - liczba wstawień\n",
" * C - liczba poprawnych śłów\n",
" * N - liczba słów w tłumaczeniu referencyjnym (N=S+D+C)"
]
},
{
"cell_type": "markdown",
"id": "conscious-cookbook",
"metadata": {},
"source": [
"Miara ta jest zwykle używana w do oceny systemów automatycznego rozpoznawania mowy, jednak w kontekście wspomagania tłumaczenia może być rozumiana jako wielkość nakładu pracy tłumacza nad poprawieniem tłumaczenia maszynowego."
]
},
{
"cell_type": "markdown",
"id": "split-palace",
"metadata": {},
"source": [
"### Ćwiczenie 3: Oblicz wartość WER dla przykładowego korpusu. Skorzystaj z gotowej implementacji WER."
]
},
{
"cell_type": "code",
2024-04-14 22:21:17 +02:00
"execution_count": 6,
2024-04-13 08:20:53 +02:00
"id": "occupied-swing",
"metadata": {},
2024-04-14 22:21:17 +02:00
"outputs": [
{
"data": {
"text/plain": [
"0.16925791156687617"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
2024-04-13 08:20:53 +02:00
"source": [
2024-04-14 22:21:17 +02:00
"from jiwer import wer\n",
"\n",
2024-04-13 08:20:53 +02:00
"def calculate_wer():\n",
2024-04-14 22:21:17 +02:00
" return wer(reference_text, candidate_text)\n",
"\n",
"calculate_wer()"
2024-04-13 08:20:53 +02:00
]
},
{
"cell_type": "markdown",
"id": "stretch-wound",
"metadata": {},
"source": [
"Poza wymienionymi powyżej, stosować można jeszcze inne miary oparte na porównywaniu tłumaczenia maszynowego z ludzkim. Przypomnijmy sobie jedną, którą stosowaliśmy wcześniej."
]
},
{
"cell_type": "markdown",
"id": "abstract-wilderness",
"metadata": {},
"source": [
"### Ćwiczenie 4: Oblicz średnią wartość dystansu Levenshteina pomiędzy zdaniami przetłumaczonymi automatycznie oraz przez człowieka. Użyj implementacji z ćwiczeń nr 2."
]
},
{
"cell_type": "code",
2024-04-14 22:21:17 +02:00
"execution_count": 7,
2024-04-13 08:20:53 +02:00
"id": "immediate-element",
"metadata": {},
2024-04-14 22:21:17 +02:00
"outputs": [
{
"data": {
"text/plain": [
"14645"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
2024-04-13 08:20:53 +02:00
"source": [
2024-04-14 22:21:17 +02:00
"from Levenshtein import distance\n",
"\n",
2024-04-13 08:20:53 +02:00
"def calculate_levenshtein():\n",
2024-04-14 22:21:17 +02:00
" return distance(reference_text, candidate_text)\n",
"\n",
"calculate_levenshtein()"
2024-04-13 08:20:53 +02:00
]
},
{
"cell_type": "markdown",
"id": "filled-burton",
"metadata": {},
"source": [
"A teraz sprawdźmy coś jeszcze. W danych przykładowego korpusu znajduje się także angielski tekst źródłowy. Teoretycznie, dobre tłumaczenie niemieckie powinno zawierać jak najwięcej słów z angielskiego źródła. Wykonajmy najstępujący eksperyment:"
]
},
{
"cell_type": "markdown",
"id": "grateful-recruitment",
"metadata": {},
"source": [
"### Ćwiczenie 5: Dla każdej trójki zdań z korpusu przykładowego wykonaj następujące kroki:\n",
" * Przetłumacz każde angielskie słowo na niemiecki przy użyciu modułu PyDictionary.\n",
" * Sprawdź, które z niemieckich tłumaczeń zawiera więcej spośród tych przetłumaczonych słów - automatyczne, czy ludzkie.\n",
"Następnie wypisz statystyki zbiorcze. Które tłumaczenie zawiera więcej słownikowych tłumaczeń słów ze źródła?"
]
},
{
"cell_type": "code",
2024-04-14 22:21:17 +02:00
"execution_count": null,
2024-04-13 08:20:53 +02:00
"id": "descending-easter",
"metadata": {},
"outputs": [],
"source": [
2024-04-14 22:21:17 +02:00
"from PyDictionary import PyDictionary\n",
"\n",
2024-04-13 08:20:53 +02:00
"def analyze_translations():\n",
2024-04-14 22:21:17 +02:00
" dictionary=PyDictionary()\n",
" english_words = set(original_text.split())\n",
" \n",
" german_words = set()\n",
" for word in english_words:\n",
" try:\n",
" german_word = dictionary.translate(word, 'de')\n",
" german_words.add(german_word)\n",
" except:\n",
" pass\n",
"\n",
" reference_words = set(reference_text.split())\n",
" candidate_words = set(candidate_text.split())\n",
"\n",
" manual_translations, automatic_translations = 0, 0\n",
" for word in german_words:\n",
" if word in candidate_words:\n",
" automatic_translations += 1 \n",
" if word in reference_words:\n",
" manual_translations += 1\n",
"\n",
" return manual_translations, automatic_translations\n",
"\n",
"manual_translations, automatic_translations = analyze_translations()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "3d7a9458",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Manual translations: 134\n",
"Automatic translations: 122\n"
]
}
],
"source": [
"print(f\"Manual translations: {manual_translations}\")\n",
"print(f\"Automatic translations: {automatic_translations}\")"
2024-04-13 08:20:53 +02:00
]
}
],
"metadata": {
"author": "Rafał Jaworski",
"email": "rjawor@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
2024-04-14 22:21:17 +02:00
"lang": "pl",
2024-04-13 08:20:53 +02:00
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2024-04-14 22:21:17 +02:00
"version": "3.10.14"
},
"subtitle": "8. Wykorzystanie tłumaczenia automatycznego we wspomaganiu tłumaczenia",
"title": "Komputerowe wspomaganie tłumaczenia",
"year": "2021"
2024-04-13 08:20:53 +02:00
},
"nbformat": 4,
"nbformat_minor": 5
}