15 KiB
Komputerowe wspomaganie tłumaczenia
3. Terminologia [laboratoria]
Rafał Jaworski (2021)
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ź: metal cabinets guides. Proz.com
W dalszych ćwiczeniach skupimy się jednak na odszukaniu terminu specjalistycznego w tekście. W tym celu będą potrzebne dwie operacje:
- Przygotowanie słownika specjalistycznego.
- 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).
import re
def terminology_lookup(text, dictionary):
pattern = re.compile(r'\b(?:' + '|'.join(dictionary) + r')\b', re.IGNORECASE)
matches = pattern.finditer(text)
occurance = ''
for match in matches:
occurance += (f"({match.start()}, {match.end()})")
return occurance
terminology_lookup(text, dictionary)
'(80, 91)(164, 175)(468, 475)(516, 523)(533, 540)'
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_)
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(text, dictionary):
nlp = spacy.load("en_core_web_sm")
doc = nlp(text)
word_forms = set()
for word in dictionary:
word_forms.add(word)
for token in doc:
if token.text.lower() == word:
word_forms.add(token.lemma_)
matches = []
for token in doc:
if token.text.lower() in word_forms:
matches.append((token.idx, token.idx + len(token)))
occurrences = ''
for match in matches:
occurrences += f"({match[0]}, {match[1]})"
return occurrences
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):
nlp = spacy.load("en_core_web_sm")
doc = nlp(text)
nouns = [token.text for token in doc if token.pos_ == "NOUN"]
return nouns
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):
nlp = spacy.load("en_core_web_sm")
doc = nlp(text)
tally = {}
for token in doc:
if token.pos_ != "NOUN":
continue
lemma = token.lemma_.lower()
if lemma in tally:
tally[lemma] += 1
else:
tally[lemma] = 1
return tally
Ćwiczenie 6: Rozszerz powyższy program o ekstrację czasowników i przymiotników.
def extract_terms(text):
nlp = spacy.load("en_core_web_sm")
doc = nlp(text)
tally = {}
for token in doc:
if token.pos_ not in ['NOUN', 'VERB', 'ADJ']:
continue
lemma = token.lemma_.lower()
if lemma in tally:
tally[lemma] += 1
else:
tally[lemma] = 1
return tally