KWT-2024/lab/lab_11.ipynb

8.7 KiB

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.

def sentence_split(text):
    def purge(text_l: str) -> str:
        return text_l.strip('.').strip()
    index = 0
    result = []
    for match in regex.finditer(r'\. \p{Lu}|\n', text):
        result.append(purge(text[index:match.start(0)]))
        index = match.start(0)
    result.append(purge(text[index:len(text)]))

    return result

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

Dwa wyjatki to zdania zakończone wykrzyknikiem i zdania zakończone znakiem zapytania

def sentence_split(text):
    def purge(text_l: str) -> str:
        return text_l.strip('.').strip('?').strip('!').strip()
    index = 0
    result = []
    for match in regex.finditer(r'(\.|\?|\!) \p{Lu}|\n', text):
        result.append(purge(text[index:match.start(0)]))
        index = match.start(0)
    result.append(purge(text[index:len(text)]))

    return result

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.

_Linki do pobrania tego progamu(ftp://ftp.mokk.bme.hu/Hunglish/src/hunalign/latest/hunalign-1.1-windows.zip), dostępne w README na githubie, nie działają.

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:

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

def convert2xliff(hunalign_file_name):
    return 0