Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:psi:labs:lab_krr [2019/02/25 14:43] kkutt utworzono |
pl:dydaktyka:psi:labs:lab_krr [2019/09/30 20:55] (aktualna) kkutt |
====== LAB: Reprezentacja wiedzy ====== | ====== LAB: Reprezentacja wiedzy ====== |
| |
Celem ćwiczenia jest zapoznanie się z różnymi metodami reprezentacji wiedzy, w szczególności sieciami semantycznymi i reprezentacją strukturalną (Frames). | Celem ćwiczenia jest zapoznanie się z różnymi metodami reprezentacji wiedzy, w szczególności z językiem naturalnym, reprezentacją strukturalną (Frames) i sieciami semantycznymi (a.k.a. grafy wiedzy). |
Druga połowa laboratorium stanowi wstęp do projektu [[..:start#wiki_o_sztucznej_inteligencji|Wiki o Sztucznej Inteligencji]]. | |
| |
===== - Język naturalny [10 minut] ===== | ===== - Do przygotowania ===== |
| |
| * **[ArtInt]** [[https://artint.info/2e/html/ArtInt2e.Ch5.S6.html|Section 5.6: Complete Knowledge Assumption]] |
| * **[ArtInt]** [[https://artint.info/2e/html/ArtInt2e.Ch14.html|Chapter 14: Ontologies and Knowledge-Based Systems]] |
| * **[AIMA]** Chapter 12: Knowledge Representation |
| * [[https://www.w3.org/TR/rdf11-primer/|RDF Framework Primer]] |
| |
| |
| ===== - Język naturalny [15 minut] ===== |
| |
Zanim przejdziemy do zapoznawania się z sieciami semantycznymi i Frames, przyjrzymy się krótko najpowszechniejszemu ze źródeł wiedzy, czyli Wikipedii... | Zanim przejdziemy do zapoznawania się z sieciami semantycznymi i Frames, przyjrzymy się krótko najpowszechniejszemu ze źródeł wiedzy, czyli Wikipedii... |
(pomijamy tutaj kwestię jakości danych! Gdy będziesz przygotowywać coś poważnego, np. artykuł czy pracę inżynierską, skorzystaj z pewniejszych źródeł ;-) ) | (pomijamy tutaj kwestię jakości danych! Gdy będziesz przygotowywać coś poważnego, np. artykuł czy pracę inżynierską, skorzystaj z pewniejszych źródeł ;-) ) |
| |
**ZADANIE:** Twoim zadaniem na początek aktualnego laboratorium będzie przygotowanie takiego zestawienia na temat **15 największych pod względem liczby ludności krajów Europy** na podstawie [[http://pl.wikipedia.org/|polskiej edycji Wikipedii]]. Na potrzeby tego ćwiczenia NIE korzystaj z innych stron internetowych + NIE korzystaj z zestawień już dostępnych w Wikipedii (o ile takie są). | **ZADANIE:** Twoim zadaniem na początek aktualnego laboratorium będzie przygotowanie takiego zestawienia na temat **15 największych pod względem liczby ludności krajów Europy** na podstawie [[http://pl.wikipedia.org/|polskiej edycji Wikipedii]]. Na potrzeby tego ćwiczenia NIE korzystaj z innych stron internetowych + NIE korzystaj z zestawień już dostępnych w Wikipedii, bo są co najmniej dwa takie zestawienia i mają różne nieaktualne liczby (//stan na 30.09.2019//): |
| * Sekcja Podział polityczny na stronie opisującej Europę: [[http://pl.wikipedia.org/wiki/Europa#Podział_polityczny_Europy]] |
| * Strona z zestawieniem państw europejskich: [[http://pl.wikipedia.org/wiki/Państwa_Europy]] |
| |
==== Język naturalny jako metoda reprezentacji wiedzy? ==== | ==== Język naturalny jako metoda reprezentacji wiedzy? ==== |
| |
| |
===== Baza Wiedzy = TBox + ABox [10 minut] ===== | ===== - Baza Wiedzy = TBox + ABox [10 minut] ===== |
| |
Niezależnie od tego z jakiej reprezentacji wiedzy korzystamy, naszą bazę wiedzy możemy podzielić na dwie główne składowe: TBox i ABox (pochodzące z Logik Opisowych, //Description Logics//). | Niezależnie od tego z jakiej reprezentacji wiedzy korzystamy, naszą bazę wiedzy możemy podzielić na dwie główne składowe: TBox i ABox (pochodzące z Logik Opisowych, //Description Logics//). |
| |
**ZADANIE:** stwórz Bazę Wiedzy (TBoxa i ABoxa) reprezentującą zestawienie przygotowane w [[#zestawienie_na_bazie_wikipedii|poprzedniej sekcji]] (lub jego fragment jeżeli będzie mało czasu). | **ZADANIE:** stwórz Bazę Wiedzy (TBoxa i ABoxa) reprezentującą zestawienie przygotowane w [[#zestawienie_na_bazie_wikipedii|poprzedniej sekcji]] (lub jego fragment jeżeli będzie mało czasu). |
| |
| |
| ===== - Frames [10 minut] ===== |
| |
| Podsumujmy to co robiliśmy: |
| * wiedza reprezentowana w postaci języka naturalnego jest zrozumiała dla użytkowników, nie wymaga żadnego przygotowania (jest to język naturalny -> rozumie się go naturalnie :-) ), ale nie pozwala na żadne wnioskowanie automatyczne, |
| * po zapisaniu wiedzy w postaci TBoxa i ABoxa wiedza przyjęła jakąś strukturę (narzucaną poprzez TBoxa) i moglibyśmy się pokusić o przepisanie jej np. w postaci klauzul i faktów języka Prolog -> pozwoliłoby to na wnioskowanie i byłoby pewnie w porządku, ale... |
| * dane, które opracowujemy to wiele faktów dotyczących niewielkiej liczby obiektów: w postaci ABoxa z poprzedniej sekcji, jak również w postaci faktów języka Prolog, moglibyśmy uzyskać chaotyczną mieszankę danych, która mogłaby stać się w ogóle nieczytelna dla użytkowników; np. trudno byłoby określić czy dla danego obiektu mamy już określone wszystkie właściwości... |
| |
| Tutaj pojawiają się **Ramki (Frames)**: |
| * Jest to strukturalna reprezentacja wiedzy: fakty są pogrupowane w odpowiednie struktury opisujące obiekty. |
| * Każda ramka składa się ze slotów reprezentujących różne fakty dotyczące danego obiektu (w poniższym przykładzie sloty są kolejnymi __wierszami__ tabel). |
| * Każdy ze slotów zawiera informacje o aktualnej wartości, wartości domyślnej oraz procedurze wykonywanej w czasie aktualizacji wartości (np. sprawdzenie czy ssak nie ma więcej niż 4 nogi, jak w przykładzie poniżej). |
| * Ramki zawierają również informacje o relacjach z innymi ramkami, w szczególności informacje o byciu pojęciem bardziej ogólnym / bardziej szczegółowym względem innej ramki (w poniższym przykładzie jest to slot ''jest-rodzaju''). W przypadku relacji dziedziczenia, ''dzieci'' dziedziczą sloty rodziców i mogą je nadpisywać, albo przyjąć wartości określone w rodzicach (np. KRÓLIK zostawia slot ''nogi'' nienaruszony, a MAŁPA nadpisuje jego wartość). |
| |
| Przeanalizuj poniższy przykład: |
| |
| | SSAK |||| |
| | ^ wartość ^ domyślna ^ aktualizacja ^ |
| ^ skóra | futro | | | |
| ^ narodziny | żywy | | | |
| ^ nogi | | 4 | ''sprawdź-nogi'' | |
| |
| sprawdź-nogi: wartość <= 4 |
| |
| | KRÓLIK |||| |
| | ^ wartość ^ domyślna ^ aktualizacja ^ |
| ^ jest-rodzaju | SSAK | | | |
| ^ uszy | | długie | | |
| ^ ruch | skoki | | | |
| |
| | MAŁPA |||| |
| | ^ wartość ^ domyślna ^ aktualizacja ^ |
| ^ jest-rodzaju | SSAK | | | |
| ^ nogi | 2 | | | |
| ^ ulubione-pożywienie | | banany | | |
| |
| Ustrukturyzowanie wiedzy w postaci ramek pozwala na: |
| * uzyskanie czytelnej reprezentacji wiedzy, |
| * uzupełnienie wiedzy o wartości domyślne oraz procedury wywoływane w trakcie aktualizacji danych (przydatne np. w finansach, gdy np. przy zlecaniu przelewu wywoływane są odpowiednie procedury sprawdzające czy jest on możliwy i naliczane są odpowiednie opłaty), |
| * przeprowadzenie wnioskowania polegającego na wyszukiwaniu ramek pasujących do wzorca wyszukiwania. |
| |
| **ZADANIE:** Przygotuj 3-5 ramek dla opracowywanego przez siebie zestawienia z poprzednich sekcji. Zauważ, że mogą przydać Ci się tutaj TBox i ABox stworzone w poprzedniej sekcji. W jaki sposób? |
| |
| **PYTANIE dodatkowe:** czy znasz jakieś elementy inżynierii oprogramowania, które są podobne do Ramek? |
| |
| |
| |
==== Problem z Wikipedią (dla zainteresowanych) ==== | ==== Problem z Wikipedią (dla zainteresowanych) ==== |
| |
Spójrzmy teraz w trzy różne miejsca w polskiej edycji Wikipedii i spróbujmy określić ile osób mieszka w Polsce: | |
* Strona opisująca Polskę: http://pl.wikipedia.org/wiki/Polska | |
* Sekcja Podział polityczny na stronie opisującej Europę: http://pl.wikipedia.org/wiki/Europa#Podział_polityczny_Europy | |
* Strona z zestawieniem państw europejskich: http://pl.wikipedia.org/wiki/Pa%C5%84stwa_Europy | |
| |
Na każdej z tych stron jest inna liczba (//stan na 25.02.2019//), ponieważ wszystko jest tworzone ręcznie, co nie pozwala na automatyczne przetwarzanie wiedzy! | |
| |
Wyobraźmy sobie teraz sytuację, w której Nowa Huta ogłasza niepodległość od Polski i staje się osobnym państwem. Co trzeba zmienić w wikipedii? **Na pewno strony z opisem Krakowa i Polski (zmniejszy się liczba ludności), na pewno trzeba dodać stronę z opisem nowego "Państwa nowohuckiego".** Poza tym trzeba będzie poprawić zestawienie miast Polski (liczba ludności Krakowa), zestawienie największych miast na stronie Polski (liczba ludności Krakowa), stronę z zestawieniem państw europejskich (doszło nowe państwo), stronę z podziałem politycznym na stronie Europy (nowe państwo), i pewnie jeszcze wiele innych... | Wyobraźmy sobie teraz sytuację, w której Nowa Huta ogłasza niepodległość od Polski i staje się osobnym państwem. Co trzeba zmienić w wikipedii? **Na pewno strony z opisem Krakowa i Polski (zmniejszy się liczba ludności), na pewno trzeba dodać stronę z opisem nowego "Państwa nowohuckiego".** Poza tym trzeba będzie poprawić zestawienie miast Polski (liczba ludności Krakowa), zestawienie największych miast na stronie Polski (liczba ludności Krakowa), stronę z zestawieniem państw europejskich (doszło nowe państwo), stronę z podziałem politycznym na stronie Europy (nowe państwo), i pewnie jeszcze wiele innych... |
| |
| |
===== - Wprowadzenie do "Wiki o Sztucznej Inteligencji" [40 minut] ===== | ===== - SPARQL Endpoint i DBpedia [20 minut] ===== |
| |
Nasz projekt "Wiki o Sztucznej Inteligencji" będzie rozwijany w semantycznej wiki. Semantyczna Wiki to [[wp>wiki|wiki]] z możliwością modelowania wiedzy w postaci grafów trójkowych. W ramach wprowadzenia dowiemy się jak korzystać z semantycznej wiki Semantic MediaWiki, którą będziemy wykorzystywać w czasie semestru. | * Do odpytywania grafowych baz wiedzy służy język SPARQL - podobny do SQLa, którego już znasz. Możemy używać języka SPARQL m.in. do odpytywania specjalnych web service'ów nazywanych SPARQL Endpoint, które umożliwiają wyciąganie wiedzy z podpiętego grafu wiedzy. |
| * W tej sekcji skorzystamy z SPARQL Endpointa udostępnianego przez projekt [[http://dbpedia.org/|DBpedia]] pod adresem **''<nowiki>http://dbpedia.org/sparql</nowiki>''**. |
| |
**UWAGA:** dzisiaj ćwiczymy w demo instalacji. Natomiast wszystkie tematy w wiki będziemy opracowywać w specjalnie przygotowanej instancji [[..:#wiki_o_sztucznej_inteligencji|wiki]]! | - DBpedia jest zrzutem z Wikipedii otagowanym z użyciem notacji trójkowej. Powinny być więc tam jakieś informacje o Polsce. Ale jak się do nich dostać? \\ Nie znamy identyfikatora (URI) Polski, ale wiemy, że jest coś co ma nazwę Polska i wiemy, że istnieje relacja ''rdfs:label'', która łączy obiekt z jego nazwą. Może to zadziała? Spróbujmy! |
| - Otwórz **[[http://yasgui.org/|YASGUI]]** - klienta pozwalającego na wykonywanie zapytań do SPARQL Endpointów. |
| - Co wiemy? Jest coś co ma jakieś URI (''?country''), które powinno być powiązane relacją ''rdfs:label'' z obiektem ''"Polska"@pl''. Można to łatwo przetłumaczyć do notacji trójkowej: <code>?country rdfs:label "Polska"@pl .</code> |
| - Aby wykonać to zapytanie, wpisz URI ''<nowiki>http://dbpedia.org/sparql</nowiki>'' w liście wyboru na górze. |
| - Następnie wpisz pełne zapytanie:<code>PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> |
| SELECT ?country |
| WHERE { |
| ?country rdfs:label "Polska"@pl . |
| }</code> |
| - Sukces! Istnieje coś co ma ''rdfs:label'' ''"Polska"@pl''! \\ **ZADANIE:** Teraz rozszerz to zapytanie tak, aby pobrać informację o populacji Polski. |
| - **ZADANIE:** Rozszerz zapytanie jeszcze bardziej i przygotuj listę 10 największych państw europejskich pod względem populacji. |
| |
- FIXME przećwicz tworzenia stron w wiki, dodawanie do nich informacji o kategoriach i relacjach oraz odpytywanie tak powstałej bazy wiedzy | |
| |
===== - Frames [10 minut] (jeżeli wystarczy czasu) ===== | |
| |
Podsumujmy to co robiliśmy: | |
* wiedza reprezentowana w postaci języka naturalnego jest zrozumiała dla użytkowników, nie wymaga żadnego przygotowania (jest to język naturalny -> rozumie się go naturalnie :-) ), ale nie pozwala na żadne wnioskowanie automatyczne, | |
* po zapisaniu wiedzy w postaci TBoxa i ABoxa wiedza przyjęła jakąś strukturę (narzucaną poprzez TBoxa) i moglibyśmy się pokusić o przepisanie jej np. w postaci klauzul i faktów języka Prolog -> pozwoliłoby to na wnioskowanie i byłoby pewnie w porządku, ale... | |
* dane, które opracowujemy to wiele faktów dotyczących niewielkiej liczby obiektów: w postaci ABoxa z poprzedniej sekcji, jak również w postaci faktów języka Prolog, moglibyśmy uzyskać chaotyczną mieszankę danych, która mogłaby stać się w ogóle nieczytelna dla użytkowników; np. trudno byłoby określić czy dla danego obiektu mamy już określone wszystkie właściwości... | |
| |
Tutaj pojawiają się **Ramki (Frames)**: | |
* Jest to strukturalna reprezentacja wiedzy: fakty są pogrupowane w odpowiednie struktury opisujące obiekty. | |
* Każda ramka składa się ze slotów reprezentujących różne fakty dotyczące danego obiektu (w poniższym przykładzie sloty są kolejnymi __wierszami__ tabel). | |
* Każdy ze slotów zawiera informacje o aktualnej wartości, wartości domyślnej oraz procedurze wykonywanej w czasie aktualizacji wartości (np. sprawdzenie czy ssak nie ma więcej niż 4 nogi, jak w przykładzie poniżej). | |
* Ramki zawierają również informacje o relacjach z innymi ramkami, w szczególności informacje o byciu pojęciem bardziej ogólnym / bardziej szczegółowym względem innej ramki (w poniższym przykładzie jest to slot ''jest-rodzaju''). W przypadku relacji dziedziczenia, ''dzieci'' dziedziczą sloty rodziców i mogą je nadpisywać, albo przyjąć wartości określone w rodzicach (np. KRÓLIK zostawia slot ''nogi'' nienaruszony, a MAŁPA nadpisuje jego wartość). | |
| |
Przeanalizuj poniższy przykład: | |
| |
| SSAK |||| | |
| ^ wartość ^ domyślna ^ aktualizacja ^ | |
^ skóra | futro | | | | |
^ narodziny | żywy | | | | |
^ nogi | | 4 | ''sprawdź-nogi'' | | |
| |
sprawdź-nogi: wartość <= 4 | |
| |
| KRÓLIK |||| | |
| ^ wartość ^ domyślna ^ aktualizacja ^ | |
^ jest-rodzaju | SSAK | | | | |
^ uszy | | długie | | | |
^ ruch | skoki | | | | |
| |
| MAŁPA |||| | |
| ^ wartość ^ domyślna ^ aktualizacja ^ | |
^ jest-rodzaju | SSAK | | | | |
^ nogi | 2 | | | | |
^ ulubione-pożywienie | | banany | | | |
| |
Ustrukturyzowanie wiedzy w postaci ramek pozwala na: | |
* uzyskanie czytelnej reprezentacji wiedzy, | |
* uzupełnienie wiedzy o wartości domyślne oraz procedury wywoływane w trakcie aktualizacji danych (przydatne np. w finansach, gdy np. przy zlecaniu przelewu wywoływane są odpowiednie procedury sprawdzające czy jest on możliwy i naliczane są odpowiednie opłaty), | |
* przeprowadzenie wnioskowania polegającego na wyszukiwaniu ramek pasujących do wzorca wyszukiwania. | |
| |
**ZADANIE:** Przygotuj 3-5 ramek dla opracowywanego przez siebie zestawienia z poprzednich sekcji. Zauważ, że mogą przydać Ci się tutaj TBox i ABox stworzone w poprzedniej sekcji. W jaki sposób? | |
| |
**PYTANIE dodatkowe:** czy znasz jakieś elementy inżynierii oprogramowania, które są podobne do Ramek? | |
| |
| |
* Strona główna DBpedii: [[http://wiki.dbpedia.org/]] | * Strona główna DBpedii: [[http://wiki.dbpedia.org/]] |
* Szczegółowe informacje dotyczące zapisu trójkowego (formalnie jest to notacja RDF): [[http://www.w3.org/RDF/]] | * Szczegółowe informacje dotyczące zapisu trójkowego (formalnie jest to notacja RDF): [[http://www.w3.org/RDF/]] |
* Prosty graficzny edytor trójek przygotowany przez p. Artura Smaronia, absolwenta Informatyki: [[http://student.agh.edu.pl/~arturs/SemWebEditor/]] | * Prosty graficzny edytor trójek przygotowany przez p. Artura Smaronia, absolwenta Informatyki: [[https://loki.re/RDFeditor/]] |
* W jaki sposób sprawić, by Google "rozumiał" zawartość Twojej strony internetowej: [[https://developers.google.com/structured-data/|Structured Data Markup]] | * W jaki sposób sprawić, by Google "rozumiał" zawartość Twojej strony internetowej: [[https://developers.google.com/structured-data/|Structured Data Markup]] |