Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:miw:miw08_semantic_wiki [2008/02/19 15:10] gjn |
pl:miw:miw08_semantic_wiki [2019/06/27 15:50] (aktualna) |
====== Opis ====== | ====== Opis ====== |
| __**Projekt zakończony**__ |
| |
Marcin Juszkiewicz, <monitorr@interia.pl> | Marcin Juszkiewicz, <monitorr@interia.pl> |
| |
| |
prolog wiki plugin, semantic wiki research, comparison | prolog wiki plugin, [[http://en.wikipedia.org/wiki/Semantic_wiki|semantic wiki]] research, comparison |
| |
====== Spotkania ====== | |
===== 08.03.04 ===== | |
* ogólnie: kto coś już z tym robił? | |
* przechowywanie wiedzy semantycznej w wiki | |
* przechowywanie //reguł// w wiki | |
| |
====== Projekt ====== | ====== Projekt ====== |
====== Sprawozdanie ====== | |
| ===== Pluginy do zainstalowania ===== |
| |
| * {{:pl:miw:swpfin.zip|:pl:miw:swpfin.zip}} |
| * {{:pl:miw:swpinputfin.zip|:pl:miw:swpinputfin.zip}} |
| |
| ===== Sprawozdanie ===== |
| |
| * Cel |
| Celem projektu było stworzenie mechanizmu semantycznej wikipedii. |
| Semantyczna wikipedia to taka która potrafi sama wyciągać „znaczenie” |
| poszczególnych zdań, i tworzy linki (bądź wyciąga informacje) z innych |
| stron, haseł zawartych w Wiki. W tym celu trzeba było zastosować, lub |
| napisać maszynę wnioskującą. W moim projekcie rolę takiej maszyny pełni |
| Prolog. Zostało obsłuzenie poszczególnych Tagów w wikipedii. Tak więc |
| fakty będziemy wprowadzać kodem: |
| <code> |
| <swp>fakt</swp> |
| </code> |
| Który następnie mozemy odczytać na dowolnej ilości stron. Aby |
| zrealizować odczyt faktów naleŜy skorzystać z Tagu: |
| <code> |
| <swp goal=”cel” scope=”przestrzen” /> |
| </code> |
| Gdzie przestrzeń jest to zbiór stron, lub poszczególna strona z której |
| fakty są w obrębie naszego zainteresowania. |
| * Realizacja |
| Swój projekt zrealizowałem na bazie dwóch pluginów. W jednym |
| nazwanym „swpinput” obsługuję zdarzenia wprowadzenia, lub zmiany |
| jakiegoś faktu, w drugim „swp” obsługuję „wyciąganie” poszczególnych |
| informacji z określonej przestrzeni. Takie podejście będzie uzasadnione na |
| poziomie cacha. Cachowanie stron na poziomie Wiki było najpowaŜniejszym |
| problemem z jakim miałem do czynienia podczas realizacji projektu. |
| Problem polegał na tym iŜ strona która wyciągała dane informacje z innej |
| strony była cachowana przez Wiki, natomiast na stronie z której pobierane |
| był informacje, mogły one zostać zmienione. |
| Zapisywanie faktów odbywa się w pluginie swpinput. Generalnie |
| jedynym zadaniem tego pluginu jest zamiana Tagów |
| <code> |
| <swp></swp> |
| </code> |
| w wyrenderowanej stronie na czcionkę koloru czerwonego, oraz usunięcie |
| cachów plików które są zalezne od tego pliku (pobierają z niego informację, |
| lub odczytują informacje takiego typu, jaki został właśnie zawarty w tym |
| pliku). Dokładny opis działania cacha, oraz usuwania cacha przedstawię w |
| późniejszych punktach. |
| Odczytywanie faktów odbywa się w pluginie „swp”. W wpisanym |
| Tagu <swp /> odnajdujemy parametr „scope” który określa przestrzeń |
| plików w których będziemy odnajdywać fakty. We wszystkich plikach które |
| znajdują się w danej przestrzeni szukamy Tagów <code><swp></swp></code>, zgodnie ze |
| specyfikacją tekst wewnątrz tych Tagów jest faktem który zostanie przyjęty |
| przez Prolog. Dodatkowo w pluginie SWP wprowadziłem stałą CHECK, jezeli jest ona ustawiona na 0, to fakty nie będą przechodziły walidacji, jeśli na 1, to wszystkie fakty będą sprawdzane przed wprowadzeniem. Wszystkie te fakty |
| zapisujemy w pliku tmp.pl, a następnie uruchamiamy prolog z parametrem |
| „goal” zgodnie ze wzorem: |
| <code> |
| swipl -f tmp.pl -g \’'.$goal.',writeln(X),fail.\''; |
| </code> |
| Odpowiedź uzyskaną z Prolog wstawiamy na wyrenderowaną stronę w |
| czcionce w kolorze zielonym. |
| * Koncepcja CACHE |
| Aby dokładnie opisać moją koncepcje wprowadzę dwa pojęcia, pojęcie |
| pliku zaleŜnego, jest to plik który wyciąga informację (czyli z Tagiem <code><swp goal= scope= /></code>). Oraz pliku corowego, będę tak nazywał plik który posiada |
| wpisane fakty (w Tagach <code><swp></swp></code>). |
| Podczas renderowania pliku zaleznego w katalogu |
| „plugins/swp/pages” jest tworzony plik w takiej samej postaci jak to się dzieje w wikipedii. Czyli np. strona o id test:test2 zostaje zapisana w plugins/swp/pages/test/test2.tpl. W pliku tym zawarte są informację o plikach corowych z których dana strona pobiera informacje, oraz parametr „goal”. |
| W momencie kiedy któryś z plików corowych zostaje zmieniony, |
| plugin „swpinput” sprawdza czy w którymś z wcześniej stworzonych plików |
| nie pobiera informacji z tego pliku corowego, lub nie szuka podobnego faktu. |
| JeŜeli taka sytuacja ma miejsce, to plik cacha pliku zaleznego jest usuwany, |
| co wymusza jego ponowne wyrenderowanie (juz z aktualnymi danymi). |
| * Implementacja |
| Aby zrealizować odpowiednio powyzsze cele musiałem napisać kilka |
| funkcji, znajdują się one w pliku swpinput.php oraz swp.php. |
| <code> |
| function _search($base='data/pages') // funkcja przeszukuję daną przestrzeń, |
| oraz odnajduje wszystkie katalogi i pliki w tej przestrzenii |
| function wyslij($pliki) //funkcja przeszukuje pliki podane jako parametr, |
| szuka w nich Tagów <swp></swp>, a następnie wszystkie informacje |
| między tymi tagami zapisuje do pliku tmp.pl |
| function goal($c) // wykonuję w konsoli wywołanie prolog, z określonym |
| jako parametr celem |
| function save_core($files,$goal='') // zapisuje informację o plikach |
| zaleznych, z których plików corowych korzystają. |
| function cache_delete($fakt='fdsafas') // realizuje kasowanie cacha |
| </code> |
| ==== Podsumowanie ==== |
| Podsumowując moje pluginy potrafią: |
| * Przyjmować fakty prologa, niezależnie czy z kropką na końcu czy bez co ułatwia prace. |
| * Walidować fakty prologa. |
| * Odnajdywać wszystkie fakty z zadanej przestrzeni, wprowadzić je do prologu, a następnie wyświetlić odpowiedź prologa na pytanie zadanie w parametrze goal. |
| * Zapisuje relacje pomiędzy stronami. |
| * Zapisuje cel jaki jest zadany prologowi na danej stronie, dzięki temu gdy pojawi się nowa strona z faktem który odpowiada temu celowi, cache strony z tym celem jest usuwany. |
| |
| Jest nadal jednak kilka elementów nad którymi należało by się zastanowić. |
| * Walidacja faktu prologu jest dość skomplikowanym procesem, fakt musi być zapisany w jakimś pliku, później zostaje uruchomiony w prologu, i patrzymy jaka jest odpowiedź z prologa. Można pomyśleć nad jakimś szybkim parserem prologa. Jest to o tyle konieczne, ponieważ jeżeli w pliku z faktami będzie choćby jeden wprowadzony błędnie fakt, to nie otrzymamy odpowiedzi z prologa. |
| * Można również zastosować wyrażenia regularne w parametrze scope. Nie jest to trudne zadanie do zrobienia, natomiast mogą występować z tym kłopoty przy dużej ilości plików (trzeba sprawdzić czy każdy jeden plik, pasuje do tego wyrażenia). |
| |
| <code> |
| <swp> |
| spotkanie(data(3.4.8)). |
| </swp> |
| |
| <swp goal="spotkanie(X)" scope="pl:miw"/> |
| </code> |
| |
| swipl -f mojpliktymcz.pl -g 'spotkanie(X),write(X),halt.' |
| |
| ====== Spotkania ====== |
| [[pl:miw:miw08_semantic_wiki:spotkania]] |
====== Materiały ====== | ====== Materiały ====== |
| ===== Wybrane Wikis ===== |
| * [[http://semantic-mediawiki.org/|SemanticMediaWiki]] |
| * [[http://ikewiki.salzburgresearch.at/|Ike Wiki]] |
| * [[http://argentera.inria.fr/|SweetWiki]] |
| |
| ===== Propozycja Dr Wojnickiego ===== |
| To support AI teaching process and idea of a Semantic Wiki based on Prolog emerged. |
| It would support running Prolog code on the web server while rendering a wiki page. |
| Contents of such a page consists of a human-readable text, and optionally images, attachments etc, and a machine-readable and automatically interpreted knowledge expressing what the page is about. |
| |
| To support Prolog programming within the wiki there is an ongoing prototype implementation of a Prolog inference engine embedded into a DokuWiki system working as its extension. |
| It is called Prolog DokuWiki. |
| |
| As a result, in addition to text-based human-readable contents, there are Prolog clauses embedded into wiki pages. |
| These clauses can be automatically interpreted upon requesting the page. |
| Results of the interpretation (inference) process are directly rendered into the page. |
| |
| This constitutes a Semantic Wiki System based on Prolog. |
| It is similar, to some extent, to the semantic wiki systems currently available (Semantic MediaWIki, IkeWiki, SweetWiki). |
| Other semantic wiki systems use XML to annotate gathered information semantically while Prolog DokuWiki uses Prolog language clauses. |
| Furthermore, the clauses are interpreted upon displaying a given page. |
| |
| The extension introduces a new element indicated by a tag called ''prolog''. |
| Any text within the element is treated as Prolog clauses, it is interpreted by an externally launched Prolog inference engine. |
| As the inference engine SWI-Prolog is used. |
| |
| Upon rendering a page with a ''prolog'' element, the wiki system launches the inference engine which process clauses within the tag. |
| Standard output of the inference process is displayed in place of the element. |
| |
| There are special predicates which allow populating knowledge base with clauses from arbitrary chosen pages or namespaces. |
| There is a ''wiki/1'' predicate defined which triggers the inference engine to interpret clauses embedded within other wiki pages. |
| If the first argument is a valid wiki page, the predicate browses it and interprets (consults) all clauses within ''prolog'' tags on this page. |
| If the argument is a namespace it browses all pages from this namespace and interprets all clauses found within the pages. |
| There is another predicate ''wiki_recursive/1'' which interprets clauses from all pages in the given as a first argument namespace and all namespaces within it recursively. |
| |
| |