KWT-2024/lab/lab_11.ipynb

1046 lines
37 KiB
Plaintext
Raw Normal View History

2024-04-13 08:20:53 +02:00
{
"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",
2024-06-21 18:51:23 +02:00
"execution_count": 2,
2024-04-13 08:20:53 +02:00
"id": "german-dispute",
"metadata": {},
2024-06-21 18:19:28 +02:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"To jest próba.\n",
"Test musi byc wykonany.\n",
"Wszystko jest okey.\n",
"Źródło wody.\n",
"Ósemka\n"
]
}
],
2024-04-13 08:20:53 +02:00
"source": [
2024-06-21 18:19:28 +02:00
"import regex as re\n",
"\n",
"def segment_text(text):\n",
" regex = re.compile(r'\\p{Lu}')\n",
" positions = [match.start() for match in regex.finditer(text)]\n",
" positions.insert(0, 0)\n",
" positions.append(len(text))\n",
" segments = [text[positions[i]:positions[i+1]].strip() for i in range(len(positions)-1)]\n",
"\n",
" return segments\n",
"\n",
"text = \"To jest próba. Test musi byc wykonany. Wszystko jest okey. Źródło wody. Ósemka\"\n",
"segments = segment_text(text)\n",
"for segment in segments:\n",
" print(segment)\n"
2024-04-13 08:20:53 +02:00
]
},
{
"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",
2024-06-21 18:51:23 +02:00
"execution_count": 6,
2024-04-13 08:20:53 +02:00
"id": "guilty-morocco",
"metadata": {},
2024-06-21 18:19:28 +02:00
"outputs": [
{
"data": {
"text/plain": [
"['epoznan.pl - pierwszy portal',\n",
" 'Poznania',\n",
" 'Wyszukaj',\n",
" 'Zaloguj',\n",
" 'Login',\n",
" 'Hasło',\n",
" 'Zapomniałeś hasła?',\n",
" 'Zaloguj',\n",
" 'Nie masz konta?',\n",
" 'Zarejestruj się',\n",
" 'Wiadomości kronika policyjna inwestycje nieruchomości biznes polityka komunikacja wywiady kultura historia life style region pogoda',\n",
" 'Pogoda',\n",
" 'Sport',\n",
" 'Kultura i rozrywka',\n",
" 'Korki',\n",
" 'Forum',\n",
2024-06-21 18:51:23 +02:00
" 'Kontakt 1 godzina temu',\n",
" 'Zbierają niezbędne rzeczy dla pogorzelców z ul.',\n",
" 'Promienistej.',\n",
" 'Ogień strawił dorobek życia 31 1 godzina temu',\n",
" 'Korek na',\n",
" 'A2.',\n",
" 'Blokada jednego pasa ruchu z powodu stłuczki 28 1 godzina temu',\n",
" 'Spore utrudnienia za węzłem autostradowym.',\n",
" 'Kierowca samochodu wjechał w bariery.',\n",
" 'Ranna jedna osoba 11 2 godziny temu \"',\n",
" 'Cisza dzieciaki, cichutko!\".',\n",
" 'Idzie',\n",
" 'Magda',\n",
" 'Gessler.',\n",
" 'Kolejne rewolucje w',\n",
" 'Wielkopolsce 41 2 godziny temu',\n",
" 'Poszukujesz rehabilitacji - przyjęcie w 72 godziny',\n",
" 'Reklama 4 3 godziny temu',\n",
" 'Wielki turniej piłki siatkowej nad',\n",
" 'Rusałką.',\n",
" 'Kibice zobaczą 90 najlepszych polskich zespołów 63 3 godziny temu',\n",
" 'Z',\n",
" 'Tesli zniknęły kołpaki,',\n",
" 'Policja szuka mężczyzny.',\n",
" 'Sprawcę uwieczniły kamery zamontowane w aucie 95 1 3 godziny temu',\n",
" 'Sprzedają lemoniadę na poznańskim osiedlu, by zarobić na piłkę \"jak z',\n",
" 'E',\n",
" 'U',\n",
" 'R',\n",
" 'O 2024\" 81 3 godziny temu',\n",
" 'Mieszkańcy wielkopolskiej miejscowości od miesięcy bez lekarza rodzinnego.',\n",
" 'Dotychczasowy się rozchorował 22 3 godziny temu',\n",
" 'Zabarykadował się w domu, groził wysadzeniem budynku.',\n",
" 'Interweniowały służby 21 4 godziny temu',\n",
" 'Od poniedziałku zmiana organizacji ruchu na',\n",
" 'A2 pod',\n",
" 'Poznaniem! 14 2 4 godziny temu',\n",
" 'Policja próbuje ustalić tożsamość zmarłego mężczyzny.',\n",
" 'Zrekonstruowano jego wizerunek 20 2 4 godziny temu',\n",
" 'Budują nowe drogi rowerowe w centrum, będą utrudnienia dla kierowców 35 2 5 godzin temu',\n",
" 'Przetrwał pandemię i remont, od 30 lat prowadzi kram z pamiątkami na',\n",
" 'Starym',\n",
" 'Rynku 37 3 5 godzin temu',\n",
" 'Rodzina',\n",
" 'Med przyjazne miejsce dla',\n",
" 'Ciebie i rodziny - nowa placówka lekarza rodzinnego w',\n",
" 'Poznaniu',\n",
" 'Reklama 8 5 godzin temu',\n",
" 'Najpierw w kościele stworzył salkę zabaw dla dzieci na czas mszy, teraz postawił ofiaromat.',\n",
" 'Nie wszystkim się to podoba 99 2 6 godzin temu',\n",
" 'Uniewinniono policjantów, którzy w',\n",
" 'Antoninku postrzelili 39-latka chorego na schizofrenię 51 7 godzin temu',\n",
" 'Sprawdzają czy kierowcy pojazdów \"na aplikację\" mają stosowne dokumenty.',\n",
" 'Posypały się mandaty 71 4 7 godzin temu',\n",
" 'Koziołek od',\n",
" 'Kawu także w',\n",
" 'Berlinie. \"',\n",
" 'Walczymy dalej\".',\n",
" 'W piątek mecz o wszystko',\n",
" 'Polaków 72 8 godzin temu',\n",
" 'Praga i',\n",
" 'Kopenhaga z',\n",
" 'Ryanair - kierunki na letnią wycieczkę #',\n",
" 'Prostoz',\n",
" 'Poznania',\n",
" 'Reklama 5 8 godzin temu',\n",
" 'Były zastępca prezydenta',\n",
" 'Poznania ma nową pracę.',\n",
" 'Dość zaskakującą 106 9 godzin temu',\n",
" 'Onkolog z poznańskiego szpitala zatrzymana przez policję.',\n",
" 'Za opłatą masowo wystawiała recepty na opioidy, także na nieżyjących pacjentów 64 9 godzin temu',\n",
" 'Przebudowali perony, będzie parking dla pasażerów 33 10 godzin temu',\n",
" 'Miało jej nie być, ale jednak się odbędzie.',\n",
" 'Parada',\n",
" 'Sobótkowa w piątek na',\n",
" 'Warcie! 42 10 godzin temu 5 pomysłów na wyjątkowy prezent dla aktywnego taty - nasze propozycje',\n",
" 'Reklama 10 godzin temu',\n",
" 'Przed nami gorący piątek, który zakończy się burzami.',\n",
" 'Może być bardzo niebezpiecznie! 26 10 godzin temu',\n",
" 'Mieszkania w komfortowych lokalizacjach od',\n",
" 'Grupy',\n",
" 'Inwest',\n",
" 'Reklama 5 18 godzin temu',\n",
" 'Klub we',\n",
2024-06-21 18:19:28 +02:00
" 'Wtórku wydał kolejne oświadczenie w związku ze śmiercią 25-latka.',\n",
2024-06-21 18:51:23 +02:00
" 'Mają poprawić bezpieczeństwo 22 19 godzin temu',\n",
" 'Zauważyła starszą panią szukającą jedzenia w śmietniku, chciała jej pomóc 61 19 godzin temu',\n",
2024-06-21 18:19:28 +02:00
" 'W jednej z poznańskich \"',\n",
" 'Biedronek\" zmarnowała się żywność? \"',\n",
2024-06-21 18:51:23 +02:00
" 'Padły szafy chłodnicze\" 39',\n",
2024-06-21 18:19:28 +02:00
" 'Więcej wiadomości',\n",
2024-06-21 18:51:23 +02:00
" 'Na poznańskim osiedlu od rana skargi na intensywny zapach wanilii i karmelu. \"',\n",
" 'Nie można otworzyć okna\"',\n",
" 'Były proboszcz podpoznańskiej miejscowości skazany za molestowanie 13-latka.',\n",
" 'Ma trafić do więzienia',\n",
" 'Wydał 10 złotych, wygrał pół miliona!',\n",
2024-06-21 18:19:28 +02:00
" 'Kalendarium',\n",
" 'W najbliższym czasie:',\n",
" 'Zobacz więcej wydarzeń',\n",
2024-06-21 18:51:23 +02:00
" 'Imprezy',\n",
" 'R',\n",
" 'O',\n",
" 'N',\n",
2024-06-21 18:19:28 +02:00
" 'N',\n",
2024-06-21 18:51:23 +02:00
" 'I',\n",
" 'E',\n",
" 'F',\n",
" 'E',\n",
" 'R',\n",
" 'R',\n",
2024-06-21 18:19:28 +02:00
" 'A',\n",
2024-06-21 18:51:23 +02:00
" 'R',\n",
" 'I |',\n",
" 'X-',\n",
2024-06-21 18:19:28 +02:00
" 'D',\n",
2024-06-21 18:51:23 +02:00
" 'E',\n",
" 'M',\n",
" 'O',\n",
" 'N',\n",
" 'P',\n",
2024-06-21 18:19:28 +02:00
" 'O',\n",
" 'Z',\n",
" 'N',\n",
" 'A',\n",
2024-06-21 18:51:23 +02:00
" 'Ń',\n",
" 'X-',\n",
" 'Demon',\n",
" 'Poznań dzisiaj',\n",
2024-06-21 18:19:28 +02:00
" 'Kup bilet',\n",
" 'Spektakl',\n",
2024-06-21 18:51:23 +02:00
" 'E',\n",
2024-06-21 18:19:28 +02:00
" 'T',\n",
2024-06-21 18:51:23 +02:00
" 'H',\n",
" 'N',\n",
" 'O',\n",
" 'P',\n",
" 'O',\n",
" 'R',\n",
" 'T 2024/',\n",
" 'Małe',\n",
" 'Ethno:',\n",
" 'D',\n",
" 'A',\n",
" 'W',\n",
2024-06-21 18:19:28 +02:00
" 'N',\n",
" 'E',\n",
2024-06-21 18:51:23 +02:00
" 'Z',\n",
" 'A',\n",
" 'B',\n",
2024-06-21 18:19:28 +02:00
" 'A',\n",
2024-06-21 18:51:23 +02:00
" 'W',\n",
2024-06-21 18:19:28 +02:00
" 'K',\n",
" 'I',\n",
2024-06-21 18:51:23 +02:00
" 'L',\n",
" 'U',\n",
" 'D',\n",
" 'O',\n",
" 'W',\n",
" 'E',\n",
" 'W',\n",
" 'P',\n",
" 'O',\n",
" 'L',\n",
" 'S',\n",
" 'C',\n",
" 'E',\n",
" 'Dziedziniec',\n",
" 'Zamkowy jutro',\n",
2024-06-21 18:19:28 +02:00
" 'Kup bilet',\n",
2024-06-21 18:51:23 +02:00
" 'Spektakl',\n",
" 'Trzy akordy gniewu',\n",
" 'Republika',\n",
" 'Sztuki',\n",
" 'Tłusta',\n",
" 'Langusta jutro',\n",
" 'Kup bilet',\n",
" 'Hard',\n",
" 'Rock /',\n",
" 'Metal',\n",
" 'W',\n",
2024-06-21 18:19:28 +02:00
" 'I',\n",
2024-06-21 18:51:23 +02:00
" 'S',\n",
" 'D',\n",
" 'O',\n",
2024-06-21 18:19:28 +02:00
" 'M',\n",
2024-06-21 18:51:23 +02:00
" 'I',\n",
" 'N',\n",
" 'C',\n",
" 'H',\n",
" 'A',\n",
" 'I',\n",
" 'N',\n",
" 'S |',\n",
2024-06-21 18:19:28 +02:00
" 'P',\n",
" 'O',\n",
" 'Z',\n",
" 'N',\n",
" 'A',\n",
" 'Ń',\n",
2024-06-21 18:51:23 +02:00
" 'Pod',\n",
" 'Minogą za 33 dni',\n",
" 'Kup bilet',\n",
" 'Hip',\n",
" 'Hop /',\n",
" 'Rap',\n",
" 'Hip',\n",
" 'Hop',\n",
" 'Festival',\n",
" 'Poznań 2024',\n",
" 'Jezioro',\n",
" 'Maltańskie za 64 dni',\n",
2024-06-21 18:19:28 +02:00
" 'Kup bilet',\n",
" 'Spektakl',\n",
2024-06-21 18:51:23 +02:00
" 'Piękna i',\n",
" 'Bestia',\n",
" 'Teatr',\n",
" 'Cortiqué',\n",
" 'Anny',\n",
" 'Niedźwiedź za 109 dni',\n",
" 'Kup bilet',\n",
" 'Koncert',\n",
" 'Marcin',\n",
" 'Kydryński prezentuje:',\n",
" 'S',\n",
" 'I',\n",
" 'E',\n",
" 'S',\n",
" 'T',\n",
" 'A w drodze/',\n",
" 'N',\n",
2024-06-21 18:19:28 +02:00
" 'A',\n",
" 'N',\n",
2024-06-21 18:51:23 +02:00
" 'C',\n",
" 'Y',\n",
" 'V',\n",
2024-06-21 18:19:28 +02:00
" 'I',\n",
" 'E',\n",
2024-06-21 18:51:23 +02:00
" 'I',\n",
" 'R',\n",
" 'A wokalistka z',\n",
" 'Wysp',\n",
" 'Zielonego',\n",
" 'Przylądka',\n",
2024-06-21 18:19:28 +02:00
" 'Aula',\n",
2024-06-21 18:51:23 +02:00
" 'Nova',\n",
" 'Akademii',\n",
" 'Muzycznej za 114 dni',\n",
2024-06-21 18:19:28 +02:00
" 'Kup bilet',\n",
" 'Spektakl',\n",
" 'D',\n",
" 'E',\n",
" 'A',\n",
" 'R',\n",
" 'E',\n",
" 'V',\n",
" 'A',\n",
" 'N',\n",
" 'H',\n",
" 'A',\n",
" 'N',\n",
" 'S',\n",
" 'E',\n",
" 'N',\n",
" 'Teatr',\n",
" 'Muzyczny w',\n",
2024-06-21 18:51:23 +02:00
" 'Poznaniu za 162 dni',\n",
2024-06-21 18:19:28 +02:00
" 'Kup bilet',\n",
" 'W kinie',\n",
" 'Pełny repertuar',\n",
" 'Czytelnicy poszukują',\n",
" 'Zgłoś zaginięcie 18.06.2024',\n",
" 'Zgubiono portfelik \"',\n",
" 'W poniedziałek (17.06) na parkingu w starym korycie',\n",
" 'Warty znaleziono portfelik.',\n",
" 'Właściciela zguby proszę o kontakt\"',\n",
" 'K',\n",
" 'O',\n",
" 'N',\n",
" 'T',\n",
" 'A',\n",
" 'K',\n",
" 'T 601775589',\n",
" 'Dziś w',\n",
" 'Poznaniu 27℃ 14℃',\n",
" 'Poziom opadów: 15.5 mm',\n",
" 'Wiatr do: 19 km',\n",
" 'Stan powietrza',\n",
" 'P',\n",
2024-06-21 18:51:23 +02:00
" 'M2.5 11.80 μg/m3',\n",
" 'Bardzo dobry',\n",
2024-06-21 18:19:28 +02:00
" 'Zobacz pogodę na jutro',\n",
" 'Poznań',\n",
" 'Poznań',\n",
" 'Poznań',\n",
" 'Poznań',\n",
" 'Waszym zdaniem',\n",
2024-06-21 18:51:23 +02:00
" 'Były zastępca prezydenta',\n",
" 'Poznania ma nową pracę.',\n",
" 'Dość zaskakującą ~hahaha 8 godzin temu',\n",
" 'Tusk nie był komisarzem, pajacu.',\n",
" 'Komisarzem był',\n",
" 'Pi',\n",
" 'Sowiec',\n",
" 'Janusz',\n",
" 'Wojciechowski, który w imieniu',\n",
" 'Pi',\n",
" 'S przygotował',\n",
" 'Zielony',\n",
" 'Ład dla polskich rolników :-) 204 12',\n",
" 'Na poznańskim osiedlu od rana skargi na intensywny zapach wanilii i karmelu. \"',\n",
" 'Nie można otworzyć okna\" ~śmieszek 6 godzin temu',\n",
" 'Lepsza fabryka i zapach karmelu niż biuro',\n",
" 'Pi',\n",
" 'Su i zapach kupy. ;) 211 23',\n",
" 'Miało jej nie być, ale jednak się odbędzie.',\n",
" 'Parada',\n",
" 'Sobótkowa w piątek na',\n",
" 'Warcie! ~',\n",
" 'Autor 8 godzin temu',\n",
" 'Najpierw pi',\n",
2024-06-21 18:19:28 +02:00
" 'S',\n",
2024-06-21 18:51:23 +02:00
" 'Smani skomleli w komentarzach że parady nie będzie, a teraz skomlą że będzie x',\n",
" 'D 156 1',\n",
" 'Przebudowali perony, będzie parking dla pasażerów ~',\n",
" 'Autor 6 godzin temu',\n",
" 'Masz rację od kiedy odszedł',\n",
" 'P',\n",
" 'I',\n",
" 'S, żyje nam się lepiej i więcej pieniędzy mamy bo nie kradną 133 4',\n",
" 'Koziołek od',\n",
" 'Kawu także w',\n",
" 'Berlinie. \"',\n",
" 'Walczymy dalej\".',\n",
" 'W piątek mecz o wszystko',\n",
" 'Polaków ~##~ 7 godzin temu',\n",
" 'Na efekty złodziejstwa',\n",
" 'P',\n",
" 'O jeszcze',\n",
" 'P',\n",
" 'Oczekamy.',\n",
" 'Aktualny deficyt w budżecie to wina złodziejskich rządów',\n",
2024-06-21 18:19:28 +02:00
" 'Prawa i',\n",
2024-06-21 18:51:23 +02:00
" 'Sprawiedliwości. 122 2',\n",
" 'Zabarykadował się w domu, groził wysadzeniem budynku.',\n",
" 'Interweniowały służby',\n",
" 'Czuqakadra 3 godziny temu',\n",
" 'Ale was pisowcy bez mydła z tymi imigrantami.',\n",
" 'Naściągali \"ekipy filmowe\" które już \"zakończyły zdjęcia\" na zachodzie',\n",
" 'Europy i ich nam zwracają :',\n",
" 'D 88 3',\n",
" 'Zauważyła starszą panią szukającą jedzenia w śmietniku, chciała jej pomóc ~sas 19 godzin temu \"napatoczyła się na przykry widok\" - normalnie poezja. 84 3',\n",
2024-06-21 18:19:28 +02:00
" 'Pojedynek mistrzów',\n",
" 'Wyślij zdjęcie vs',\n",
2024-06-21 18:51:23 +02:00
" 'Głosuj 88%',\n",
" 'Głosuj 12%',\n",
2024-06-21 18:19:28 +02:00
" 'Termy',\n",
2024-06-21 18:51:23 +02:00
" 'Dziś zagłosowały 982 osoby!',\n",
2024-06-21 18:19:28 +02:00
" 'Spotted środa, 19.06.2024 r., godz. 18.18',\n",
" 'K:',\n",
" 'Urocza blondynko o pięknych brązowych oczach....',\n",
" 'Widywaliśmy się niemal codziennie w autobusie linii 322 po godz 7..',\n",
" 'Uśmiechaliśmy się do siebie kiedy wsiadałem i kiedy',\n",
" 'Ty wysiadałaś na',\n",
" 'Serbskiej albo na',\n",
" 'Alejach....',\n",
" 'Ostatnio kiedy się spotkaliśmy miałaś różowe słuchawki...',\n",
" 'Nie jechałaś już ze mną od miesiąca , nie zdążyłem choćby poznać',\n",
" 'Twojego imienia...........',\n",
" 'Kontakt środa, 19.06.2024 r., godz. 10.44',\n",
" 'Marcin:',\n",
" 'Pozdrawiam sympatyczną kobietę, której wymieniłem żarówkę w jej aucie przed',\n",
" 'M1.',\n",
" 'Chciałbym',\n",
" 'Cię zaprosić na kawę.',\n",
" 'Kontakt wtorek, 18.06.2024 r., godz. 19.23',\n",
" 'Darek:',\n",
" 'Pozdrawiam przemiłą panią z rejestracji(',\n",
" 'Termedica)za pomoc!',\n",
" 'Różni nas tylko cztery miesiące!',\n",
" 'Może kawa?:)',\n",
" 'Kontakt wtorek, 18.06.2024 r., godz. 19.21',\n",
" 'Max:',\n",
" 'Serdecznie pozdrawiam sliczna brunetka,kierowcę',\n",
" 'M',\n",
" 'P',\n",
" 'K ,która dziś na dworcu',\n",
" 'Rataje ślicznie się uśmiechnęła',\n",
" 'Kontakt wtorek, 18.06.2024 r., godz. 17.30',\n",
" 'Maciej:',\n",
" 'Widzieliśmy się 16 czerwca na koncercie ... w okolicy wejścia',\n",
" 'R3 ( trybuna 1 ) , około 21 mijaliśmy się przy barze , byłaś z koleżanką ( blondynka ).',\n",
" 'Zapamiętałem',\n",
" 'Twój uśmiech , ubrana byłaś w białą bluzkę z napisem , jeśli to czytasz ... odezwij się , może na następny koncert pójdziemy razem :)',\n",
" 'Kontakt wtorek, 18.06.2024 r., godz. 00.54',\n",
" 'Maja:',\n",
" 'Hej, szukam wysokiego bruneta.',\n",
" 'Stałeś dzisiaj na przystanku pętli 611 na',\n",
" 'Dębcu i machałeś do mnie.',\n",
" 'Kiedy się do',\n",
" 'Ciebie zbliżyłam podjechał',\n",
" 'Twój autobus, powiedziałeś tylko: \"',\n",
" 'Nie pamiętasz mnie?',\n",
" 'Odezwij się do mnie. \"',\n",
" 'Nie mam pojęcia kim jesteś, jeśli to przeczytasz to',\n",
" 'Ty się odezwij.',\n",
" 'Powiedz do jakiego autobusu wchodziłeś i z kim byłam dla pewności',\n",
" 'Kontakt poniedziałek, 17.06.2024 r., godz. 12.35',\n",
" 'Tylko ja:',\n",
" 'Pozdrawiam sympatyczną dziewczynę z porannego autobusu 193 )) ładne pazurki ))',\n",
" 'Kontakt niedziela, 16.06.2024 r., godz. 22.59',\n",
" 'Grzegorz:',\n",
" 'Kasia.',\n",
" 'Szukam dziewczyny o imieniu',\n",
" 'Kasia którą poznałem na koncercie',\n",
" 'Dawida',\n",
" 'Podsiadło 15 czerwca.',\n",
" 'Siedzieliśmy obok siebie w sektorze',\n",
" 'A1 na rogu stadionu.',\n",
" 'Jestem pod wrażeniem',\n",
" 'Twoich oczu i chciałbym zaprosić',\n",
" 'Cię na kawę.',\n",
" 'Kontakt niedziela, 16.06.2024 r., godz. 20.33',\n",
" 'Ania:',\n",
" 'Bardzo dziękuję parze przemiłych ludzi którzy pomogli mi z opona koło',\n",
" 'Lidla .',\n",
" 'Kontakt sobota, 15.06.2024 r., godz. 12.58',\n",
" 'Marcin:',\n",
" 'Piątek, około godziny 19.00,',\n",
" 'Rosmann',\n",
" 'Druskiennicka.',\n",
" 'Mówiłaś synowi żeby z nikim nie rozmawiał jak wejdziesz do',\n",
" 'Rossmana:) nawiazalismy kontakt jednak się spieszyłem.',\n",
" 'Odezwij się.',\n",
" 'Kontakt piątek, 14.06.2024 r., godz. 22.36',\n",
" 'Beza:',\n",
" 'Widziałam',\n",
" 'Ciebie parę razy w',\n",
" 'Bezie.',\n",
" 'Ty ubrany cały na czarno, ja z koleżanką na kawie.',\n",
" 'Może zjemy razem tort bezowy?',\n",
" 'Kontakt piątek, 14.06.2024 r., godz. 14.47',\n",
" 'Brunetka.:',\n",
" 'Wsiadałaś dziś też na',\n",
" 'Al.',\n",
" 'Marcinkowskiego tramwaj',\n",
" 'Nr9.',\n",
" 'Biało czerwona koszulka czerwone buty i te',\n",
" 'Twoje tatuaże kolorowe na prawej ręce.',\n",
" 'Twoje spojrzenie aż mnie przeszywa.',\n",
" 'Odezwij się do mnie na @.',\n",
" 'Może pogadamy o tatuażach też mam ale nie widać albo może spacer.',\n",
" 'Brunetka.',\n",
" 'Kontakt piątek, 14.06.2024 r., godz. 09.21',\n",
" 'Maleństwo:',\n",
" 'Gdy w środę zobaczyłam',\n",
" 'Cię pierwszy, moje serducho zaczęło szybciej bić - jakby strzała amora trafiła ...',\n",
" 'Patrzyłam jak wychodziłeś, czekając czy się odwrócisz i odwróciłeś się, a nasz wzrok ponownie nie mógł się od siebie oderwać.',\n",
" 'Wiem, że pracujesz w',\n",
" 'Lednogorze.',\n",
" 'Mam nadzieję, że się spotkamy, chociażby na korytarzu, bo bywasz u mnie w pracy.',\n",
" 'Kontakt czwartek, 13.06.2024 r., godz. 15.15',\n",
" 'M:',\n",
" 'Jechałaś dzisiaj tramwajem na królowej',\n",
" 'Jadwigi i pięknie uśmiechała się przez okno.',\n",
" 'Nasz wzrok spotkał się kilka razy.',\n",
" 'Może kawa?',\n",
" 'Ten z',\n",
" 'B',\n",
" 'M',\n",
" 'W.',\n",
" 'Kontakt czwartek, 13.06.2024 r., godz. 06.40',\n",
" 'Brunetka:',\n",
" 'Jeździsz prawie codziennie tramwajem',\n",
" 'Nr9 wsiadasz na',\n",
" 'Al.',\n",
" 'Marcinkowskiego.',\n",
" 'Masz bardzo fajną fryzurę i tatuaże na prawej ręce.',\n",
" 'Pare razy nasze spojrzenia się spotkały masz coś wyjątkowego w oczach.',\n",
" 'Może masz ochotę na spacer?',\n",
" 'Kontakt',\n",
" 'Dodaj',\n",
" 'Wyznaję',\n",
2024-06-21 18:51:23 +02:00
" 'Wyślij do',\n",
" 'Szczera czyli szczera nie jesteś, skoro trzymasz język za zębami ;)',\n",
" 'Łżesz w żywe oczy a swoje myślisz?',\n",
" 'To się nazywa dwulicowość ;)',\n",
" 'Szczera',\n",
" 'Każdy ma jakiegoś mola co go gryzie, ale ja wolę trzymać język za zębami, a',\n",
" 'Ty nie gryziesz się w język. :)',\n",
" 'Miłego dnia, niebieskooki',\n",
" 'Promyczku słońca',\n",
2024-06-21 18:19:28 +02:00
" 'J',\n",
" 'Dziękuję za te piękne lata mojemu mężowi :)',\n",
" 'Życzę nam kolejnych takich :)',\n",
" 'Malinka',\n",
" 'Wciąż cię kocham i tęsknię',\n",
" 'Z ...chcę się z tobą zestarzeć.',\n",
" 'Uwielbiam ... karel',\n",
" 'Madlaine, kiedy rowerki?',\n",
" 'Myszka',\n",
" 'Nie żałuję żadnej z naszych chwil.',\n",
" 'Warto było kochać każdą z nich...',\n",
" 'Iwo',\n",
" 'Pozdrowienia dla ślicznych pielęgniarek z oddziału wewnętrznego .',\n",
" 'Do dlaczego',\n",
" 'Niestety',\n",
" 'Ci po zdalnym nie zrozumieją.',\n",
" 'Polska mowa być trudna mowa.',\n",
" 'Aluśka',\n",
" 'Kocham',\n",
" 'Cię',\n",
2024-06-21 18:51:23 +02:00
" 'Robciu..miłego dnia',\n",
2024-06-21 18:19:28 +02:00
" 'Newsletter',\n",
" 'Oszczędź sobie czasu na poszukiwania!',\n",
" 'Wybierz jakie informacje',\n",
" 'Cię interesują, by być na bieżąco każdego dnia!',\n",
" 'Poranna gazeta',\n",
" 'Codziennie rano',\n",
" 'Informator kulturalny',\n",
" 'W każdy czwartek',\n",
" 'Dodaj',\n",
" 'Potwierdzenie subskrypcji zostało wysłane na',\n",
" 'Twój adres e-mail.',\n",
" 'Potwierdź i jako pierwszy dowiaduj się, co słychać w',\n",
" 'Poznaniu!',\n",
" 'Zdjęcie dnia',\n",
" 'Wyślij zdjęcie',\n",
" \"Efekt 'halo' widziany z poznańskiej\",\n",
" 'Śródki',\n",
" 'Autor:',\n",
" 'Adam',\n",
" 'Słociński',\n",
" 'Nekrologi',\n",
" 'Dodaj nekrolog',\n",
2024-06-21 18:51:23 +02:00
" 'Mirosława',\n",
" 'Kosicka lat 79',\n",
" 'Halina',\n",
" 'Teresa',\n",
" 'Filas lat 77',\n",
2024-06-21 18:19:28 +02:00
" 'Regina',\n",
" 'Dajksler lat 72',\n",
" 'Mirosława',\n",
" 'Maria',\n",
" 'Kaczmarek lat 82',\n",
" 'Ignacy',\n",
" 'Augustyn',\n",
" 'Nowak lat 71',\n",
" 'Wojciech',\n",
" 'Franciszek',\n",
" 'Schmidt lat 84',\n",
" 'Alodia',\n",
" 'Donata',\n",
" 'Witaszek-',\n",
" 'Napierała lat 86',\n",
" 'Katarzyna',\n",
" 'Plenzler lat 55',\n",
" 'Ewa',\n",
" 'Urszula',\n",
" 'Czajka-',\n",
" 'Bolek lat 78',\n",
" 'Piotr',\n",
" 'Kurmiel lat 62',\n",
" 'Mariusz',\n",
" 'Stanisław',\n",
" 'Kaźmierczak lat 62',\n",
" 'Wanda',\n",
" 'Anna',\n",
" 'Pałgan lat 77',\n",
" 'Andrzej',\n",
" 'Kaczmarek lat 41',\n",
" 'Urszula',\n",
" 'Franciszka',\n",
" 'Kubasińska lat 79',\n",
" 'Mateusz',\n",
" 'Strzelczyk lat 31',\n",
" 'Kondolencje',\n",
" 'Formularz kontaktowy',\n",
" 'Zdjęcie/',\n",
" 'Video',\n",
" 'Załącz plik',\n",
" 'Wysyłając niniejszy formularz niniejszym oświadczam, że jestem autorem przesyłanego zdjęcia/video/tekstu i zgadzam się na nieodpłatne wykorzystanie tego materiału na łamach epoznan.pl, wtkplay.pl i',\n",
" 'Telewizji',\n",
" 'W',\n",
" 'T',\n",
" 'K.',\n",
" \"Aby wysłać formularz, konieczne jest zaznaczenie opcji '\",\n",
" \"Nie jestem robotem'.\",\n",
" 'Anuluj',\n",
" 'Wyślij',\n",
" 'Jeśli zapomniałeś hasła podaj adres e-mail na który zarejestrowałeś swoje konto aby wygenerować nowe hasło.',\n",
" 'Anuluj',\n",
" 'Wyślij',\n",
" 'Zgłoszenie “',\n",
" 'Spotted” wysłane.',\n",
" 'Po akceptacji redakcji, pojawi się na stronie.',\n",
" 'Zgłoszenie “',\n",
" 'Wyznaję” wysłane.',\n",
" 'Po akceptacji redakcji, pojawi się na stronie.',\n",
" 'K',\n",
" 'O',\n",
" 'N',\n",
" 'T',\n",
" 'A',\n",
" 'K',\n",
" 'T:',\n",
" 'Zgłoszenie “',\n",
" 'Spotted” wysłane.',\n",
" 'Po akceptacji redakcji, pojawi się na stronie.',\n",
" 'Uzasadnij zgłoszenie komentarza do usunięcia',\n",
" 'Anuluj',\n",
" 'Wyślij',\n",
" 'Odpowiedz na komentarz',\n",
" 'Anuluj',\n",
" 'Wyślij',\n",
" 'Komentarz został dodany.',\n",
" 'Co powinniśmy w tym newsie poprawić?',\n",
" 'Anuluj',\n",
" 'Wyślij',\n",
" 'Login',\n",
" 'Hasło',\n",
" 'Zapomniałeś hasła?',\n",
" 'Zaloguj',\n",
" 'Nie masz konta?',\n",
" 'Zarejestruj się',\n",
" 'Materiał zawiera treści przeznaczone tylko dla osób dorosłych.',\n",
" 'Jeśli nie ukończyłeś 18 roku życia i tym samym w świetle polskiego prawa nie jesteś osobą pełnoletnią, nie wolno',\n",
" 'Ci wchodzić dalej.',\n",
" 'Wchodząc dalej oświadczasz, iż jesteś osobą pełnoletnią.',\n",
" 'Tak',\n",
" 'Nie',\n",
" 'Nr 1',\n",
" 'W',\n",
" 'Poznaniu 2,4 mln',\n",
" 'Czytelników',\n",
" 'Siła miliona',\n",
" 'Czytelników',\n",
" 'Oferta reklamowa',\n",
" 'Nasz patronat',\n",
" 'Polityka prywatności',\n",
" 'Regulamin serwisu',\n",
" 'R',\n",
" 'S',\n",
" 'S',\n",
" 'Kontakt',\n",
" 'Kontakt 24/7: [email protected]',\n",
" 'M',\n",
" 'M',\n",
" 'S/',\n",
" 'S',\n",
" 'M',\n",
" 'S: 537 133 133',\n",
" 'Formularz kontaktowy',\n",
" 'Redaktor naczelny:',\n",
" 'Witold',\n",
" 'Kundzewicz',\n",
" 'Redaktor prowadząca:',\n",
" 'Katarzyna',\n",
" 'Żurowska',\n",
" 'Redakcja:',\n",
" 'Joanna',\n",
" 'Wachowska,',\n",
" 'Paulina',\n",
" 'Zych',\n",
" 'I',\n",
" 'T:',\n",
" 'Tomasz',\n",
" 'Płuciennik']"
]
},
2024-06-21 18:51:23 +02:00
"execution_count": 6,
2024-06-21 18:19:28 +02:00
"metadata": {},
"output_type": "execute_result"
}
],
2024-04-13 08:20:53 +02:00
"source": [
2024-06-21 18:19:28 +02:00
"import requests\n",
"from bs4 import BeautifulSoup\n",
"\n",
"\n",
"def segment_text(text): \n",
"\n",
" pattern = r'(\\p{Lu}\\p{Ll}*|\\b\\p{Lu}(?=\\p{Ll}))'\n",
" regex = re.compile(pattern, re.UNICODE)\n",
"\n",
" matches = list(regex.finditer(text))\n",
"\n",
" segments = []\n",
" start = 0\n",
" for match in matches:\n",
" end = match.start()\n",
" if start < end:\n",
" segments.append(text[start:end].strip())\n",
" start = end\n",
"\n",
" segments.append(text[start:].strip())\n",
"\n",
" segments = [segment for segment in segments if segment]\n",
"\n",
" return segments\n",
"\n",
"def sentence_split_enhanced(url):\n",
" soup = BeautifulSoup(requests.get(url).content, 'html.parser')\n",
" text = re.sub(r\"\\s+\", \" \", soup.get_text())\n",
" segments = segment_text(text)\n",
" return segments\n",
"\n",
"sentence_split_enhanced(\"https://epoznan.pl\")\n",
"\n",
"# problem z wyrazami, które sa pisane duza litera \n",
"# problem z nazwami ulic"
2024-04-13 08:20:53 +02:00
]
},
{
"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"
]
},
2024-06-21 18:19:28 +02:00
{
"cell_type": "markdown",
"id": "149d1a7e",
"metadata": {},
"source": []
},
2024-04-13 08:20:53 +02:00
{
"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:"
]
},
2024-06-21 18:51:23 +02:00
{
"cell_type": "code",
"execution_count": 11,
"id": "7cb45435",
"metadata": {},
"outputs": [],
"source": [
"def create_hunaligna_file(text_en, text_pl, output_file):\n",
" sentences_en = text_en.split('. ')\n",
" sentences_pl = text_pl.split('. ')\n",
"\n",
" with open(output_file, \"w\", encoding=\"utf-8\") as f:\n",
" f.write(\"# Sentence pairs\\n\")\n",
" for i, (en, pl) in enumerate(zip(sentences_en, sentences_pl)):\n",
" f.write(f\"{i}\\n\")\n",
" f.write(\"# Source\\n\")\n",
" f.write(f\"{en.strip()}\\n\")\n",
" f.write(\"# Target\\n\")\n",
" f.write(f\"{pl.strip()}\\n\")\n",
"\n",
"\n",
"en_url = \"https://www.apple.com\"\n",
"pl_url = \"https://www.apple.com/pl/\"\n",
"\n",
"en_text = ' '.join(sentence_split_enhanced(en_url))\n",
"pl_text = ' '.join(sentence_split_enhanced(pl_url))\n",
"\n",
"with open(\"txt/en.txt\", \"w\", encoding=\"utf-8\") as f_en:\n",
" f_en.write(en_text)\n",
"\n",
"with open(\"txt/pl.txt\", \"w\", encoding=\"utf-8\") as f_pl:\n",
" f_pl.write(pl_text)\n",
"\n",
"create_hunaligna_file(en_text, pl_text, \"txt/hunaligna.txt\")\n",
"\n"
]
},
2024-04-13 08:20:53 +02:00
{
"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",
2024-06-21 18:51:23 +02:00
"execution_count": 18,
2024-04-13 08:20:53 +02:00
"id": "remarkable-pillow",
"metadata": {},
"outputs": [],
"source": [
2024-06-21 18:51:23 +02:00
"import xml.etree.ElementTree as ET\n",
"\n",
"def convert2xliff():\n",
" segments = []\n",
" with open('txt/hunaligna.txt', 'r', encoding='utf-8') as file:\n",
" segment = {}\n",
" for line in file:\n",
" line = line.strip()\n",
" if line.startswith(\"# Source\"):\n",
" segment['source'] = next(file).strip()\n",
" elif line.startswith(\"# Target\"):\n",
" segment['target'] = next(file).strip()\n",
" segments.append(segment)\n",
" segment = {}\n",
" \n",
" xliff = ET.Element('xliff', version=\"1.2\")\n",
" file_elem = ET.SubElement(xliff, 'file', {\n",
" 'datatype': \"plaintext\",\n",
" 'original': \"file.txt\",\n",
" 'source-language': 'en',\n",
" 'target-language': 'pl'\n",
" })\n",
" body = ET.SubElement(file_elem, 'body')\n",
"\n",
" for i, segment in enumerate(segments):\n",
" trans_unit = ET.SubElement(body, 'trans-unit', id=str(i))\n",
" source = ET.SubElement(trans_unit, 'source')\n",
" source.text = segment['source']\n",
" target = ET.SubElement(trans_unit, 'target')\n",
" target.text = segment['target']\n",
"\n",
" tree = ET.ElementTree(xliff)\n",
" tree.write('txt/output.xliff', encoding='UTF-8', xml_declaration=True)\n",
"\n",
"\n",
"convert2xliff()\n",
"\n",
"\n"
2024-04-13 08:20:53 +02:00
]
}
],
"metadata": {
"author": "Rafał Jaworski",
"email": "rjawor@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
2024-06-21 18:19:28 +02:00
"lang": "pl",
2024-04-13 08:20:53 +02:00
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2024-06-21 18:19:28 +02:00
"version": "3.11.9"
},
"subtitle": "11. Urównoleglanie",
"title": "Komputerowe wspomaganie tłumaczenia",
"year": "2021"
2024-04-13 08:20:53 +02:00
},
"nbformat": 4,
"nbformat_minor": 5
}