{ "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": 116, "id": "german-dispute", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['To jest przykładowy tekst.',\n", " 'Nie wiem czym jest',\n", " 'Python,',\n", " 'ASCII i',\n", " 'UNICODE.',\n", " 'Ósmy raz sięgam ręką po borówkę.',\n", " 'Żądło pszczoły jest kujące']" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import regex\n", "\n", "def sentence_split(text):\n", " pattern = r'\\s(?=\\p{Lu})'\n", " segments = regex.split(pattern, text)\n", " return segments\n", "\n", "text = \"To jest przykładowy tekst. Nie wiem czym jest Python, ASCII i UNICODE. Ósmy raz sięgam ręką po borówkę. Żądło pszczoły jest kujące\"\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": 69, "id": "guilty-morocco", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Jeżeli chodzi o UNICODE czy ASCII to nie wiem co to jest',\n", " 'Jestem S444820 [',\n", " 'Krystian Osiński',\n", " '] Lubię jeść pizze',\n", " 'Mam konto w banku Peako S.A i jestem z niego zadowolony.']" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import regex as r\n", "def sentence_split_enhanced(text):\n", " #Ulepszenie algorytmu: szukam indexu znaku białego który jest poprzedzany znakiem .?! i następuje po nim duża litera, ale przed znakiem musi wystąpić litera a-z (nie może) A-Z\n", " # Dltaego dodatkowmo nie dziele zdań gdy wystąpią skróty pokroju S.A. oraz w przypadku wystąpienia Dużej litery w środku zdania -> segment nie jest tworzony.\n", " # W dodatku obsługuję nawiasy () i [] -> pobieram zdania występujące w nawiasie\n", "\n", " pattern = r'(?\n", "\n", " \n", "
\n", " \n", " sample\n", " KWT\n", " KWT\n", " 123\n", " sample XLIFF file\n", " \n", "
\n", " \n", " \n", " Hello world!\n", " Hola mundo!\n", " \n", " \n", " File\n", " Archivo\n", " \n", " \n", " New\n", " Nuevo\n", " \n", " \n", " Exit\n", " Salir\n", " \n", " \n", "
\n", "
" ] }, { "cell_type": "markdown", "id": "falling-greenhouse", "metadata": {}, "source": [ "### Ćwiczenie 4: Napisz konwerter formatu hunaligna na XLIFF." ] }, { "cell_type": "code", "execution_count": 87, "id": "remarkable-pillow", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#mi osobiście dedykowana aplikacja zwracała jako wynik plik .txt + umożliwiała wybranie formatu który jest możlwiy do otworzenia w CAT\n", "# pracuję na zestawie danych \n", "# pl -> https://www.europarl.europa.eu/about-parliament/en/democracy-and-human-rights\n", "# en -> https://www.europarl.europa.eu/about-parliament/en/democracy-and-human-rights\n", "# plik wygenerowany: aligned_pl-en.txt\n", "def convert2xliff(hunalign_file_name,new_xliff_file_name):\n", " text = \"\"\"\n", " \n", " \n", "
\n", " \n", " Krystian Osinski\n", " \n", "
\n", " \"\"\"\n", " with open(hunalign_file_name, 'r') as file:\n", " lines = file.readlines()\n", " for line in lines:\n", " source, target, pl = line.strip().split('\\t')\n", " text += f\"\"\"\n", " {source}\n", " {target}\n", " \"\"\"\n", " text += r\"\"\"\n", "
\n", "
\"\"\"\n", " \n", " with open('output_xml_file.xml', 'w') as xml_file:\n", " xml_file.write(text)\n", " \n", " \n", " return 0\n", "\n", "convert2xliff(\"aligned_pl-en.txt\",\"xliff_pl_en\")" ] } ], "metadata": { "author": "Rafał Jaworski", "email": "rjawor@amu.edu.pl", "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.2" }, "subtitle": "11. Urównoleglanie", "title": "Komputerowe wspomaganie tłumaczenia", "year": "2021" }, "nbformat": 4, "nbformat_minor": 5 }