KWT-2024/lab/lab_03.ipynb
2024-04-13 14:10:00 +02:00

16 KiB

Logo 1

Komputerowe wspomaganie tłumaczenia

3. Terminologia [laboratoria]

Rafał Jaworski (2021)

Logo 2

Na dzisiejszych zajęciach zajmiemy się bliżej słownikami używanymi do wspomagania tłumaczenia. Oczywiście na rynku dostępnych jest bardzo wiele słowników w formacie elektronicznym. Wiele z nich jest gotowych do użycia w SDL Trados, memoQ i innych narzędziach CAT. Zawierają one setki tysięcy lub miliony haseł i oferują natychmiastową pomoc tłumaczowi.

Problem jednak w tym, iż często nie zawierają odpowiedniej terminologii specjalistycznej - używanej przez klienta zamawiającego tłumaczenie. Terminy specjalistyczne są bardzo częste w tekstach tłumaczonych ze względu na następujące zjawiska:

  • Teksty o tematyce ogólnej są tłumaczone dość rzadko (nikt nie tłumaczy pocztówek z pozdrowieniami z wakacji...)
  • Te same słowa mogą mieć zarówno znaczenie ogólne, jak i bardzo specjalistyczne (np. "dziedziczenie" w kontekście prawnym lub informatycznym)
  • Klient używa nazw lub słów wymyślonych przez siebie, np. na potrzeby marketingowe.

Nietrywialnymi zadaniami stają się: odnalezienie terminu specjalistycznego w tekście źródłowym oraz podanie prawidłowego tłumaczenia tego terminu na język docelowy

Brzmi prosto? Spróbujmy wykonać ręcznie tę drugą operację.

Ćwiczenie 1: Podaj tłumaczenie terminu "prowadnice szaf metalowych" na język angielski. Opisz, z jakich narzędzi skorzystałaś/eś.

Odpowiedź: Wynik z Google Translate to metal cabinet guides

W dalszych ćwiczeniach skupimy się jednak na odszukaniu terminu specjalistycznego w tekście. W tym celu będą potrzebne dwie operacje:

  1. Przygotowanie słownika specjalistycznego.
  2. Detekcja terminologii przy użyciu przygotowanego słownika specjalistycznego.

Zajmijmy się najpierw krokiem nr 2 (gdyż jest prostszy). Rozważmy następujący tekst:

text =  " For all Java programmers:"
text += " This section explains how to compile and run a Swing application from the command line."
text += " For information on compiling and running a Swing application using NetBeans IDE,"
text += " see Running Tutorial Examples in NetBeans IDE. The compilation instructions work for all Swing programs"
text += " — applets, as well as applications. Here are the steps you need to follow:"
text += " Install the latest release of the Java SE platform, if you haven't already done so."
text += " Create a program that uses Swing components. Compile the program. Run the program."

Załóżmy, że posiadamy następujący słownik:

dictionary = ['program', 'application', 'applet' 'compile']

Ćwiczenie 2: Napisz program, który wypisze pozycje wszystkich wystąpień poszczególnych terminów specjalistycznych. Dla każdego terminu należy wypisać listę par (pozycja_startowa, pozycja końcowa).

def terminology_lookup():
    for term in dictionary:
        start = 0
        while True:
            start = text.find(term, start)
            if start == -1:
                break
            end = start + len(term)
            print(f'{term}: ({start}, {end})')
            start = end
terminology_lookup()
program: (14, 21)
program: (291, 298)
program: (468, 475)
program: (516, 523)
program: (533, 540)
application: (80, 91)
application: (164, 175)
application: (322, 333)

Zwykłe wyszukiwanie w tekście ma pewne wady. Na przykład, gdy szukaliśmy słowa "program", złapaliśmy przypadkiem słowo "programmer". Złapaliśmy także słowo "programs", co jest poprawne, ale niepoprawnie podaliśmy jego pozycję w tekście.

Żeby poradzić sobie z tymi problemami, musimy wykorzystać techniki przetwarzania języka naturalnego. Wypróbujmy pakiet spaCy:

pip3 install spacy

oraz

python3 -m spacy download en_core_web_sm

import spacy
nlp = spacy.load("en_core_web_sm")

doc = nlp(text)

for token in doc:
    print(token.lemma_, end=' ')
  for all Java programmer : this section explain how to compile and run a swing application from the command line . for information on compile and run a swing application use NetBeans IDE , see run Tutorial Examples in NetBeans IDE . the compilation instruction work for all Swing program — applet , as well as application . here be the step you need to follow : install the late release of the Java SE platform , if you have not already do so . create a program that use swing component . compile the program . run the program . 

Sukces! Nastąpił podział tekstu na słowa (tokenizacja) oraz sprowadzenie do formy podstawowej każdego słowa (lematyzacja).

Ćwiczenie 3: Zmodyfikuj program z ćwiczenia 2 tak, aby zwracał również odmienione słowa. Na przykład, dla słowa "program" powinien znaleźć również "programs", ustawiając pozycje w tekście odpowiednio dla słowa "programs". Wykorzystaj właściwość idx tokenu.

def terminology_lookup():
    for term in dictionary:
        for token in doc:
            if token.lemma_ == term:
                print(f'{token}: ({token.idx}, {token.idx + len(token)})')
terminology_lookup()
programs: (291, 299)
program: (468, 475)
program: (516, 523)
program: (533, 540)
application: (80, 91)
application: (164, 175)
applications: (322, 334)

Teraz czas zająć się problemem przygotowania słownika specjalistycznego. W tym celu napiszemy nasz własny ekstraktor terminologii. Wejściem do ekstraktora będzie tekst zawierający specjalistyczną terminologię. Wyjściem - lista terminów.

Przyjmijmy następujące podejście - terminami specjalistycznymi będą najcześćiej występujące rzeczowniki w tekście. Wykonajmy krok pierwszy:

Ćwiczenie 4: Wypisz wszystkie rzeczowniki z tekstu. Wykorzystaj możliwości spaCy.

def get_nouns(text):
    doc = nlp(text)
    return [token.text for token in doc if token.pos_ == 'NOUN']
get_nouns(text)
['programmers',
 'section',
 'Swing',
 'application',
 'command',
 'line',
 'information',
 'Swing',
 'application',
 'compilation',
 'instructions',
 'programs',
 'applets',
 'applications',
 'steps',
 'release',
 'platform',
 'program',
 'Swing',
 'components',
 'program',
 'program']

Teraz czas na podliczenie wystąpień poszczególnych rzeczowników. Uwaga - różne formy tego samego słowa zliczamy razem jako wystąpienia tego słowa (np. "program" i "programs"). Najwygodniejszą metodą podliczania jest zastosowanie tzw. tally (po polsku "zestawienie"). Jest to słownik, którego kluczem jest słowo w formie podstawowej, a wartością liczba wystąpień tego słowa, wliczając słowa odmienione. Przykład gotowego tally:

tally = {"program" : 4, "component" : 1}

Ćwiczenie 5: Napisz program do ekstrakcji terminologii z tekstu według powyższych wytycznych.

def extract_terms(text):
    doc = nlp(text)
    terms = {}
    for token in doc:
        if token.pos_ == 'NOUN':
            term = token.lemma_
            terms[term] = terms.get(term, 0) + 1
    return terms
extract_terms(text)
{'programmer': 1,
 'section': 1,
 'swing': 3,
 'application': 3,
 'command': 1,
 'line': 1,
 'information': 1,
 'compilation': 1,
 'instruction': 1,
 'program': 4,
 'applet': 1,
 'step': 1,
 'release': 1,
 'platform': 1,
 'component': 1}

Ćwiczenie 6: Rozszerz powyższy program o ekstrację czasowników i przymiotników.

# Extract and count nouns, verbs and adjectives
def extract_terms(text):
    doc = nlp(text)
    terms = {"nouns": {}, "verbs": {}, "adjectives": {}}
    for token in doc:
        if token.pos_ == 'NOUN':
            term = token.lemma_
            terms["nouns"][term] = terms["nouns"].get(term, 0) + 1
        elif token.pos_ == 'VERB':
            term = token.lemma_
            terms["verbs"][term] = terms["verbs"].get(term, 0) + 1
        elif token.pos_ == 'ADJ':
            term = token.lemma_
            terms["adjectives"][term] = terms["adjectives"].get(term, 0) + 1

    return terms
from pprint import pprint

pprint(extract_terms(text))
{'adjectives': {'late': 1},
 'nouns': {'applet': 1,
           'application': 3,
           'command': 1,
           'compilation': 1,
           'component': 1,
           'information': 1,
           'instruction': 1,
           'line': 1,
           'platform': 1,
           'program': 4,
           'programmer': 1,
           'release': 1,
           'section': 1,
           'step': 1,
           'swing': 3},
 'verbs': {'compile': 3,
           'create': 1,
           'do': 1,
           'explain': 1,
           'follow': 1,
           'install': 1,
           'need': 1,
           'run': 4,
           'see': 1,
           'use': 2,
           'work': 1}}