KWT-2024/lab/lab_01.ipynb

528 lines
15 KiB
Plaintext
Raw Normal View History

2024-04-13 08:20:53 +02:00
{
"cells": [
{
"cell_type": "markdown",
"id": "packed-oracle",
"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> 1. <i>Podstawowe techniki wspomagania 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": "aggregate-listing",
"metadata": {},
"source": [
"Podstawowy scenariusz - tłumacz otrzymuje **dokument** będący ciągiem **segmentów** w **języku źródłowym** . Zadaniem tłumacza jest przetłumaczenie wszystkich segmentów na **język docelowy**. Oznacza to, że został wykonany już szereg operacji technicznych, a w tym:\n",
"- przesłanie pliku do tłumaczenia\n",
"- ekstrakcja tekstu z dokumentu\n",
"- podział tekstu na segmenty.\n"
]
},
{
"cell_type": "markdown",
"id": "allied-gasoline",
"metadata": {},
"source": [
"Tłumacz tłumaczy jeden segment na raz. Widzi kilka poprzednich oraz kilka następnych segmentów, jednak jego uwaga powinna skupiać się na aktywnym, aktualnie tłumaczonym segmencie. Nie oznacza to jednak, że tłumacz jest pozbawiony pomocy. Ma możliwość korzystania z różnorakich technik **komputerowego wspomagania tłumaczenia**."
]
},
{
"cell_type": "markdown",
"id": "golden-turkish",
"metadata": {},
"source": [
"# Pamięć tłumaczeń"
]
},
{
"cell_type": "markdown",
"id": "retired-burke",
"metadata": {},
"source": [
"Najbardziej podstawową techniką wspomagania tłumaczenia jest **pamięć tłumaczeń**. Pamięć tłumaczeń stanowi zbiór wcześniej przetłumaczonych zdań:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "narrow-romantic",
"metadata": {},
"outputs": [],
"source": [
"translation_memory = [('Wciśnij przycisk Enter', 'Press the ENTER button'), \n",
" ('Sprawdź ustawienia sieciowe', 'Check the network settings')]"
]
},
{
"cell_type": "markdown",
"id": "tender-drunk",
"metadata": {},
"source": [
"Kiedy tłumacz pracuje nad kolejnym zdaniem, program automatycznie przeszukuje pamięć tłumaczeń. Jeśli okaże się, że zdanie zostało już przetłumaczone, automatycznie pobierane jest jego tłumaczenie z pamięci:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "indonesian-electron",
"metadata": {},
"outputs": [],
"source": [
"def tm_lookup(sentence):\n",
" return [entry[1] for entry in translation_memory if entry[0] == sentence]"
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 5,
2024-04-13 08:20:53 +02:00
"id": "compact-trinidad",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['Press the ENTER button']"
]
},
2024-04-15 21:46:15 +02:00
"execution_count": 5,
2024-04-13 08:20:53 +02:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tm_lookup('Wciśnij przycisk Enter')"
]
},
{
"cell_type": "markdown",
"id": "legislative-portsmouth",
"metadata": {},
"source": [
"W takim przypadku tłumaczenie z pamięci jest najczęściej automatycznie wstawiane jako tłumaczenie segmentu źródłowego i tłumacz nie musi się już nim martwić (co więcej, nie dostaje za takie tłumaczenie zapłaty...)"
]
},
{
"cell_type": "markdown",
"id": "prepared-entry",
"metadata": {},
"source": [
"Tłumacz pracuje dalej i każde wykonane przez niego tłumaczenie trafia do pamięci tłumaczeń (oczywiście dzieje się to automatycznie):"
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 6,
2024-04-13 08:20:53 +02:00
"id": "exposed-daniel",
"metadata": {},
"outputs": [],
"source": [
"translation_memory.append(('Drukarka jest wyłączona', 'The printer is switched off'))\n",
"translation_memory.append(('Wymagane ponowne uruchomienie komputera', 'System restart required'))\n",
"translation_memory.append(('Wciśnij przycisk Enter', 'Press the ENTER key'))"
]
},
{
"cell_type": "markdown",
"id": "alert-cancellation",
"metadata": {},
"source": [
"Z całą pewnością tłumacz stara się przełożyć jakąś komputerową instrukcję. Po wielu godzinach pracy trafia na znane sobie zdanie \"Wciśnij przycisk Enter\". Następuje przeszukanie pamięci tłumaczeń:"
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 7,
2024-04-13 08:20:53 +02:00
"id": "serial-velvet",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['Press the ENTER button', 'Press the ENTER key']"
]
},
2024-04-15 21:46:15 +02:00
"execution_count": 7,
2024-04-13 08:20:53 +02:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tm_lookup('Wciśnij przycisk Enter')"
]
},
{
"cell_type": "markdown",
"id": "meaning-breathing",
"metadata": {},
"source": [
"Jak widać, mamy w pamięci dwa tłumaczenia tego zdania. To tłumacz musi zadecydować, które tłumaczenie wybrać. O metodach wspomagania decyzji tłumacza w takich przypadkach będziemy jeszcze mówić."
]
},
{
"cell_type": "markdown",
"id": "miniature-interim",
"metadata": {},
"source": [
"Przeanalizujmy teraz następujący przypadek: do tłumaczenia trafia zdanie: \"Wciśnij przycisk ENTER\":"
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 11,
2024-04-13 08:20:53 +02:00
"id": "every-gibson",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2024-04-15 21:46:15 +02:00
"['Press the ENTER button', 'Press the ENTER key']"
2024-04-13 08:20:53 +02:00
]
},
2024-04-15 21:46:15 +02:00
"execution_count": 11,
2024-04-13 08:20:53 +02:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tm_lookup('Wciśnij przycisk ENTER')"
]
},
{
"cell_type": "markdown",
"id": "restricted-oregon",
"metadata": {},
"source": [
"Tutaj tłumacz nie ma szczęścia - restrykcyjny mechanizm wyszukiwania nie podaje mu podpowiedzi. Możemy jednak sprawić, żeby przeszukiwanie pamięci tłumaczeń nie brało pod uwagę wielkości liter."
]
},
{
"cell_type": "markdown",
"id": "inclusive-bargain",
"metadata": {},
"source": [
"### Ćwiczenie 1: zmodyfikuj funkcję tm_lookup w taki sposób, aby nie brała pod uwagę wielkości liter. Przetestuj zmodyfikowaną funkcję."
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 9,
2024-04-13 08:20:53 +02:00
"id": "protected-rings",
"metadata": {},
"outputs": [],
"source": [
"def tm_lookup(sentence):\n",
2024-04-15 21:46:15 +02:00
" return [entry[1] for entry in translation_memory if entry[0].lower() == sentence.lower()]"
2024-04-13 08:20:53 +02:00
]
},
{
"cell_type": "markdown",
"id": "dress-plymouth",
"metadata": {},
"source": [
"Nasz tłumacz powinien być teraz zadowolony. Jednak w dalszej części dokumentu pojawiło się inne podobne zdanie, dla którego nie było tłumaczenia:"
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 13,
2024-04-13 08:20:53 +02:00
"id": "severe-alloy",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2024-04-15 21:46:15 +02:00
"['Press the ENTER button', 'Press the ENTER key']"
2024-04-13 08:20:53 +02:00
]
},
2024-04-15 21:46:15 +02:00
"execution_count": 13,
2024-04-13 08:20:53 +02:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tm_lookup('Wciśnij przycisk [ENTER]')"
]
},
{
"cell_type": "markdown",
"id": "choice-committee",
"metadata": {},
"source": [
"### Ćwiczenie 2: zmodyfikuj funkcję tm_lookup w taki sposób, aby nie brała pod uwagę znaków interpunkcyjnych. Rada - zdefiniuj funkcję sentence_similar."
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 12,
2024-04-13 08:20:53 +02:00
"id": "structural-diesel",
"metadata": {},
"outputs": [],
"source": [
2024-04-15 21:46:15 +02:00
"import re\n",
"\n",
"def remove_punctuation(sentence):\n",
" return re.sub(r'[^\\w\\s]', '', sentence)\n",
"\n",
"\n",
2024-04-13 08:20:53 +02:00
"def tm_lookup(sentence):\n",
2024-04-15 21:46:15 +02:00
" return [entry[1] for entry in translation_memory\n",
" if entry[0].lower() == remove_punctuation(sentence.lower())]"
2024-04-13 08:20:53 +02:00
]
},
{
"cell_type": "markdown",
"id": "physical-distribution",
"metadata": {},
"source": [
"Praca tłumacza oczywiście trwa nadal. Spróbujmy teraz zaradzić następującej sytuacji - tłumacz otrzymuje do tłumaczenia następujące zdanie:"
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 27,
2024-04-13 08:20:53 +02:00
"id": "brief-senegal",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2024-04-15 21:46:15 +02:00
"['System restart required']"
2024-04-13 08:20:53 +02:00
]
},
2024-04-15 21:46:15 +02:00
"execution_count": 27,
2024-04-13 08:20:53 +02:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tm_lookup('Wymagane ponowne uruchomienie maszyny')"
]
},
{
"cell_type": "markdown",
"id": "guided-tutorial",
"metadata": {},
"source": [
"Znów nie otrzymuje od nas podpowiedzi i znów nic w tym dziwnego - w pamięci tłumaczeń nie znajduje się takie zdanie. Jest jednak zdanie podobne, różniące się jednym słowem."
]
},
{
"cell_type": "markdown",
"id": "laughing-preview",
"metadata": {},
"source": [
"### Ćwiczenie 3: zmodyfikuj funkcję tm_lookup w taki sposób, aby zwracała podpowiedzi także wtedy, gdy zdania różnią się tylko jednym słowem."
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 26,
2024-04-13 08:20:53 +02:00
"id": "mathematical-customs",
"metadata": {},
"outputs": [],
"source": [
2024-04-15 21:46:15 +02:00
"import re\n",
"\n",
"def remove_punctuation(sentence):\n",
" return re.sub(r'[^\\w\\s]', '', sentence)\n",
"\n",
"\n",
2024-04-13 08:20:53 +02:00
"def tm_lookup(sentence):\n",
2024-04-15 21:46:15 +02:00
" values = []\n",
" for entry in translation_memory:\n",
" key = set(entry[0].lower().split())\n",
" mod_sentence = set(remove_punctuation(sentence.lower()).split())\n",
" remainder = list(key - mod_sentence)\n",
" if len(remainder) <= 1:\n",
" values.append(entry[1])\n",
" return values"
2024-04-13 08:20:53 +02:00
]
},
{
"cell_type": "markdown",
"id": "meaningful-virus",
"metadata": {},
"source": [
"# Słownik kontekstowy / glosariusz"
]
},
{
"cell_type": "markdown",
"id": "early-variety",
"metadata": {},
"source": [
"Inną podstawową pomocą dla naszego tłumacza jest słownik, zwany także glosariuszem. Stanowi on zbiór terminów w języku źródłowym wraz z ich tłumaczeniami na język docelowy:"
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 42,
2024-04-13 08:20:53 +02:00
"id": "humanitarian-wrong",
"metadata": {},
"outputs": [],
"source": [
"glossary = [('komputer', 'computer'), ('przycisk', 'button'), ('drukarka', 'printer')]"
]
},
{
"cell_type": "markdown",
"id": "minimal-moral",
"metadata": {},
"source": [
"Podczas tłumaczenia, glosariusz jest przeszukiwany w celu znalezienia aktualnie tłumaczonych słów."
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 43,
2024-04-13 08:20:53 +02:00
"id": "located-perception",
"metadata": {},
"outputs": [],
"source": [
"def glossary_lookup(sentence):\n",
" sentence_words = sentence.split()\n",
" return [entry for entry in glossary if entry[0] in sentence_words]"
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 44,
"id": "3437b88b",
"metadata": {},
"outputs": [],
"source": [
"glossary = [('komputer', 'computer'), ('przycisk', 'button'), ('drukarka', 'printer')]\n",
"\n",
"def glossary_lookup(sentence):\n",
" sentence_words = sentence.split()\n",
" return [entry for entry in glossary if entry[0] in sentence_words]"
]
},
{
"cell_type": "code",
"execution_count": 51,
2024-04-13 08:20:53 +02:00
"id": "advised-casting",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2024-04-15 21:46:15 +02:00
"[('drukarka', 'printer'), ('przycisk', 'button')]"
2024-04-13 08:20:53 +02:00
]
},
2024-04-15 21:46:15 +02:00
"execution_count": 51,
2024-04-13 08:20:53 +02:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"glossary_lookup('Każda drukarka posiada przycisk wznowienia drukowania')"
]
},
{
"cell_type": "markdown",
"id": "blessed-gentleman",
"metadata": {},
"source": [
"### Ćwiczenie 4: (tym razem teoretyczne) Jaka jest złożoność obliczeniowa czasowa przedstawionego powyżej algorytmu względem liczby haseł w słowniku (n) oraz liczby słów w zdaniu do tłumaczenia (m)?"
]
},
{
"cell_type": "markdown",
"id": "defensive-fifteen",
"metadata": {},
"source": [
2024-04-15 21:46:15 +02:00
"Odpowiedź: Operacja split w pierwszej linijce funkcji moze zostac uznana za stala. Biorac pod uwage ze lista krotek zawierajaca glosariusz musi byc przejrzana za kazdym razem cala, jak i caly string skomplikowaność obliczen bedzie wynosic O(n*m)."
2024-04-13 08:20:53 +02:00
]
},
{
"cell_type": "markdown",
"id": "objective-matthew",
"metadata": {},
"source": [
"### Ćwiczenie 5: zmodyfikuj funkcję glossary_lookup w taki sposób, aby nie brała pod uwagę wielkości liter."
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 48,
2024-04-13 08:20:53 +02:00
"id": "original-tunisia",
"metadata": {},
"outputs": [],
"source": [
"def glossary_lookup(sentence):\n",
2024-04-15 21:46:15 +02:00
" sentence_words = [ element.lower() for element in sentence.split()]\n",
" return [entry for entry in glossary if entry[0].lower() in sentence_words]"
2024-04-13 08:20:53 +02:00
]
},
{
"cell_type": "markdown",
"id": "injured-hormone",
"metadata": {},
"source": [
"### Ćwiczenie 6: zmodyfikuj funkcję glossary_lookup w taki sposób, aby jej złożoność obliczeniowa była mniejsza."
]
},
{
"cell_type": "code",
2024-04-15 21:46:15 +02:00
"execution_count": 49,
"id": "f69a873a",
"metadata": {},
"outputs": [],
"source": [
"glossary = [('komputer', 'computer'), ('przycisk', 'button'), ('drukarka', 'printer')]\n",
"glossary = { k:v for k,v in glossary}\n",
"translated_words = list(glossary.keys())"
]
},
{
"cell_type": "code",
"execution_count": 50,
2024-04-13 08:20:53 +02:00
"id": "adolescent-semiconductor",
"metadata": {},
"outputs": [],
"source": [
"def glossary_lookup(sentence):\n",
2024-04-15 21:46:15 +02:00
" words = sentence.split()\n",
" \n",
" return [(word, glossary[word]) for word in words if word in translated_words]"
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"
},
"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",
2024-04-15 21:46:15 +02:00
"version": "3.11.0"
2024-04-13 08:20:53 +02:00
},
"subtitle": "1. Podstawowe techniki wspomagania tłumaczenia",
"title": "Komputerowe wspomaganie tłumaczenia",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 5
}