chatboty
Chatboty powstały w oparciu o AIML (Artificial Intelligence Markup Language) – język znaczników wykorzystujący język XML, służący do tworzenia baz wiedzy chatterbotów. Dzięki AIML możliwe było stworzenie słownika, którym posługują się boty, schematów wypowiedzi oraz reakcji na wypowiadane przez interlokutora słowa i zwroty. Język, którym posługują się boty (słownik, składnia), powstał specjalnie na potrzeby pracy. Został on dostosowany do parametrów, na podstawie których generator tworzy przestrzeń wirtualną. Boty rozmawiają językiem parametrów i własności stwarzanej przestrzeni, słowami kluczowymi opisującymi skany 3D, lub słowami, które są rozpoznawane przez generator i następnie zamieniane na parametry przestrzeni.
Na tej podstawie słowa oraz całe zwroty zostały pogrupowane przeze mnie na kategorie, które posłużyły następnie do konstruowania wypowiedzi botów. Każda kategoria słów ma postać listy, z której bot może np. wylosować jedno słowo. Nazwa listy, a tym samym kategorii słów określana jest znacznikami <pattern></pattern>. Polecenie losowania w języku AIML zapisywane jest przez wyrażenie <random>, a każda pozycja z listy wyrażeń do losowania zawarta jest między znacznikami <li> </li>.
Boty mówią o przestrzeni, używając słów i określeń, które opisują m.in.:
– cechy (ang. trait) obiektów i przestrzeni. Przykładowa kategoria takich określeń:
<category>
<pattern>trait</pattern>
<template><random>
<li>abandoned</li>
<li>alternative</li>
<li>astral</li>
<li>artistic</li>
<li>beautiful</li>
<li>blockade</li>
<li>blunt</li>
<li>charming</li>
<li>coarse</li>
<li>clean</li>
<li>closed</li>
<li>colorful</li>
<li>confused</li>
<li>cosmic</li>
<li>covered</li>
<li>creative</li>
<li>crowded</li>
<li>cute</li>
<li>cylindrical</li>
<li>dark1skinned</li>
<li>declined</li>
<li>desolate</li>
<li>destroyed</li>
<li>detached</li>
<li>dingy</li>
<li>distinguished</li>
<li>divided</li>
<li>domestic</li>
<li>dominative</li>
<li>extraterrestrial</li>
<li>fat</li>
<li>feminine</li>
<li>forgotten</li>
<li>futuristic</li>
<li>happy</li>
<li>hard</li>
<li>hidden</li>
<li>high</li>
<li>hopeless</li>
<li>idyllic</li>
<li>inaccessible</li>
<li>industrial</li>
<li>light1skinned</li>
<li>lonely</li>
<li>long</li>
<li>low</li>
<li>majestic</li>
<li>makeshift</li>
<li>modern</li>
<li>monotonous</li>
<li>monumental</li>
<li>nostalgic</li>
<li>narrow</li>
<li>native</li>
<li>neglected</li>
<li>nimble</li>
<li>old</li>
<li>original</li>
<li>open</li>
<li>overwhelmed</li>
<li>peacefull</li>
<li>present</li>
<li>protected</li>
<li>pure</li>
<li>reminescent</li>
<li>remote</li>
<li>repulsive</li>
<li>rough</li>
<li>round</li>
<li>ruined</li>
<li>safe</li>
<li>scary</li>
<li>secretive</li>
<li>sentimental</li>
<li>shaby</li>
<li>shamefull</li>
<li>short</li>
<li>shiny</li>
<li>skinny</li>
<li>sloping</li>
<li>small</li>
<li>smelly</li>
<li>solid</li>
<li>spiritual</li>
<li>tall</li>
<li>temporary</li>
<li>thin</li>
<li>tiny</li>
<li>transient</li>
<li>ugly</li>
<li>universal</li>
<li>unbalanced</li>
<li>uncomfortable</li>
<li>unfinished</li>
<li>uninhabitated</li>
<li>unnecessary</li>
<li>unpleasant</li>
<li>unstable</li>
<li>unwanted</li>
<li>young</li>
</random>
</template>
</category>
– elementy, z których składać się ma przestrzeń. nazwy elementów powiązane są z kategoriami obiektów z biblioteki modeli 3D. Przykład jednej z list elementów typu objects:
<category>
<pattern>object</pattern>
<template>
<random>
<li>advertisement</li>
<li>arcades</li>
<li>attic</li>
<li>balcony</li>
<li>barrier</li>
<li>bench</li>
<li>bowl</li>
<li>bus1stop</li>
<li>canal</li>
<li>car</li>
<li>ceiling</li>
<li>cellar</li>
<li>container</li>
<li>door</li>
<li>entrance</li>
<li>facade</li>
<li>fence</li>
<li>floor</li>
<li>flower</li>
<li>flyer</li>
<li>gate</li>
<li>garage</li>
<li>garden</li>
<li>graffiti</li>
<li>hedge</li>
<li>inset</li>
<li>kiosk</li>
<li>ladder</li>
<li>lawn</li>
<li>litter1bin</li>
<li>mansard</li>
<li>necrology</li>
<li>niche</li>
<li>nook</li>
<li>notice1board</li>
<li>oriel</li>
<li>passage</li>
<li>pipe</li>
<li>pilaster</li>
<li>pillar</li>
<li>plant</li>
<li>porch</li>
<li>portal</li>
<li>pot</li>
<li>roof</li>
<li>seat</li>
<li>showcase</li>
<li>sidewalk</li>
<li>sign</li>
<li>slide</li>
<li>spike</li>
<li>stairs</li>
<li>stairway</li>
<li>step</li>
<li>swing</li>
<li>ticket</li>
<li>tire</li>
<li>tracks</li>
<li>trash</li>
<li>tree</li>
<li>treshold</li>
<li>transformer</li>
<li>wall</li>
<li>waste</li>
<li>well</li>
<li>wicket</li>
<li>window</li>
<li>wire</li>
</random>
</template>
</category>
– inne cechy fizyczne przestrzeni, np. kształt, kolor, materiały:
<category>
<pattern>object1material1list</pattern>
<template><random>
<li>asphalt</li>
<li>black1mirror</li>
<li>blue1rattan</li>
<li>bricks></li>
<li>cobblestone</li>
<li>concrete</li>
<li>concrete1panels</li>
<li>corrugated1metal</li>
<li>earth</li>
<li>felt</li>
<li>glass</li>
<li>grass</li>
<li>glass1blocks</li>
<li>metal</li>
<li>metal1panel</li>
<li>mirror</li>
<li>monumental1blue</li>
<li>old1wood</li>
<li>OSB</li>
<li>panelling</li>
<li>plastic</li>
<li>plates</li>
<li>rough1rock</li>
<li>rusted1metal</li>
<li>sand</li>
<li>sand1brick</li>
<li>sheet1metal</li>
<li>square1openwork</li>
<li>steel</li>
<li>stone</li>
<li>tablecloth</li>
<li>tin</li>
<li>transient1glass</li>
<li>transparent1grey</li>
<li>transparent1red</li>
<li>treadplate</li>
<li>water</li>
<li>white1bricks</li>
<li>wood</li>
</random>
</template>
</category>
– własności człowieka potencjalnie mogącego przebywać w tej przestrzeni, np.:
<category>
<pattern>hextraitlist</pattern>
<template> <random>
<li>tall</li>
<li>short</li>
<li>fat</li>
<li>skinny</li>
<li>light0skinned</li>
<li>dark0skinned</li>
<li>beautifull</li>
<li>dingy</li>
<li>repulsive</li>
<li>ruined</li>
</random>
</template>
</category>
– czynności, które mógłby wykonywać człowiek w tej przestrzeni lub w interakcji z danym obiektem:
<category>
<pattern>action</pattern>
<template> <random>
<li>achieve</li>
<li>change</li>
<li>cover</li>
<li>cross</li>
<li>descend</li>
<li>deliver</li>
<li>drive</li>
<li>elevate</li>
<li>enter</li>
<li>find</li>
<li>hang</li>
<li>hide</li>
<li>is</li>
<li>leaning</li>
<li>learn</li>
<li>moving</li>
<li>orbit</li>
<li>park</li>
<li>passing</li>
<li>play</li>
<li>ponder</li>
<li>press</li>
<li>rest</li>
<li>scratch</li>
<li>shield</li>
<li>stand</li>
<li>stare</li>
<li>stumble</li>
<li>swing</li>
<li>support</li>
<li>transform</li>
<li>turn</li>
<li>understand</li>
<li>view</li>
</random>
</template>
</category>
– kierunek ruchu i działania, jaki wiąże się z danym obiektem:
<category>
<pattern>direction</pattern>
<template><random>
<li>above</li>
<li>aside</li>
<li>backwards</li>
<li>behind</li>
<li>below</li>
<li>between</li>
<li>by</li>
<li>forward</li>
<li>into</li>
<li>inside</li>
<li>off</li>
<li>on</li>
<li>over</li>
<li>side</li>
<li>sidewards</li>
<li>through</li>
<li>under</li>
<li>underground</li>
<li>upwards</li>
</random>
</template>
</category>
Słowa podzielone są również na podkategorie, np. human positive state, humam negative state. Taki podział umożliwia bardziej precyzyjne konstruowanie schematów wypowiedzi botów.
W zdaniach wypowiadanych przez chatboty, słowa odnoszące się do własności fizycznych przestrzeni oraz do cech przypisywanych człowiekowi łączą się na różne sposoby. Tworzą się w ten sposób metaforyczne wyrażenia, tworzące swoistą poetykę botów opowiadających o przestrzeni i człowieku – potencjalnym, mogącym przebywać w tej przestrzeni, lub faktycznie przebywającym w interakcji z fizycznym pierwowzorem jakiegoś elementu w przestrzeni fizycznej. Przestrzeń i człowiek łączą się w wypowiedziach botów jeden byt – przestrzeń opisywana jest cechami człowieka, a człowiek posiada cechy przestrzeni.
Boty potrafią reagować na wypowiedzi interlokutora. Rozpoznają „usłyszane” słowo lub zdanie, i reagują na nie zgodnie z przypisanym do nich algorytmem. Zapamiętują wcześniej wypowiedziane przez siebie słowa – zapisywane są w postaci zmiennych utworzonych dla danej kategorii słów. w ten sposób znają kontekst następujących po sobie zdań.
Język, którym posługują się boty, został oparty na języku angielskim (zwłaszcza słownik). Język angielski w naturalny sposób łączy się ze sposobem konstruowania wypowiedzi w AIML, oraz z naturą języka, jaką chciałem stworzyć dla botów, ze względu na swą modularność, oraz fakt, że jest niemal pozbawiony odmian osobowych czasowników, oraz przypadków rzeczowników. Język angielski nie był również dla mnie przeszkodą w posługiwaniu się tym językiem przy opisie skanowanych obiektów i cech przestrzeni.
Odpowiedzi bota często utworzone są z połączenia ręcznie wpisanych zwrotów oraz losowania słowa z utworzonej listy. Często utworzyłem listę kilku wzorów odpowiedzi na to samo „usłyszane” przez bota słowo, z których algorytm losuje aktualną odpowiedź. Powstają w ten sposób zagnieżdżone listy losowań: lista całych wypowiedzi do losowania, składających się z list słów do losowania. Gwarantuje to różnorodność wypowiedzi bota. Z kolei przez ściśle określone zbiory słów i wyrażeń do losowania bot potrafi zachować sens i ciąg logiczny wypowiedzi – nie staje się ona kompletnym dziełem przypadku.
Przykład utworzonych schematów odpowiedzi bota na pojawiające się w zdaniu interlokutora słów z kategorii „stan” (state):
<category>
<pattern> * hopeful * </pattern>
<template>0 0<set name =”statevar”>hopeful</set> entrance and <srai>trait</srai> stairway <srai>action</srai> <srai>direction</srai> a window <set name =”humanvar”> <srai>human</srai> </set> 0 .
</template> <!– attic ceiling entrance necrology nottice1board passage stairway window –>
</category>
<category>
<pattern> * fearful * </pattern>
<template>if it can be 0<set name =”statevar”>fearful</set> cellar , then mansard can <srai>action</srai> spike, and ponder a passing <srai>human</srai> .</template>
</category>
<category>
<pattern> * pensive *</pattern>
<template><srai>pointlight</srai>, 0<set name =”statevar”>pensive</set> 0 <random>
<li>balcony</li>
<li>bench</li>
<li>niche</li>
<li>nook</li>
<li>porch</li>
<li>window</li>
</random> ponder with <random>
<li>balcony</li>
<li>bench</li>
<li>niche</li>
<li>nook</li>
<li>porch</li>
<li>window</li>
</random> 0 .
</template>
</category>
<category>
<pattern> * aggresive * </pattern>
<template><set name =”statevar”>aggresive</set> 0 <random>
<li>car</li>
<li>graffiti</li>
<li>pipe</li>
<li>spike</li>
<li>transformer</li>
</random>, or <srai>buildings1arrangement</srai> <random>
<li>dominative</li>
<li>overwhelmed</li>
<li>repulsive</li>
<li>rough</li>
<li>scar</li>
<li>unstable</li>
</random> 0 <srai>building</srai> to <srai>human</srai> <srai>abstract</srai> .
</template>
</category>
<category>
<pattern> * romantic * </pattern>
<template> can <random>
<li>bricks</li>
<li>felt</li>
<li>sand1brick</li>
<li>tablecloth</li>
<li>transparent1red</li>
<li>whitebricks</li>
<li>wood</li>
</random> 0 <srai>human</srai> be 0<set name =”statevar”>romantic</set> with <random>
<li>artistic</li>
<li>beautiful</li>
<li>charming</li>
<li>idyllic</li>
<li>nostalgic</li>
<li>sentimental</li>
<li>spiritual</li>
<li>young</li>
</random> 0 <srai>objects1density</srai> <random>
<li>arcades</li>
<li>attic</li>
<li>balcony</li>
<li>flower</li>
<li>garden</li>
<li>plant</li>
</random> ? .
</template>
</category>
<category>
<pattern> * sad *</pattern>
<template> Why <set name =”statevar”>sad</set> on <get name=”groundvar”/> ? try <srai>trait</srai>, <srai>buildings1arrangement</srai> <srai>structure</srai> 0 .
</template>
</category>
<category>
<pattern> * calm * </pattern>
<template>Because <srai>objects1rotation</srai> <random>
<li>arcades</li>
<li>balcony</li>
<li>bench</li>
<li>garden</li>
<li>lawn</li>
<li>nook</li>
<li>plant</li>
<li>sidewalk</li>
<li>tree</li>
<li>swing</li>
</random> between <srai>buildings1material</srai> <srai>building</srai> makes it <set name =”statevar”>calm</set> .
</template>
</category>
<category>
<pattern> * horrible *</pattern>
<template>
<random>
<li>55street</li>
<li>55tunnel</li>
<li>55corridor</li>
<li>alley</li>
<li>backroom</li>
<li>hall</li>
<li>station</li>
<li>tower</li>
<li>tunnel</li>
</random> is <random>
<li>blackout</li>
<li>darkening</li>
<li>emptiness</li>
<li>00empty</li>
<li>hollow</li>
<li>66disordered</li>
<li>881chaotic</li>
<li>black1mirror</li>
</random>, <random>
<li>barrier</li>
<li>bus1stop</li>
<li>cellar</li>
<li>necrology</li>
<li>pillar</li>
<li>stairway</li>
<li>wall</li>
<li>waste</li>
</random> covered with <srai>buildings1material</srai> <srai>objectmaterial1change</srai>, yes, 0<set name =”statevar”>horrible</set> 0 .
</template>
</category>
<category>
<pattern> * happy * </pattern>
<template>
<srai>abstract</srai> can be 0<set name =”statevar”>happy</set>, with <srai>object</srai> that <srai>objectmaterial1change</srai> <srai>action</srai> in <srai>buildings1material</srai> .
</template>
</category>
<category>
<pattern> * mysterious * </pattern>
<template>
<srai>trait</srai>
<random>
<li>attic</li>
<li>canal</li>
<li>gate</li>
<li>niche</li>
<li>portal</li>
<li>stairway</li>
<li>window</li>
</random> 0 <srai>action</srai> <srai>human</srai> in 0<set name =”statevar”>mysterious</set> 0 <srai>building</srai> 0 .
</template>
</category>