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:
- Podziału tekstu źródłowego oraz docelowego na zdania.
- 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:
Ćwiczenie 4: Napisz konwerter formatu hunaligna na XLIFF.
def convert2xliff(hunalign_file_name):
return 0