{
 "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
}