{
"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",
" \n",
" Hola mundo!\n",
" \n",
" \n",
" \n",
" Archivo\n",
" \n",
" \n",
" \n",
" Nuevo\n",
" \n",
" \n",
" \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",
" \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
}