Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'NLP'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 1 wynik

  1. Witajcie, w artykule zajmiemy się klasyfikacją tekstu z wykorzystaniem sieci neuronowej. W kontekście robotyki, klasyfikacji możemy użyć w sterowaniu robotem za pomocą języka naturalnego. Przykład można zobaczyć w wątku AgeBot. Przetwarzanie języka naturalnego (NLP) jest obszernym tematem, dlatego nie będziemy wdawać się zbytnio w szczegóły, ale przedstawię ogólną koncepcję i narzędzia przydatne do przetwarzania tekstu - da Wam punkt startowy w tej ciekawej dziedzinie 🙂 Aby utrzymać artykuł we w miarę któtkiej formie zawierającej samo „mięso” założę, że Python jest Wam znany. Będziemy przetwarzać zdania w języku angielskim, który jest jednym z łatwiejszych języków w NLP. Język polski jest problematyczny (chociaż do niego też są narzędzia), więcej można dowiedzieć się z tego filmu. Niniejszy artykuł objaśni bardziej proces normalizacji tekstu, da Wam informacje czego dalej szukać oraz pokaże jak klasyfikacja tekstu z grubsza działa. Konkretną implementację udostępniłem na GitHubie (link), którą możecie traktować jako bazę, aby zrobić podobne sterowanie w Waszych robotach 🙂 Polecam jednak przestudiować podlinkowany przykład kodu, aby dokładniej zrozumieć, co tam się dzieje lub rozwiać wątpliwości po przeczytaniu poniższych akapitów. Zacznijmy od początku Wspomniałem o sieci neuronowej, ale co to właściwie jest i jak ona działa? Polecam ten film. Wiedza jak działa sieć neuronowa nie jest jednak niezbędna, aby korzystać z powyższego kodu 🙂 Jeśli korzystacie w swoich robotach z Raspberry PI, spokojnie powinniście bez problemu wykonywać poniższe czynności oraz uruchomić przykładowy kod na tejże platformie. Zainstalujmy potrzebne zależności: pip3 install tensorflow nltk tflearn numpy Tensorflow jest biblioteką, dzięki której możemy budować modele uczenia maszynowego. Tflearn jest nakładką, która ułatwia korzystanie z Tensorflow. Z Numpy korzystać będzie Tensorflow. Nltk natomiast jest biblioteką, która zawiera szereg przydatnych funkcji, jeśli zajmujemy się NLP. Po zainstalowaniu, przygotujmy bibliotekę nltk do użytku za pomocą konsoli Pythona (po tym kroku można uruchomić skrypt z GitHuba): import nltk nltk.download(‘punkt’) Pora na mięso Jeśli mamy sterować robotem, to przyjmijmy sobie jedno zdanie na którym objaśnię kolejne etapy - niech to będzie „move forward please”. W pierwszym kroku następuje tzw. tokenizacja – podzielenie zdania na mniejsze części, które nazywamy tokenami. W przypadku przyjętego zdania, dostaniemy: [‘move’, ‘forward’, ‘please’] Używamy do tego funkcji „word_tokenize” z biblioteki „nltk”. Samo zdanie zostało podzielone na słowa, jednak wynik przy trudniejszych zdaniach będzie wyglądał nieco inaczej. Spróbujmy „robot didn’t move!”. [‘robot’, ‘did’, „n’t”, ‘moved’, ‘!’] Pamiętajmy jednak, że języki mają różne reguły, więc rozbicie zdania za pomocą „spacji” niekoniecznie będzie poprawnym sposobem 🙂 W powyższym „n’t” możemy zastąpić na „not”, gdyż te dwa słowa oznaczają to samo. Jeśli tego nie zrobimy, oba będą traktowane jako dwa osobne słowa, co może zakłócić trafność klasyfikacji. Kolejnym krokiem jest stemming. Co to takiego? Jest to redukcja konkretnych słów do ich podstawowych form. Co dzięki stemmingowi osiągamy? Jedną intencję można wyrazić na kilka sposobów, używając różnych odmian danych słów, jednak te zdania nadal oznaczają jedno. Istnieje wiele algorytmów, możecie pobawić się nimi tutaj. My użyjemy algorytmu Lancaster, który jest dosyć agresywny. Przykładowo zdanie: Programmer programmed a program which programs new programs zostanie zredukowane do formy program program a program which program new program Ostatnim krokiem jest normalizacja danych w taki sposób, aby proces był powtarzalny. Tworzymy więc sobie słownik zawierający unikalne słowa, w którym umieszczamy tokeny po stemmingu posortowane wg. alfabetu. Dane treningowe dla modelu, jako że sieć neuronowa pracuje na liczbach, musimy przekształcić... na liczby 🙂 . Zakładając, że nasz słownik już po tokenizacji i stemmingu wygląda następująco: [‘forward’, ‘mov’, ‘pleas’] Tworzymy pierwszy wiersz danych trenujących korzystając z przykładów zdań. W naszym przypadku jest jedno zdanie, ale słowo „please” jest właściwie opcjonalne. Bez „please” po prostu będziemy mniej mili 😉 Tworzymy nową tablicę i iterujemy po słowniku. Jeśli napotkamy w nim słowo, które występuje w zdaniu, wstawiamy do nowo utworzonej tablicy 1, w przeciwnym wypadku 0. Ilość elementów w jednym wierszu danych trenujących musi być równa ilości słów w słowniku oraz ich kolejność musi być identyczna, stąd taki zabieg. Uzyskujemy następujące dane treningowe: Dla zdania „move forward please”: [1, 1, 1] Dla zdania „move forward”: [1, 1, 0] Analogicznie postępujemy z danymi wyjściowymi, czyli naszymi klasami. Tworzymy tablicę dostępnych, unikalnych oraz posortowanych alfabetycznie klas. Przyjmijmy, że nasze zdanie będzie sklasyfikowane jako „move” oraz do przykładów dodamy zdanie „hello there” oznaczone klasą „greeting”: [‘greeting’, ‘move’] Wyjściem będzie: Dla zdania „move forward please”: [0, 1] Dla zdania „move forward”: [0, 1] (to jest ta sama klasa zdania) Dla zdania „hello there”: [1, 0] Skupmy się jednak dalej na naszym bazowym zdaniu „move forward please”. Dane trenujące, które uzyskamy w całym tym procesie, czyli: X = [[1, 1, 1], [1, 1, 0]] Y = [[0, 1], [0, 1]] używamy, aby wytrenować sieć neuronową. Po wytrenowaniu, klasyfikując konkretne zdania, proces powtarzamy – sprowadzamy zdanie do liczb i klasyfikujemy. Gdy mamy już wytrenowany model (sieć), używamy go w celu klasyfikacji nowych (lub tych z przykładów) zdań. Ostatecznie pisząc do robota „move forward please” wiemy, że autorowi chodzi o „move”, ponieważ wyjście sieci neuronowej to prawdopodobieństwo z jaką algorytm jest "pewien" danej klasy. Suma tych liczb, przez użycie funkcji aktywacyjnej "softmax" będzie równać się jeden, niezależnie od ilości klas. Zatem programujemy programujemy robota zależnie od naszych potrzeb 🙂 W tym artykule to już wszystko. Polecam jeszcze raz, aby zapoznać się z kodem na GitHubie. Jeśli coś było niejasne, chętnie odpowiem na Wasze pytania. PS: Celowo pominąłem część przykładów z kodem, ponieważ zależnie od tego jakiej biblioteki użyjecie, nazwy funkcji mogą się różnić.
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.