Chatbot z Pytonem : Przygotowanie danych do szkolenia bota

https://szkolazpieklarodem.pl/

Zawsze ważne jest, aby mieć dane dobrej jakości przed wykonaniem jakiegokolwiek uczenia maszynowego. Do szkolenia naszego chatbota potrzebujemy również danych; rozmowa pomiędzy użytkownikiem a chatbotem to dane, na podstawie których musimy trenować nasze modele. Czasami trudno jest znaleźć w Internecie zbiór danych odpowiadający naszym potrzebom. Powinniśmy poświęcić potrzebny czas na zebranie danych. Możemy poprosić naszych przyjaciół i rodzinę o dostarczenie nam przykładowego tekstu rozmowy na temat interakcji z rodzajem bota, który budujesz. Niektórzy ludzie tworzą przykładowe aplikacje do tego samego celu i pozyskują dane w ramach crowdsourcingu. Zatem lepsze dane, lepszy model i lepsze reakcje chatbota. Jeśli chodzi o przygotowanie danych, Rasa nie pozostawia kamienia bez kamienia i jest wyposażona w fajną funkcję zwaną interaktywną nauką. Pomaga w łatwym generowaniu danych historii, a także uczy modelu zarządzania dialogami w miarę dodawania danych historii. Można to nazwać szkoleniem ML w czasie rzeczywistym. Tak więc, w miarę dodawania danych z historii, dowiadujemy się, czy nasz model generuje prawidłowe dane wyjściowe, czy nie. Co najważniejsze, po dodaniu nowych historii możemy zobaczyć, czy model poprawia się, czy pogarsza. W większości przypadków będzie lepiej, ponieważ będziemy w pewnym sensie uczyć się przez wzmacnianie, mówiąc modelowi uczenia się, aby się oduczał i uczył na nowo – prawie tak samo robią ludzie.

Per-āa : W poszukiwaniu świeżego oddechu

https://szkolazpieklarodem.pl/

Z ustami pełnymi ropni oddech starożytnych Egipcjan byłby, delikatnie mówiąc, nieco dojrzały. Egipcjanie jednak starali się czyścić zęby postrzępionym końcem gałązki. Ta technika zaowocowała bardzo wypolerowanym wyglądem zębów wielu starożytnych egipskich mumii. W dokumentacji medycznej znajdują się liczne recepty na odświeżanie oddechu, w tym żucie cynamonu, kadzidła, mirry i pachnących roślin zmieszanych z miodem.

Chatbot z Pytonem : Pisanie niestandardowych akcji Chatbota

https://szkolazpieklarodem.pl/

Jak wiemy, za każdym razem, gdy zostanie wywołana UtterAction, nasz bot odpowie pełnym tekstem zdefiniowanym w szablonie dla tej Akcji. Ale co się stanie, gdy zostanie uruchomiona jakaś niestandardowa akcja? W tej sekcji napiszemy kod w Pythonie, aby utworzyć niestandardowe akcje, których możemy użyć do wykonywania wywołań API i praktycznie wszystkich innych rzeczy, które można zrobić w Pythonie. Stwórzmy nowy plik o nazwie action.py w katalogu naszego projektu (czyli w naszym przypadku w folderze horoskop_bot).

from __future__ import absolute_import

from __future__ import division

from __future__ import print_function

from __future__ import unicode_literals

import requests

from rasa_core_sdk import Action

from rasa_core_sdk.events import SlotSet

class GetTodaysHoroscope(Action):

def name(self):

return “get_todays_horoscope”

def run(self, dispatcher, tracker, domain):

# type: (Dispatcher, DialogueStateTracker, Domain) -> List[Event]

user_horoscope_sign = tracker.get_slot(‘horoscope_sign’)

base_url = http://horoscope-api.herokuapp.com/horoscope/{day}/{sign}

url = base_url.format(**{‘day’: “today”, ‘sign’: user_horoscope_

sign})

#http://horoscope-api.herokuapp.com/horoscope/today/capricorn

res = requests.get(url)

todays_horoscope = res.json()[‘horoscope’]

response = “Your today’s horoscope:\n{}”.format(todays_horoscope)

dispatcher.utter_message(response)

return [SlotSet(“horoscope_sign”, user_horoscope_sign)]

Jak widzimy, w naszej akcji występują dwie metody zwane GetTodaysHoroskop. Pierwsza nazwa metody zwraca po prostu nazwę akcji. Druga metoda jest uruchamiana i, jak omówiono wcześniej, jest metodą, która faktycznie wykonuje zadanie, wykonując napisaną przez nas logikę biznesową. W naszej metodzie korzystamy z API typu open source, którego kod znajduje się na githubie [https://github.com/tapasweni-pathak/Horoskop-API] Adres URL API wygląda następująco:

http://horoskop-api.herokuapp.com/horoskop/today/capricorn

który zwraca dane w formacie JSON:

{

“date”: “2018-08-29”,

“horoscope”: “You will be overpowered with nostalgia and may long to get

in touch with old pals. And as Ganesha says, chances are that you may

take a liking to your ex-lover, while simultaneously strengthening your

social standing. All in all, the day will be a productive one.”,

“sunsign”: “capricorn”

}

Jak widać w metodzie run, konwertujemy odpowiedź z API na obiekt JSON Pythona, a następnie uzyskujemy dostęp do klucza „horoskop” z JSON, aby uzyskać rzeczywisty horoskop. Po pobraniu aktualnego horoskopu z JSON-a formułujemy odpowiedź i wysyłamy ją z powrotem do użytkownika za pomocą obiektu dyspozytora i jego metody utter_message. Na koniec ustawiamy slot metodą SlotSet. SlotSet przypomina zapisywanie zmiennych, które odkryłeś na podstawie odpowiedzi użytkowników, aby móc ich używać w dowolnym momencie w kodzie podczas toku konwersacji.

Uwaga: Korzystając z powyższego API, możemy uzyskać dzisiejszy horoskop, podając znak horoskopu. Możesz swobodnie korzystać z własnego API lub bazy danych. Wystarczy zastąpić wywołanie API innym źródłem, którego chcesz użyć.

Podobnie jak dodaliśmy akcję GetTodaysHoroskop w pliku action.py, dodamy także akcję SubscribeUser. Nie będziemy używać żadnej bazy danych do przechowywania preferencji subskrypcji użytkownika, ale kiedy budujesz chatbota dla prawdziwych użytkowników, być może będziesz musiał mieć user_ids, które możesz powiązać z ich subskrypcjami w bazie danych

Poniżej przedstawiono działanie akcji SubskrybujUżytkownika:

class SubscribeUser(Action):

def name(self):

return “subscribe_user”

def run(self, dispatcher, tracker, domain):

# type: (Dispatcher, DialogueStateTracker, Domain) -> List[Event]

subscribe = tracker.get_slot(‘subscribe’)

if subscribe == “True”:

response = “You’re successfully subscribed”

if subscribe == “False”:

response = “You’re successfully unsubscribed”

dispatcher.utter_message(response)

return [SlotSet(“subscribe”, subscribe)]

W ten sposób możemy napisać tyle akcji niestandardowych, ile potrzeba. Następnym krokiem są dane. Model zarządzania dialogami Rasa jest szkolony na podstawie rzeczywistych rozmów prowadzonych przez użytkowników i chatbota. Ważną kwestią jest to, że te rozmowy muszą zostać przekształcone w format opowieści. Historia to nic innego jak faktyczna rozmowa między użytkownikiem a chatbotem, podczas której dane wejściowe użytkownika są przekształcane w intencje i byty, a odpowiedzi zwracane przez chatbota są traktowane jako działania, które chatbot ma wywołać, gdy zajdzie taka potrzeba.

Jeden z przykładów tego, jak może wyglądać prawdziwa rozmowa pomiędzy użytkownikiem a chatbotem w formie opowieści, przedstawia poniższa tabela.

Scenariusz I

Użytkownik HoroskopBot

Witam! ” całkowite_powitanie

Chcę poznać mój horoskop na dziś { utter_ask_horoskop_sign

Mój znak to Koziorożec: działania.GetTodaysHoroskop

Czy możesz subskrybować mnie, aby otrzymywać aktualizacje: action.SubscribeUser

Scenariusz II

Użytkownik: HoroskopBot

Witam! : całkowite_powitanie

Chcę poznać mój horoskop na dziś: utter_ask_horoskop_sign

Nie znam mojego znaku: utter_ask_dob

12-12: działania.GetTodaysHoroskop

Nie omówiliśmy jeszcze scenariusza w kodzie, w którym użytkownik nie zna swojego znaku horoskopu, ale zna swój DOB. W tym przypadku nasz kod wymaga pewnych modyfikacji, aby uzyskać jednostki DATA i MIESIĄC, gdy nie znaleziono wartości horoskop_sign. Moglibyśmy użyć wartości DD-MM, aby sprawdzić znak horoskopu, a następnie jawnie wywołać metodę GetTodaysHoroskop lub wytrenować model w ten sposób.

Per-āa : Na wyczerpaniu

https://szkolazpieklarodem.pl/

Najczęstszym problemem wszystkich Egipcjan, bez względu na status czy pozycję społeczną, było zużycie gryzących powierzchni zębów. Ten stan spowodowany był przede wszystkim kwarcem, szarogłazem, amfibolem, miką i piaskiem w ziarnie, które następnie mielono na mąkę. Wszystkie te substancje były obecne w starożytnym chlebie i powodowały tarcie o gryzącą powierzchnię zęba podczas żucia. To, czy te substancje zostały dodane przez wiatr, czy celowo, jest dyskusyjne – tak czy inaczej, zużycie zębów było znaczne. Zęby były zużyte do tego stopnia, że ​​szkliwo całkowicie zniknęło, odsłaniając wrażliwą miazgę wewnętrzną. Odsłonięta miazga zębowa została następnie zainfekowana, powodując ropnie, obrzęk i ogromny ból. W wielu przypadkach ropnie były w zaawansowanym stadium i zjadały kość szczęki, powodując utratę zębów. Niewiele można było zrobić, aby wyleczyć te ropnie, poza osuszeniem rany. Lekarz lub dentysta użył krzemiennego noża, aby naciąć infekcję i włożył wydrążoną trzcinę, aby ułatwić wypływ ropy z ropnia. Starożytni lekarze wiedzieli, że jeśli zostawią ropę w ropniu, to się powtórzy i będą musieli ponownie przejść przez cały proces. Wydaje się, że starożytni Egipcjanie uważali, że ból zęba jest normalny, ponieważ zapisy dotyczące nieobecności z Deir el Medina, które zawierają wymówki za dni wolne od pracy, pokazują, że nikt nie wziął urlopu z powodu bólu zęba. (Wiem na pewno, że gdybym miał płaczące ropnie, wziąłbym przynajmniej kilka dni wolnego!) Mówiąc bardziej pozytywnie, starożytni Egipcjanie nie cierpieli na próchnicę (próchnicę) z powodu bardzo ograniczonego cukru w ​​ich dieta. Elita słodziła jedzenie miodem, ale był to luksus poza zasięgiem większości ludzi. Tylko garstka mumii wykazuje początek próchnicy, ale prawie każda dorosła mumia ma ślady na gryzącej powierzchni zębów.

Chatbot z Pytonem : Tworzenie pliku domeny dla Chatbota

https://szkolazpieklarodem.pl/

Pierwszym i najważniejszym zadaniem do wykonania podczas budowania chatbota przy użyciu stosu Rasa jest utworzenie pliku domeny. Zgodnie z dokumentacją Rasa „Domena definiuje wszechświat, w którym działa Twój bot. Określa intencje, elementy, miejsca i działania, o których powinien wiedzieć bot. Opcjonalnie może również zawierać szablony tego, co może powiedzieć Twój bot. Teraz wiesz, dlaczego musieliśmy być wcześniej przygotowani na tę sytuację, rozumiejąc podstawowe koncepcje Rasy.

Stwórzmy plik DefaultDomain z definicją YAML. Rasa używa plików .yml do zdefiniowania formatu domeny. Pierwotnie YAML miał rzekomo oznaczać Yet Another Markup Language, przedstawiając jego użycie jako języka znaczników, ale później zmieniono go tak, aby był rozumiany jako YAML Ain’t Markup Language, rekurencyjny akronim, aby rozróżnić jego cel jako zorientowany na dane, a nie znaczniki dokumentu język. Wróćmy teraz do naszego katalogu rasa-nlu Jupyter Notebook i zacznijmy tworzyć pliki. Pamiętaj, że możemy zapisać cały nasz kod w oddzielnych plikach za pomocą wiersza poleceń i edytować go za pomocą edytora. Uważam, że Jupyter Notebook jest bardziej interaktywny i łatwo dostępny do przeglądania plików. Niezależnie od tego, w czym czujesz się komfortowo, rób to, ale dobrze jest znać większość funkcji, które zapewnia Jupyter Notebook. Przejdź do głównego katalogu horoskop_bot i utwórz plik, nazwijmy go horoskop_domena.yml. Poniżej znajduje się zawartość pliku horoskop_domena.yml dla naszego bota:

slots:

horoscope_sign:

type: text

DD:

type: text

MM:

type: text

subscribe:

type: bool

intents:

– greeting

– get_horoscope

– subscription

– dob_intent

entities:

– horoscope_sign

– DD

– MM

– subscribe

– dob_intent

templates:

utter_greet:

– ‘Hello! How are you doing today?’

utter_ask_horoscope_sign:

– ‘What is your horoscope sign?’

utter_ask_dob:

– ‘What is your DOB in DD-MM format?’

utter_subscribe:

– ‘Do you want to subscribe for daily updates?’

actions:

– utter_greet

– utter_ask_horoscope_sign

– utter_ask_dob

– utter_subscribe

– get_todays_horoscope

– subscribe_user

Jak widać, plik domeny składa się z pięciu ważnych części: intencji, encji, slotów, szablonów i akcji, o których mówiliśmy wcześniej. Zauważ, że dla każdego szablonu zdefiniowana jest utterAction, taka jak utter_greet, utter_ask_horoskop_sign i utter_ask_dob. Musimy mieć zdefiniowany szablon w sekcji szablonów o tej samej nazwie. Jak widać w naszym przykładzie zdefiniowanych jest głównie pięć akcji, gdzie pierwsze trzy akcje służą jedynie do przekazania użytkownikowi tekstu szablonu, natomiast dwie ostatnie wymagają od nas albo pobrania danych z bazy danych, albo utworzenia API zadzwoń, aby uzyskać horoskop na dany dzień i zwrócić go użytkownikowi. Również w przypadku akcji subskrybuj_użytkownika należy wykonać operację polegającą na dodaniu aktualnego użytkownika do listy subskrybentów w bazie danych. Te akcje zdefiniowane przez użytkownika nazywane są akcjami niestandardowymi. Aby mieć takie niestandardowe akcje, musimy napisać, co bot ma zrobić, gdy te akcje zostaną uruchomione. W następnej sekcji nauczymy się pisać akcje niestandardowe.

Per-āa : Otwarcie się i powiedzenie „Agh”: stomatologia

https://szkolazpieklarodem.pl/

Starożytni Egipcjanie bardzo cierpieli z powodu problemów z zębami i wyraźnie ich próg bólu musiał być bardzo wysoki, biorąc pod uwagę okropne rzeczy ropiejące w ich ustach. Niewielu dentystów jest znanych ze starożytnego Egiptu, chociaż ze Starego Państwa zidentyfikowano ośmiu dentystów. Trzy z tych nazw odkryto w trzech grobowcach w sierpniu 2006 r. (chociaż mumie od dawna zostały zniszczone przez szabrowników). Trzech z tych dentystów posiadało również tytuł lekarza. Jeśli dentyści nie zawsze mieli osobny tytuł, odróżnienie ich od lekarzy jest trudne.

Chatbot z Pytonem : Szablony

https://szkolazpieklarodem.pl/

Szablony to słowo, które na pewno choć raz w życiu słyszałeś, szukając szablonu do wysłania e-maila, przygotowania dokumentu, zbudowania strony portfolio czy śledzenia procesu.

W wypowiedziach używane są szablony w języku Rasa. Szablon wypowiedzi zawiera zestaw gotowego tekstu, który zostanie wysłany do użytkownika po uruchomieniu jakiejś akcji. Mając taką samą nazwę akcji jak wypowiedź lub akcję z niestandardowym kodem, możemy wysłać do użytkownika sformatowany komunikat w szablonach. Prosta reprezentacja szablonów w pliku domeny może wyglądać następująco:

templates:

utter_greet:

– “hello {name}!” # name can be filled by a slot of same name or by

custom code

utter_goodbye:

– “goodbye”

– “take care bye” # multiple templates allow the bot to randomly pick

from them

utter_default:

– “Sorry, I didn’t get that.”

Teraz, gdy przeszliśmy przez trzy koncepcje akcji, miejsc i szablonów i wiemy już, jakie są intencje i byty w ramach naszej wiedzy z rozdziału 3, jesteśmy teraz gotowi, aby zagłębić się w rasę i zacząć pisać kod dla naszego pierwszy chatbot.

Per-āa : Zadowoleni klienci?

https://szkolazpieklarodem.pl/

Choć w aktach nie ma mowy o kosztach badań lekarskich i recept, to pacjenci najprawdopodobniej zapłacili za usługi lekarskie. Ponieważ przez większość okresu faraonów nie używano pieniędzy, pacjenci płacili towarami. Nie wiadomo, czy pacjenci płacili przed, po lub po pomyślnym leczeniu. Jednak liczne inskrypcje poświęcone są różnym bóstwom z wdzięcznością za leczenie chorób. To, czy lekarzowi dziękowano prezentem, bez wątpienia pozostawiano w gestii jednostki.

Chatbot z Pytonem : Działanie

https://szkolazpieklarodem.pl/

Jak sama nazwa wskazuje, jest to konkretne działanie, które można podjąć. Zgodnie z dokumentacją Rasa jest napisane: „Następna akcja, którą należy podjąć w odpowiedzi na stan okna dialogowego”. Przykładowo, jeśli użytkownik zapyta o horoskop na dzisiaj, nasz bot może wykonać akcję „GetTodaysHoroskop”. Zobaczmy jak wyglądałaby akcja „GetTodaysHoroskop” w formie kodu.

from rasa_core.actions import Action

from rasa_core.events import SlotSet

class GetTodaysHoroscope(Action):

def name(self):

return “get_todays_horoscope”

def run(self, dispatcher, tracker, domain):

# type: (Dispatcher, DialogueStateTracker, Domain) -> List[Event]

user_horoscope_sign = tracker.get_slot(‘horoscope_sign’)

“””Write your logic to get today’s horoscope details

for the given Horoscope sign based on some API calls

or retrieval from the database”””

return [SlotSet(“horoscope_sign”, user_horoscope_sign)]

Metoda name zwraca nazwę akcji, do której będziemy odnosić się w pliku domeny jako niestandardową nazwę metody.

Metoda run wykonuje główne zadanie polegające na wykonaniu akcji — to znaczy, że tutaj znajduje się podstawowa logika biznesowa. Jak widać, pobiera trzy parametry: wysyłkę, moduł śledzący i domenę. Przyjrzyjmy się kolejno tym parametrom:

  • dyspozytor: dyspozytor służy do wysyłania wiadomości do naszych użytkowników. Aby osiągnąć to samo, możemy użyć funkcji dipatcher.utter_message().
  • moduł śledzący: moduł śledzący stan bieżącego użytkownika. Dostęp do wartości slotów możemy uzyskać za pomocą tracker.get_slot(nazwa_slotu), a aby uzyskać najnowszą wiadomość użytkownika, możemy użyć tracker.latest_message.text.
  • domena: domena bota. Bardziej szczegółowo omówimy tę domenę w dalszej części rozdziału.

Uwaga: metoda run zwraca listę instancji zdarzeń.

Per-āa : Metody alternatywne

https://szkolazpieklarodem.pl/

Egipcjanie od czasu do czasu stosowali alternatywne metody lecznicze, które ostatnio zyskały na popularności.

* Aromaterapia. Kadzidło było bardzo popularne w Egipcie. Został spalony, aby osłodzić powietrze i odkazić domy (działał również jako halucynogen!). Był również regularnie używany w rytuałach świątynnych; zapisy z 1200 roku pne podają, że w świątyni w Karnaku w ciągu jednego roku spalono 2189 słojów i 304 093 korce kadzidła! Kadzidła używano w sanatoriach świątynnych, dormitoriach, w których chorzy spali przez noc, aby przez sny otrzymywać wiadomości od bogów. Sen został wywołany spaleniem kadzidła, które wywoływało halucynacje. Kapłani następnie zinterpretowali te sny i poinstruowali pacjentów, jakie zadania muszą wykonać, aby zostać wyleczonym. Nazwijcie mnie cynikiem, ale księża najwyraźniej byli na dobrej drodze – przydzielone zadania nieuchronnie finansowały świątynię w taki czy inny sposób.

* Lewatywy. Jednym z aspektów egipskiej medycyny prewencyjnej, który powrócił, jest regularne stosowanie lewatyw i irygacji okrężnicy. Pasterz Odbytu był specjalistą, który wykonywał lewatywy, które były praktykowane w celu utrzymania ogólnego dobrego zdrowia. Uważano, że lewatywy zostały wprowadzone przez Thota, boga wiedzy z głową ibisa. Ibis był często obserwowany, jak wpychał wodę do własnego odbytu swoim długim dziobem, aby ewakuować jelita. Egipcjanie poszli w ich ślady – miejmy nadzieję, że za pomocą bardziej miękkiego instrumentu!

* Elektrowstrząsy. Bardziej dziwaczna alternatywa leczenia polegała na rażeniu pacjenta prądem elektrycznym za pomocą suma elektrycznego (malapterusus electricus), który pływał w Nilu przynajmniej z piątej dynastii.

Scribonius Largus (45 rne), lekarz cesarza Klaudiusza, opisuje, w jaki sposób promienie elektryczne były używane we wczesnej medycynie egipskiej do leczenia ogólnego bólu:

Kiedy przychodzą, umieszcza się żywy promień elektryczny pod stopą pacjenta. Następnie pacjent stoi na mokrej plaży, przykrytej jak najdłużej wodą, aż stopa uśpi się do poziomu kolana.

W jaki sposób ta technika miała powstrzymać ból – poza tym, żebyś o nim zapomniała – nie wiem. Nie mogę zdecydować, co jest gorsze, ból czy lekarstwo!

* Masaż i refleksologia. Obraz z grobowca z piątej dynastii

Ankhmahor w Sakkarze pokazuje dłonie i stopy pacjentów masowane przez praktyków w celu złagodzenia bólu i bólu. Uważa się, że jest to najwcześniejszy obraz refleksologii na świecie. W literackim papirusie znanym jako Papyrus Westcar, pochodzącym z Państwa Środka, 110-letni mag Djedi polecił „swojemu słudze u jego głowy posmarować go, a drugi pomasować mu nogi”, co wskazuje na formę fizjoterapii, która być może ulżyła niektórym bóle i bóle artretyzmu.