forked from bfijalkowski/KWT-2024
288 lines
12 KiB
Plaintext
288 lines
12 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "expanded-entrance",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Komputerowe wspomaganie tłumaczenia"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "atlantic-greenhouse",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Zajęcia 11 - urównoleglanie"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "hungarian-davis",
|
|
"metadata": {},
|
|
"source": [
|
|
"Na poprzednich zajęciach poznaliśmy techniki pozyskiwania tekstu z Internetu. Jeśli uda nam się w ten sposób pozyskać tekst w jednym języku oraz jego tłumaczenie na inny język, jesteśmy tylko o krok od uzyskania najbardziej przydatnego zasobu z punktu widzenia wspomagania tłumaczenia - pamięci tłumaczeń. Krokiem tym jest automatyczne urównoleglanie tekstu."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "bronze-removal",
|
|
"metadata": {},
|
|
"source": [
|
|
"Automatyczne urównoleglanie tekstu składa się z dwóch kroków:\n",
|
|
"1. Podziału tekstu źródłowego oraz docelowego na zdania.\n",
|
|
"2. Dopasowaniu zdań źródłowych do docelowych."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "junior-works",
|
|
"metadata": {},
|
|
"source": [
|
|
"Zdania, o których mowa w punkcie 1., powinniśmy rozumieć jako segmenty, tj. niekoniecznie kompletne zdania w sensie gramatycznym. Standardowym sposobem podziału tekstu na segmenty jest dzielenie po znaku nowej linii lub zaraz po kropce, o ile jest ona częścią sekwencji: \".[spacja][Wielka litera]\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "legitimate-corrections",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Ćwiczenie 1: Zaimplementuj podstawowy algorytm segmentacji tekstu. Użyj odpowiedniego wyrażenia regularnego, łapiącego wielkie litery w dowolnym języku, np. \"Ż\" (użyj klasy unikodowej). Zwróć listę segmentów."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "german-dispute",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def sentence_split(text):\n",
|
|
" segments = []\n",
|
|
" start = 0\n",
|
|
" i = 0\n",
|
|
" n = len(text)\n",
|
|
" while i < n:\n",
|
|
" if text[i] == ' ' and i + 1 < n and text[i + 1].isupper():\n",
|
|
" segments.append(text[start:i])\n",
|
|
" start = i + 1\n",
|
|
" i += 1\n",
|
|
" segments.append(text[start:])\n",
|
|
" return segments\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "adbae35b",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"['Dzien dobry,', 'CZy ten', 'TEKST zostanie poprawnie podzielony?']"
|
|
]
|
|
},
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"text = \"Dzien dobry, CZy ten TEKST zostanie poprawnie podzielony?\"\n",
|
|
"sentence_split(text)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "continued-assessment",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Ćwiczenie 2: Uruchom powyższy algorytm na treści wybranej przez siebie strony internetowej (do ściągnięcia treści strony wykorzystaj kod z laboratoriów nr 7). Zidentyfikuj co najmniej dwa wyjątki od ogólnej reguły podziału na segmenty i ulepsz algorytm."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"id": "064c2343",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import re\n",
|
|
"import requests\n",
|
|
"from bs4 import BeautifulSoup"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"id": "guilty-morocco",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def fetch_page_content(url):\n",
|
|
" response = requests.get(url)\n",
|
|
" soup = BeautifulSoup(response.content, 'html.parser')\n",
|
|
"\n",
|
|
" for unwanted in soup([\"script\", \"style\"]):\n",
|
|
" unwanted.decompose()\n",
|
|
"\n",
|
|
" page_text = soup.get_text()\n",
|
|
"\n",
|
|
" clean_text = re.sub(r\"\\s+\", \" \", page_text)\n",
|
|
" return clean_text"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"id": "7a2d689a",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"['Toki', 'Meaning |', 'New', 'Zealand', 'Pounamu', 'Meanings &', 'Designs |', 'Mountain', 'Jade', 'NZToki (Adze)Worn as a symbol of strength, the', 'Toki carries with it deep meaning and symbolism associated with mana, reverence, strength and bravery.The', 'Meaning of the', 'TokiTraditionally, a', 'Toki (Adze) was an everyday tool used by', 'Māori for different woodworking tasks, such as felling trees, hollowing out waka (canoes), and constructing houses and wharenui (Māori communal houses).', 'Using abrasion techniques,', 'Māori would painstakingly carve an adze from pounamu and lash it to a wooden handle using natural materials such as harakeke (flax).', 'It was then swung powerfully to cut wood.Māori were skilful woodworkers, and as they did not have metal, pounamu served well as a woodcutting tool because of its exceptional toughness and ability to retain a hard, sharp cutting edge.', 'For this reason, the', 'Toki holds great significance and meaning in', 'Māori culture as a powerful symbol of strength and power.DiscoverToki (Adze)', 'NecklacesShop', 'All', 'TokiA', 'Toki', 'Poutangata is an adze worked from pounamu and lashed to an elaborately carved wooden handle, and adorned with the feathers of significant native birds.', 'Mana and', 'Life', 'ForceMauri is considered to be a life force or essence - it is a spark or the essential vitality of a being.', 'Māori hold that all people and all things have mauri.', 'Many believe that as pounamu has a spiritual value, it can take on the mauri of the person wielding or wearing the stone, such as when', 'Māori chiefs with great mana (prestige) wielded the', 'Toki', 'Poutangata.', 'As the stone passes down through generations of whanau (family), it continues to carry the spirit, energy, and strength of previous owners, growing in mana and honour with its rich histories and stories.', 'A', 'Symbol of', 'StrengthToki are worn today as a symbol of strength, with this association linking back to when pounamu adze were powerful woodcutting tools, and wielded by fearsome', 'Māori warriors.', 'They symbolise courage, determination, success, and bravery, and their significance is steeped in', 'Māori tradition and meaning.Shop', 'All', 'TokiWatch how we carve', 'TokiMorepounamu meanings & designsTwist (Pikorua)Koru (spiral)Hei', 'Matau (hook)HeartManaiaHei', 'TikiWe', 'Ship', 'WorldwidePremium', 'Gift', 'WrappingFree', 'Shipping*We', 'Ship', 'WorldwidePremium', 'Gift', 'WrappingFree', 'Shipping*ShopLearnToursFind', 'Us$NZD$AUD£GBP$CAD$USD€EUR¥JPYFollow usStay in the know on new releases, special offers, and more.Your email addressSupportContactFAQsShippingGift', 'WrappingReturnsCarePrivacy', 'PolicyTerms &', 'ConditionsWarrantyGift', 'CardsReviewsAboutOur', 'StorySustainabilityLearn about', 'JadeNewsletterAuckland', 'StoreRotorua', 'StoreOur', 'ToursTen', 'Reasons to', 'GiftNeed', 'Help?+64 7 349 3968customercare@mountainjade.co.nz1288', 'Fenton', 'Street,', 'RotoruaNew', 'ZealandSupportAboutNeed', 'Help?Website by']\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"text = fetch_page_content('https://www.mountainjade.co.nz/pages/greenstone-meanings-and-designs/toki-adze')\n",
|
|
"split = sentence_split(text)\n",
|
|
"print(split)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "experimental-recipient",
|
|
"metadata": {},
|
|
"source": [
|
|
"Po podziale tekstu na segmenty po stronie źródłowej oraz docelowej, możemy przystąpić do kroku drugiego - dopasowania segmentów. Głównym wyzwaniem tego kroku jest fakt, iż po stronie źródłowej może być inna liczba segmentów, niż po stronie docelowej. Takie rozbieżności są bardzo częste, a wynikają między innymi z:\n",
|
|
"* tłumaczenia jednego zdania źródłowego przy użyciu więcej niż jednego zdania\n",
|
|
"* tłumaczenia więcej niż jednego zdania źródłowego przy użyciu jednego zdania\n",
|
|
"* pominięcia zdania podczas tłumaczenia\n",
|
|
"* rozbieżności pomiędzy wersjami tekstu źródłowego i docelowego (np. tekst źródłowy mógł być modyfikowany po przetłumaczeniu i tłumaczenie nie zostało zaktualizowane)\n",
|
|
"* przetłumaczenia tekstu źródłowego tylko częściowo"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "australian-hundred",
|
|
"metadata": {},
|
|
"source": [
|
|
"Problemy te rozwiązwyane są na różne sposoby. Najpopularniejszym programem do przeprowadzania urównoleglania jest [Hunalign](https://github.com/danielvarga/hunalign). Wejściem do programu są dwa pliki, zawierające po jednym segmencie w linii. Wyjściem - plik urównoleglony w wewnętrznym formacie hunaligna."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "russian-chambers",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Ćwiczenie 3: Odnajdź dowolną stronę, która jest dostępna w wielu językach. Pobierz z tej strony tekst oryginalny (tylko ze strony głównej) oraz przetłumaczony na dowolny inny język. Przy użyciu Pythona przygotuj pliki dla Hunaligna i uruchom go."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "controlled-pacific",
|
|
"metadata": {},
|
|
"source": [
|
|
"Wyjściem z Hunaligna jest plik w specjalnym formacie Hunaligna. Problem jednak w tym, że niestety nie można go w prosty sposób zaimportować do jakiegokolwiek narzędzia typu CAT. Potrzebna jest konwersja do któregoś z bardziej popularnych formatów, np. XLIFF."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "divided-chain",
|
|
"metadata": {},
|
|
"source": [
|
|
"XLIFF jest formatem do przechowywania pamięci tłumaczeń, który opiera się na XML-u. Przykładowy plik XLIFF wygląda następująco:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "raw",
|
|
"id": "appropriate-timber",
|
|
"metadata": {},
|
|
"source": [
|
|
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
|
|
"<xliff xmlns=\"urn:oasis:names:tc:xliff:document:1.2\" version=\"1.2\">\n",
|
|
" <file datatype=\"plaintext\" original=\"self\" source-language=\"en\" target-language=\"es\">\n",
|
|
" <header>\n",
|
|
" <sxmd:metadata xmlns:sxmd=\"urn:x-sap:mlt:xliff12:metadata:1.0\" xmlns=\"urn:x-sap:mlt:tsmetadata:1.0\">\n",
|
|
" <object-name>sample</object-name>\n",
|
|
" <collection>KWT</collection>\n",
|
|
" <domain>KWT</domain>\n",
|
|
" <developer>123</developer>\n",
|
|
" <description>sample XLIFF file</description>\n",
|
|
" </sxmd:metadata>\n",
|
|
" </header>\n",
|
|
" <body>\n",
|
|
" <trans-unit>\n",
|
|
" <source>Hello world!</source>\n",
|
|
" <target>Hola mundo!</target>\n",
|
|
" </trans-unit>\n",
|
|
" <trans-unit>\n",
|
|
" <source>File</source>\n",
|
|
" <target>Archivo</target>\n",
|
|
" </trans-unit>\n",
|
|
" <trans-unit>\n",
|
|
" <source>New</source>\n",
|
|
" <target>Nuevo</target>\n",
|
|
" </trans-unit>\n",
|
|
" <trans-unit>\n",
|
|
" <source>Exit</source>\n",
|
|
" <target>Salir</target>\n",
|
|
" </trans-unit>\n",
|
|
" </body>\n",
|
|
" </file>\n",
|
|
"</xliff>"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "falling-greenhouse",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Ćwiczenie 4: Napisz konwerter formatu hunaligna na XLIFF."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "remarkable-pillow",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def convert2xliff(hunalign_file_name):\n",
|
|
" return 0"
|
|
]
|
|
}
|
|
],
|
|
"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",
|
|
"version": "3.11.9"
|
|
},
|
|
"subtitle": "11. Urównoleglanie",
|
|
"title": "Komputerowe wspomaganie tłumaczenia",
|
|
"year": "2021"
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|