forked from bfijalkowski/KWT-2024
215 lines
7.5 KiB
Plaintext
215 lines
7.5 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": 1,
|
||
|
"id": "german-dispute",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"def sentence_split(text):\n",
|
||
|
" return []"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"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": 3,
|
||
|
"id": "guilty-morocco",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"def sentence_split_enhanced(text):\n",
|
||
|
" return []"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"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",
|
||
|
"lang": "pl",
|
||
|
"subtitle": "11. Urównoleglanie",
|
||
|
"title": "Komputerowe wspomaganie tłumaczenia",
|
||
|
"year": "2021",
|
||
|
"kernelspec": {
|
||
|
"display_name": "Python 3",
|
||
|
"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.8.10"
|
||
|
}
|
||
|
},
|
||
|
"nbformat": 4,
|
||
|
"nbformat_minor": 5
|
||
|
}
|