KWT-2024/lab/lab_11.ipynb

37 KiB
Raw Permalink Blame History

Komputerowe wspomaganie tłumaczenia

Zajęcia 11 - urównoleglanie

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.

Automatyczne urównoleglanie tekstu składa się z dwóch kroków:

  1. Podziału tekstu źródłowego oraz docelowego na zdania.
  2. Dopasowaniu zdań źródłowych do docelowych.

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]"

Ć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.

import regex as re

def segment_text(text):
    regex = re.compile(r'\p{Lu}')
    positions = [match.start() for match in regex.finditer(text)]
    positions.insert(0, 0)
    positions.append(len(text))
    segments = [text[positions[i]:positions[i+1]].strip() for i in range(len(positions)-1)]

    return segments

text = "To jest próba. Test musi byc wykonany. Wszystko jest okey. Źródło wody. Ósemka"
segments = segment_text(text)
for segment in segments:
    print(segment)
To jest próba.
Test musi byc wykonany.
Wszystko jest okey.
Źródło wody.
Ósemka

Ć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.

import requests
from bs4 import BeautifulSoup


def segment_text(text):    

    pattern = r'(\p{Lu}\p{Ll}*|\b\p{Lu}(?=\p{Ll}))'
    regex = re.compile(pattern, re.UNICODE)

    matches = list(regex.finditer(text))

    segments = []
    start = 0
    for match in matches:
        end = match.start()
        if start < end:
            segments.append(text[start:end].strip())
        start = end

    segments.append(text[start:].strip())

    segments = [segment for segment in segments if segment]

    return segments

def sentence_split_enhanced(url):
    soup = BeautifulSoup(requests.get(url).content, 'html.parser')
    text = re.sub(r"\s+", " ", soup.get_text())
    segments = segment_text(text)
    return segments

sentence_split_enhanced("https://epoznan.pl")

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

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:

  • tłumaczenia jednego zdania źródłowego przy użyciu więcej niż jednego zdania
  • tłumaczenia więcej niż jednego zdania źródłowego przy użyciu jednego zdania
  • pominięcia zdania podczas tłumaczenia
  • 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)
  • przetłumaczenia tekstu źródłowego tylko częściowo

Problemy te rozwiązwyane są na różne sposoby. Najpopularniejszym programem do przeprowadzania urównoleglania jest 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.

Ć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.

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.

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:

def create_hunaligna_file(text_en, text_pl, output_file):
    sentences_en = text_en.split('. ')
    sentences_pl = text_pl.split('. ')

    with open(output_file, "w", encoding="utf-8") as f:
        f.write("# Sentence pairs\n")
        for i, (en, pl) in enumerate(zip(sentences_en, sentences_pl)):
            f.write(f"{i}\n")
            f.write("# Source\n")
            f.write(f"{en.strip()}\n")
            f.write("# Target\n")
            f.write(f"{pl.strip()}\n")


en_url = "https://www.apple.com"
pl_url = "https://www.apple.com/pl/"

en_text = ' '.join(sentence_split_enhanced(en_url))
pl_text = ' '.join(sentence_split_enhanced(pl_url))

with open("txt/en.txt", "w", encoding="utf-8") as f_en:
    f_en.write(en_text)

with open("txt/pl.txt", "w", encoding="utf-8") as f_pl:
    f_pl.write(pl_text)

create_hunaligna_file(en_text, pl_text, "txt/hunaligna.txt")

<?xml version="1.0" encoding="UTF-8"?> <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2"> <file datatype="plaintext" original="self" source-language="en" target-language="es"> <header> <sxmd:metadata xmlns:sxmd="urn:x-sap:mlt:xliff12:metadata:1.0" xmlns="urn:x-sap:mlt:tsmetadata:1.0"> <object-name>sample</object-name> <collection>KWT</collection> <domain>KWT</domain> <developer>123</developer> <description>sample XLIFF file</description> </sxmd:metadata> </header> <body> <trans-unit> <source>Hello world!</source> <target>Hola mundo!</target> </trans-unit> <trans-unit> <source>File</source> <target>Archivo</target> </trans-unit> <trans-unit> <source>New</source> <target>Nuevo</target> </trans-unit> <trans-unit> <source>Exit</source> <target>Salir</target> </trans-unit> </body> </file> </xliff>

Ćwiczenie 4: Napisz konwerter formatu hunaligna na XLIFF.

import xml.etree.ElementTree as ET

def convert2xliff():
    segments = []
    with open('txt/hunaligna.txt', 'r', encoding='utf-8') as file:
        segment = {}
        for line in file:
            line = line.strip()
            if line.startswith("# Source"):
                segment['source'] = next(file).strip()
            elif line.startswith("# Target"):
                segment['target'] = next(file).strip()
                segments.append(segment)
                segment = {}
            
    xliff = ET.Element('xliff', version="1.2")
    file_elem = ET.SubElement(xliff, 'file', {
    'datatype': "plaintext",
    'original': "file.txt",
    'source-language': 'en',
    'target-language': 'pl'
    })
    body = ET.SubElement(file_elem, 'body')

    for i, segment in enumerate(segments):
        trans_unit = ET.SubElement(body, 'trans-unit', id=str(i))
        source = ET.SubElement(trans_unit, 'source')
        source.text = segment['source']
        target = ET.SubElement(trans_unit, 'target')
        target.text = segment['target']

    tree = ET.ElementTree(xliff)
    tree.write('txt/output.xliff', encoding='UTF-8', xml_declaration=True)


convert2xliff()