Odszumiacz tekstów

Aktualnie świat przetwarzania języka naturalnego został zdominowany przez rozwiązania oparte o modele w architekturze transformers. Różnorodność tych modeli praktycznie zdominowała każdy obszar NLP. Niezależnie jednak od architektury i przeznaczenia mają one wspólną cechę, mianowicie duże zapotrzebowanie na dobrej jakości dane, które wykorzystywane są do treningu tych modeli.

Problem do rozwiązania

Skąd w takim razie wziąć dane? Oczywiście zależy to od konkretnego przypadku i przeznaczenia modelu. A dane, jak to dane, często zapisane są w różnych formatach, w tym jednym z najmniej przystępnych do automatycznego przetwarzania czyli pdf. Koncepcja zapisu w formacie pdf to przede wszystkim prezentacja zapisanej treści, aby w dowolnym czytniku na dowolnym urządzeniu, forma graficzna była taka sama. Jednak podczas automatycznego przetwarzania tych plików można napotkać na problemy z odczytem zawartości.

Przykładowy problem z tekstem, który występuje po odczytaniu złej jakości pliku pdf:

Strona...Tytuł...%6%z%50%|.....Zdecydowana0większość0czerwonych.karłów$należy#do,typu,widmowego%M,%ale%zalicza^się^do^nich^także^wieleHgwiazdHpóźnychHpodtypówHtypuHwidmowegoHKHorazHrzadkoHwystępujące,,najsłabsze,gwiazdy,typu,L.,Maksimum%intensywności%emitowanego%światła%przypada%w%zakresie%światła%czerwonego%lub%nawet%bliskiej%podczerwieni.

Poprawna forma tego tekstu, to:

Zdecydowana większość czerwonych karłów należy do typu widmowego M, ale zalicza się do nich także wiele gwiazd późnych podtypów typu widmowego K oraz rzadko występujące, najsłabsze gwiazdy typu L. Maksimum intensywności emitowanego światła przypada w zakresie światła czerwonego lub nawet bliskiej podczerwieni.

Rozwiązanie problemu

Widząc wiele problemów, które są powtarzalne w dużej skali, opracowaliśmy metodę zaszumiania danych, które przypominają napotkane problemy. Metoda bazuje na prawdopodobieństwach warunkowych oraz odwzorowuje rozkład problemów z przetwarzanych masowo tekstów. Opracowany zbiór zawiera 1M tekstów, z których wylosowaliśmy 100k do procesu uczenia modelu odszumiacza.

Uczenie odszumiacza

Wykorzystaliśmy pretrenowany bazowy model w architekturze T5 allegro/plt5-base, który wyuczyliśmy na problem oczyszczenia danych. Uczenie modelu trwało 5 godzin i 30 minut na jednej karcie NVIDIA GeForce RTX 4090. Wykres loss-function dla zbioru ewaluacyjnego:

Przykład działania

Wyuczony model oczywiście udostępniliśmy na naszym huggingface w repozytorium radlab/polish-denoiser-t5-base.

Wejściem do modelu jest tekst w postaci: denoise: <tekst do odszumienia>. Dla przykładu wyżej, jest to:

denoise: Strona...Tytuł...%6%z%50%|.....Zdecydowana0większość0czerwonych.karłów$należy#do,typu,widmowego%M,%ale%zalicza^się^do^nich^także^wieleHgwiazdHpóźnychHpodtypówHtypuHwidmowegoHKHorazHrzadkoHwystępujące,,najsłabsze,gwiazdy,typu,L.,Maksimum%intensywności%emitowanego%światła%przypada%w%zakresie%światła%czerwonego%lub%nawet%bliskiej%podczerwieni.

Wyjście z modelu wygląda następująco:

Zdecydowana większość czerwonych karłów należy do typu widmowego M, ale zalicza się do nich także wiele gwiazd późnych podtypów typu widmowego K oraz rzadko występujące, najsławsze gwiazdy typu L. Maksimum intensywności emitowanego światła przypada w zakresie światła czerwonego lub nawet bliskiej podczerwieni.

Przykładowy kod, który umożliwia odpalenie modelu dla tekstu z przytaczanego przykładu:

from transformers import T5ForConditionalGeneration, T5Tokenizer


def do_inference(text, model, tokenizer):
    input_text = f"denoise: {text}"
    inputs = tokenizer.encode(
        input_text,
        return_tensors="pt",
        max_length=256,
        padding="max_length",
        truncation=True,
    )

    corrected_ids = model.generate(
        inputs,
        max_length=256,
        num_beams=5,
        early_stopping=True,
    )

    corrected_sentence = tokenizer.decode(corrected_ids[0], skip_special_tokens=True)
    return corrected_sentence


model = T5ForConditionalGeneration.from_pretrained("radlab/polish-denoiser-t5-base")
tokenizer = T5Tokenizer.from_pretrained("radlab/polish-denoiser-t5-base")

text_str = "Strona...Tytuł...%6%z%50%|.....Zdecydowana0większość0czerwonych.karłów$należy#do,typu,widmowego%M,%ale%zalicza^się^do^nich^także^wieleHgwiazdHpóźnychHpodtypówHtypuHwidmowegoHKHorazHrzadkoHwystępujące,,najsłabsze,gwiazdy,typu,L.,Maksimum%intensywności%emitowanego%światła%przypada%w%zakresie%światła%czerwonego%lub%nawet%bliskiej%podczerwieni."

print(do_inference(text_str, model, tokenizer))

Zapraszamy do korzystania, smacznego 🙂

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *