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

Photo of author

By maciekx

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.


newsblog.pl