Przewidywanie następnego słowa w 5 prostych krokach przy użyciu języka Python

Zapewne miałeś okazję zaobserwować, jak Twój smartfon, podczas wpisywania tekstu, podsuwa Ci propozycje kolejnych słów. To funkcjonalność, która znacznie usprawnia i przyspiesza proces pisania.

Jest to niezwykle komfortowe rozwiązanie. Niezależnie od tego, czy piszesz wiadomości SMS, przeszukujesz sieć, czy tworzysz e-maila, mechanizm podpowiadania tekstu okazuje się bardzo pomocny. Czy jednak zastanawiałeś się kiedyś, w jaki sposób Twój telefon „wie”, jakie słowo zaproponować jako następne?

W tym artykule zaprezentuję, jak stworzyć system predykcji słów, wykorzystując język Python.

Aby łatwiej zrozumieć omawiane zagadnienia, warto posiadać podstawową wiedzę z zakresu NLP (przetwarzania języka naturalnego). Jeżeli jesteś nowicjuszem w tej dziedzinie, nie musisz się martwić. Zachęcam Cię do zapoznania się z naszym artykułem „NLP w pigułce”, gdzie w prosty sposób objaśniamy najważniejsze koncepcje.

Zastosowania prognozowania następnego słowa

  • Systemy przewidywania kolejnego słowa zwiększają efektywność i precyzję pisania na urządzeniach mobilnych, co sprawia, że są nieocenione w aplikacjach do wysyłania wiadomości i komunikacji.
  • Wyszukiwarki internetowe stosują predykcję tekstu, aby sugerować zapytania, co znacząco ułatwia użytkownikom błyskawiczne odnalezienie potrzebnych informacji.
  • Systemy te wspomagają automatyczną korektę błędów w pisowni oraz redukują pomyłki podczas tworzenia tekstu w różnorodnych aplikacjach, takich jak edytory tekstu czy programy pocztowe.
  • Programiści i deweloperzy korzystają z predykcji tekstu podczas pisania kodu, ponieważ podpowiada on odpowiednie nazwy funkcji, metody oraz zmienne.
  • Platformy internetowe i serwisy streamingowe wykorzystują funkcję predykcji tekstu, aby rekomendować użytkownikom dopasowane do ich preferencji treści.

Wspólnie zagłębmy się w fascynujący świat tej techniki NLP i jej praktycznego zastosowania, dokładnie analizując każdy etap procesu.

Przygotowanie Danych

W pierwszej kolejności musimy zaimportować niezbędne biblioteki, które będą potrzebne w naszym projekcie. Następnie zdefiniujemy przykładowy tekst, który posłuży nam do uczenia modelu. Możesz oczywiście zastąpić ten tekst swoimi danymi.

Alternatywnie, możesz skorzystać z gotowych zbiorów danych tekstowych, które bez trudu znajdziesz na platformach takich jak Kaggle.

# Importowanie niezbędnych bibliotek
import nltk
from nltk import ngrams
from collections import defaultdict
import random

Poniżej znajdziesz przykładowe dane tekstowe, które wykorzystamy do przewidywania kolejnego słowa.

# Przykładowe dane tekstowe
text = """
Pewnej świetlistej, rozgwieżdżonej nocy w uroczej, tajemniczej miejscowości Serendipity,
ciekawa młoda podróżniczka o imieniu Amelia rozpoczęła niezwykłą wyprawę.
Z zaufaną lupą w dłoni i niezłomnym duchem, wyruszyła na poszukiwanie nieuchwytnego skarbca Elizejskiego ukrytego głęboko w labiryntowym lesie.
Przemierzając bujne lasy, Amelia spotkała ekscentryczną, gadającą wiewiórkę o imieniu Percival, która mówiła zagadkami i poprowadziła ją do miejsca ukrycia skarbu.
Las lśnił bioluminescencyjną roślinnością, oświetlając jej ścieżkę kalejdoskopem barw.
Wkrótce Amelia dotarła do urwiska z widokiem na zapierający dech w piersiach, lazurowy wodospad, którego spadające wody niosły melodyjną serenadę.
Obok wodospadu stał olbrzymi, porośnięty mchem kamień z tajemniczymi inskrypcjami.
Z pomocą Percivala odczytała starożytne runy i odkryła wejście do skarbca.
Wewnątrz znalazła bogato zdobioną skrzynię, ozdobioną misternym, złotym filigranem.
Po jej otwarciu, symfonia błyszczących klejnotów, promiennych kamieni szlachetnych i lśniących artefaktów powitała ją eterycznym blaskiem.
Skarb Elizejski był jej nagrodą, świadectwem jej nieustraszonej odwagi i niezaspokojonej ciekawości.
Powrót Amelii do Serendipity uczczono radosnym świętowaniem, a jej niezwykła podróż stała się legendą, inspirując innych do podejmowania własnych przygód w cudownym świecie wyobraźni i odkryć.
"""

Możesz dowolnie modyfikować ten tekst, dostosowując go do swoich potrzeb.

Tokenizacja

Kolejnym krokiem jest wstępne przetworzenie i tokenizacja tekstu. Tokenizacja to nic innego jak podział tekstu na pojedyncze słowa, czyli tokeny. W tym celu wykorzystamy bibliotekę nltk w Pythonie.

Aby zapewnić, że model skupi się na słowach, ignorując przy tym wielkość liter oraz znaki interpunkcyjne, przeprowadzamy proces wstępnego przetwarzania. Obejmuje on zamianę wszystkich liter na małe i usunięcie wszelkich znaków interpunkcyjnych.

import nltk

# Tokenizacja tekstu na słowa
words = nltk.word_tokenize(text)

# Wstępne przetwarzanie słów (zmiana na małe litery, usunięcie znaków interpunkcyjnych)
words = [word.lower() for word in words if word.isalnum()]

words

Po wstępnym przetworzeniu i tokenizacji otrzymujemy listę słów, zapisanych małymi literami i pozbawionych interpunkcji.

Ztokenizowane słowa

Tworzenie N-gramów

W tym etapie utworzymy N-gramy, czyli sekwencje N kolejnych słów, które są kluczowe w przetwarzaniu języka naturalnego (NLP).

W naszym przykładzie stworzymy bigramy, gdzie N wynosi 2. Oznacza to, że każdy N-gram będzie składał się z par słów.

Jest to podstawowy element w budowie modelu predykcji kolejnego słowa, ponieważ pozwala analizować sekwencje wyrazów i przewidywać następne słowo na podstawie kontekstu dostarczonego przez poprzednie N-1 słów.

# Określenie rzędu modelu N-gramów (N=2 dla bigramów)
N = 2

# Utworzenie N-gramów ze ztokenizowanych słów
ngrams_list = list(ngrams(words, N))

# Utworzenie słownika defaultdict do przechowywania N-gramów i ich częstotliwości
ngram_freq = defaultdict(int)
for ngram in ngrams_list:
    ngram_freq[ngram] += 1

Te N-gramy będą stanowić fundament do trenowania i implementacji naszego modelu predykcji następnego słowa.

Zdefiniowanie Funkcji

Następnym krokiem jest utworzenie funkcji o nazwie „predict_next_word”, która będzie przewidywać kolejne słowo w zdaniu, na podstawie podanego prefiksu (ciągu słów).

Funkcja ta jest kluczowa dla modelu przewidywania następnego słowa, ponieważ uwzględnia kontekst zapewniony przez prefiks i wykorzystuje go do prognozowania najbardziej prawdopodobnego kolejnego słowa.

W prostych słowach, proces ten wygląda następująco:

  • Funkcja analizuje wszystkie pary słów (bigramy) w naszych danych tekstowych, które zaczynają się od podanego prefiksu (słów poprzedzających brakujące słowo).
  • Zlicza, jak często dane słowo pojawia się w tych parach i sortuje je według częstotliwości występowania, od najczęstszych do najrzadszych.
  • Następnie funkcja sugeruje najczęściej występujące słowo, jako następne słowo po podanym prefiksie.
# Definicja funkcji
def predict_next_word(prefix):
    # Filtruj N-gramy, które zaczynają się od danego prefiksu
    matching_ngrams = [(ngram, freq) for ngram, freq in ngram_freq.items() if ngram[:-1] == prefix]

    if not matching_ngrams:
        return "Brak przewidywania."

    # Sortuj N-gramy według częstotliwości malejąco
    sorted_ngrams = sorted(matching_ngrams, key=lambda x: x[1], reverse=True)

    # Wybierz N-gram o najwyższej częstotliwości jako przewidywanie
    prediction = sorted_ngrams[0][0][-1]

    return prediction

Jest to kluczowy element modelu przewidywania następnego słowa, umożliwiający generowanie kontekstowo odpowiednich propozycji kolejnego słowa w danej sekwencji tekstu.

Testowanie

Ten fragment kodu pozwala na testowanie modelu przy użyciu własnych danych wejściowych. Wpisujesz kilka słów, naciskasz Enter, a model przewiduje następne słowo. Jeśli wprowadzisz coś nieprawidłowo, zostaniesz poproszony o ponowną próbę.

# Ten fragment kodu umożliwia interaktywne testowanie modelu z danymi wprowadzonymi przez użytkownika
user_input = input("Wprowadź prefiks dla prognozowania kolejnego słowa: ").lower().split()
if len(user_input) != N - 1:
    print("Wprowadź poprawny prefiks.")
else:
    prefix = tuple(user_input)
    prediction = predict_next_word(prefix)
    print(f"Przewidywane następne słowo: {prediction}")

Nasz kod utworzy interfejs, gdzie możesz wprowadzić prefiksy i zatwierdzić je Enterem.

Wprowadź prefiks

Po naciśnięciu Enter uzyskasz następne słowo

Przewidywane słowo

W ten sposób przedstawiamy, jak model przewidywania następnego słowa może być wykorzystany w praktyce.

Wyzwania:

  • Precyzja prognozowania kolejnego słowa w dużej mierze zależy od wielkości i jakości danych treningowych. Ograniczone lub zaszumione dane mogą prowadzić do mniej trafnych prognoz.
  • Jeśli słowo wprowadzone w tekście nie istnieje w danych treningowych, jego dokładne przewidzenie staje się niemożliwe.
  • Interpunkcja może mieć wpływ na dokładność prognozowania, szczególnie w językach takich jak angielski, gdzie granice słów bywają niejednoznaczne.
  • Nieprawidłowa tokenizacja lub wstępne przetwarzanie może generować błędne przewidywania.
  • Wiele słów posiada różne znaczenia i kontekst nie zawsze je jednoznacznie definiuje.

Jak zwiększyć dokładność:

  • Wykorzystanie obszerniejszego i bardziej zróżnicowanego zbioru danych treningowych wzmacnia zdolność modelu do rozumienia różnych kontekstów i słów.
  • Rozważ użycie N-gramów wyższego rzędu (np. trigramów) dla szerszego kontekstu, pamiętając o dostępności danych.
  • Gromadź informacje zwrotne od użytkowników i systematycznie udoskonalaj model na podstawie rzeczywistego użytkowania.
  • Regularnie oceniaj wydajność modelu za pomocą odpowiednich metryk i dostosowuj strategie.
  • Można wdrożyć modele oparte na sieciach neuronowych, takie jak LSTM lub Transformer, w celu bardziej wyrafinowanego modelowania kontekstu.

Podsumowanie

W dziedzinie przetwarzania języka naturalnego, przewidywanie kolejnego słowa jest niezwykle cenną umiejętnością. Dzięki tym 5 prostym krokom w języku Python zyskałeś potężne narzędzie do przyspieszenia komunikacji i ulepszenia technologii.

Nie przestawaj zgłębiać tej wiedzy i wykorzystuj ją do ulepszania swoich doświadczeń językowych. Twoja podróż dopiero się zaczęła!

Możesz również dowiedzieć się, jak efektywnie pobierać pliki z adresu URL przy użyciu języka Python.