====== Opis ====== __**Projekt zakończony**__ Marcin Juszkiewicz, prolog wiki plugin, [[http://en.wikipedia.org/wiki/Semantic_wiki|semantic wiki]] research, comparison ====== Projekt ====== ===== 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: fakt Który następnie mozemy odczytać na dowolnej ilości stron. Aby zrealizować odczyt faktów naleŜy skorzystać z Tagu: 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 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 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 , 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: swipl -f tmp.pl -g \’'.$goal.',writeln(X),fail.\''; 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 ). Oraz pliku corowego, będę tak nazywał plik który posiada wpisane fakty (w Tagach ). 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. 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 , 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 ==== 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). spotkanie(data(3.4.8)). swipl -f mojpliktymcz.pl -g 'spotkanie(X),write(X),halt.' ====== Spotkania ====== [[pl:miw:miw08_semantic_wiki:spotkania]] ====== 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.