Autor: Szymon Fogiel
Data: 2008-06-20
Bot konwersacyjny korzystający z RSS
Projekt z przedmiotu sztuczna inteligencja
1. Treść zadania
Zadanie polegało na zaimplementowaniu bota konwersacyjnego, który byłby w stanie rozmawiać z użytkownikiem na tematy związane z najnowszymi wiadomościami. Wiadomości te miałby być pobierane z kanału RSS. Jako kanał z którego korzysta program wybrałem http://rss.gazeta.pl/pub/rss/gazetawyborcza.xml z Gazety Wyborczej.
2. Metoda rozwiązania
Program posiada bazę wiedzy, stworzoną w języku AIML. Mała część tej bazy jest stała, a pozostała jest dynamicznie generowana przy uruchomieniu programu.
Baza wiedzy w języku AIML jest reprezentowana w postaci kategorii, takiej postaci:
<category>
<this>KONTEKST</this>
<pattern>WZORZEC NA KTÓRY REAGUJE PROGRAM</pattern>
<template>odpowiedź programu</template>
</category>
Część <this>...</this> jest opcjonalna. Jeśli jest ona w kategorii to program zareaguje na nią tylko wtedy jeśli KONTEKST był ostatnią wypowiedzią programu.
Stałą część bazy stanowią kategorie odpowiedzialne za typowe wypowiedzi w rozmowie, na przykład:
<category>
<pattern>CZEŚĆ</pattern>
<template>
<random>
<li>Hej</li>
<li>Cześć</li>
</random>
</template>
</category>
Co oznacza, że na wypowiedź „Cześć” użytkownika program zareaguje losową odpowiedzią „Cześć” lub „Hej”.
Dynamiczna część bazy wiedzy jest generowana przez program podczas uruchomienia. Program na początku pobiera informacje z kanału RSS i przeglądając je zdanie po zdaniu generuje kategoria AIML i zapisuje je w plikach.
Generowane kategorie są podzielone na kilka typów:
Odpowiedź na pytanie w stylu „Co słychać?”. Program odpowiada losowym tytułem z RSS.
Kontynuacja tematu. Po wypowiedzi programu użytkownik może zachęcić program do kontynuacji. Na pytanie w rodzaju „I co dalej?” program odpowie kolejnym zdaniem z danej wiadomości RSS.
Pełna wypowiedź na dany temat. Jeśli użytkownik po wypowiedzi programu napisze coś podobnego do „Opowiedz o tym wszystko” to otrzyma w odpowiedzi pełną treść dla danego tematu z RSS.
Reakcja na słowa kluczowe wraz z dodatkowym słowem. Słowa kluczowe to wszystkie słowa napisane dużą literą, które nie są na początku zdania lub słowa z pliku konfiguracyjnego programu. Słowo dodatkowe to dowolne inne słowo z tego samego zdania. Program wyszukuje w zapytaniu użytkownika słowa kluczowego i dodatkowego i odpowiada zdaniem z RSS zawierającym oba. W przypadku słów kluczowych z pliku można w nim podać również odmianę dla słów, dzięki czemu program będzie również reagował na słowa występujące w innej odmianie niż w zapytaniu użytkownika. Przykład:
Jeśli w jednym z tekstów z RSS występuje zdanie „To syn Margaret Thatcher i libański biznesmen zlecili mi zamach stanu w Gwinei Równikowej - zeznał przed sądem w Malabo Simon Mann, najgłośniejszy w ostatnich latach biały najemnik” to program na zapytanie:
„Co zeznał Simon Mann?”
odpowie:
„To syn Margaret Thatcher i libański biznesmen zlecili mi zamach stanu w Gwinei Równikowej - zeznał przed sądem w Malabo Simon Mann, najgłośniejszy w ostatnich latach biały najemnik”
Reakcja na pojedyncze słowa kluczowe. Jeśli program nie potrafi skojarzyć słowa kluczowego razem z dodatkowym to zareaguje na samo słowo kluczowe. Jeśli jakieś pojawi się w zapytaniu użytkownika to odpowie zdaniem z RSS zawierającym to słowo kluczowe lub jego odmianę.
Reakcja na informacje dane przez użytkownika. Jeśli użytkownik napisze coś w przypominającego „Wiesz że, (pewna informacja zawierająca słowa kluczowe i dodatkowe z jakiegoś zdania)” to program odpowie czymś w rodzaju „Tak wiem + zdanie następujące po tym skojarzonym z informacją wpisaną podaną przez użytkownika”. Na przykład jeśli w RSS były zdania:
„Lech Wałęsa pozwie prezesa TVP Andrzeja Urbańskiego, prezesa IPN Janusza Kurtykę oraz autorów dokumentu „TW Bolek”. Żąda 20 mln zł odszkodowania.”
To program po wpisaniu:
„Wiesz, że Wałęsa pozwie Urbańskiego?”
odpowie:
„Tak wiem. Żąda 20 mln zł odszkodowania.”
Próba zmiany tematu. Jeśli program nie będzie potrafił znaleźć żadnej reakcji na wypowiedź użytkownika spróbuje zmienić temat pisząc coś w stylu:
„Słyszałeś?: + tytuł jakiejś wiadomości RSS”
Jako interpretera użyłem „Program #”. Interfejs do rozmowy z botem został zaczerpnięty z tego dołączonego do interpretera. Przerobiłem go w ten sposób aby łączył się z internetem, ściągał informacje z RSS, generował pliki AIML a także wyświetlał informacje RSS użytkownikowi. Również lekko przerobiłem sam interpreter, tak aby nie dzielił zdań, w których pojawiła się kropka w innym znaczeniu niż koniec zdania. Wszystko zostało napisane w języku C#.
3. Przykłady sesji
Przykład „dobrej” sesji:
Użytkownik: Cześć
Bot: Cześć.
Użytkownik: Jak się nazywasz?
Bot: Nazywam się Andrzej A Ty jak się nazywasz?
Użytkownik: Szymek
Bot: Miło mi cię poznać, Szymek.
Użytkownik: Co słychać?
Bot: Sukces polskiej dyplomacji: Unia przyjęła projekt Wschodniego Partnerstwa.
Użytkownik: I co dalej?
Bot: Przywódcy państw UE zaaprobowali na szczycie europejskim w Brukseli polską ideę wzmocnienia wschodniego wymiaru Europejskiej Polityki Sąsiedztwa, pod nazwą Wschodniego Partnerstwa.
Użytkownik: Wiesz, że Wałęsa pozwał Andrzeja Urbańskiego?
Bot: Tak wiem. Żąda 20 mln zł odszkodowania.
Użytkownik: Na razie
Bot: Do zobaczenia.
Przykład „złej” sesji:
Użytkownik: Co tam? |
|
Bot: Kto położy rękę na kasie SLD. |
Wylosowanym tytułem wiadomości RSS było pytanie. Program napisał je jako zdanie oznajmiające. |
Użytkownik: Kto? |
Użytkownik chciał się dowiedzieć o kogo chodzi |
Bot: Słyszałeś?: Europo, uczcij ofiary Stalina i Hitlera. |
Bot nie był w stanie rozpoznać kontekstu i spróbował jedynie zmienić temat. |
4. Wyniki.
Ze względu na specyfikę zadania trudno przedstawić wyniki w obiektywnej formie. Można jedynie przedstawić działania programu podane powyżej. Można dodać, że nikt nie uwierzył, że rozmawia z człowiekiem.
5. Wnioski
Zadanie napisania programu, który prowadziłby w sposób naturalny rozmowę z użytkownikiem jest zadaniem bardzo trudnym. Jest tak ze względu na małe możliwości rozpoznawania kontekstu oraz rozkładu zdania.
Ponieważ nie wiadomo wcześniej co będzie w wiadomościach RSS trudno jest znaleźć uniwersalny sposób tworzenia na ich podstawie wzorów zachowań dla bota.
Jednak metoda słów kluczowych zastosowana przez mnie daje pewne efekty. Nie jest to idealny sposób symulowania rozmowy i pojawiają się czasem nie do końca dobre reakcje programu, jednak jest to sposób dość uniwersalny. Od tego programu można dowiedzieć się na temat bieżących wydarzeń.
6. Źródła
AIML:
Program #