{ "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": 2, "id": "german-dispute", "metadata": {}, "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" ] } ], "source": [ "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" ] }, { "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": 6, "id": "guilty-morocco", "metadata": {}, "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", " '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", " 'Wtórku wydał kolejne oświadczenie w związku ze śmiercią 25-latka.',\n", " '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", " 'W jednej z poznańskich \"',\n", " 'Biedronek\" zmarnowała się żywność? \"',\n", " 'Padły szafy chłodnicze\" 39',\n", " 'Więcej wiadomości',\n", " '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", " 'Kalendarium',\n", " 'W najbliższym czasie:',\n", " 'Zobacz więcej wydarzeń',\n", " 'Imprezy',\n", " 'R',\n", " 'O',\n", " 'N',\n", " 'N',\n", " 'I',\n", " 'E',\n", " 'F',\n", " 'E',\n", " 'R',\n", " 'R',\n", " 'A',\n", " 'R',\n", " 'I |',\n", " 'X-',\n", " 'D',\n", " 'E',\n", " 'M',\n", " 'O',\n", " 'N',\n", " 'P',\n", " 'O',\n", " 'Z',\n", " 'N',\n", " 'A',\n", " 'Ń',\n", " 'X-',\n", " 'Demon',\n", " 'Poznań dzisiaj',\n", " 'Kup bilet',\n", " 'Spektakl',\n", " 'E',\n", " 'T',\n", " '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", " 'N',\n", " 'E',\n", " 'Z',\n", " 'A',\n", " 'B',\n", " 'A',\n", " 'W',\n", " 'K',\n", " 'I',\n", " '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", " 'Kup bilet',\n", " '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", " 'I',\n", " 'S',\n", " 'D',\n", " 'O',\n", " 'M',\n", " 'I',\n", " 'N',\n", " 'C',\n", " 'H',\n", " 'A',\n", " 'I',\n", " 'N',\n", " 'S |',\n", " 'P',\n", " 'O',\n", " 'Z',\n", " 'N',\n", " 'A',\n", " 'Ń',\n", " '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", " 'Kup bilet',\n", " 'Spektakl',\n", " '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", " 'A',\n", " 'N',\n", " 'C',\n", " 'Y',\n", " 'V',\n", " 'I',\n", " 'E',\n", " 'I',\n", " 'R',\n", " 'A – wokalistka z',\n", " 'Wysp',\n", " 'Zielonego',\n", " 'Przylądka',\n", " 'Aula',\n", " 'Nova',\n", " 'Akademii',\n", " 'Muzycznej za 114 dni',\n", " '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", " 'Poznaniu za 162 dni',\n", " '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", " 'M2.5 11.80 μg/m3',\n", " 'Bardzo dobry',\n", " 'Zobacz pogodę na jutro',\n", " 'Poznań',\n", " 'Poznań',\n", " 'Poznań',\n", " 'Poznań',\n", " 'Waszym zdaniem',\n", " '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", " 'S',\n", " '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", " 'Prawa i',\n", " '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", " 'Pojedynek mistrzów',\n", " 'Wyślij zdjęcie vs',\n", " 'Głosuj 88%',\n", " 'Głosuj 12%',\n", " 'Termy',\n", " 'Dziś zagłosowały 982 osoby!',\n", " '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", " '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", " '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", " 'Robciu..miłego dnia',\n", " '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", " 'Mirosława',\n", " 'Kosicka lat 79',\n", " 'Halina',\n", " 'Teresa',\n", " 'Filas lat 77',\n", " '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']" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "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" ] }, { "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": "149d1a7e", "metadata": {}, "source": [] }, { "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": "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" ] }, { "cell_type": "raw", "id": "appropriate-timber", "metadata": {}, "source": [ "\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": 18, "id": "remarkable-pillow", "metadata": {}, "outputs": [], "source": [ "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" ] } ], "metadata": { "author": "Rafał Jaworski", "email": "rjawor@amu.edu.pl", "kernelspec": { "display_name": "Python 3", "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.11.9" }, "subtitle": "11. Urównoleglanie", "title": "Komputerowe wspomaganie tłumaczenia", "year": "2021" }, "nbformat": 4, "nbformat_minor": 5 }