Opis
Projekt
Pluginy do zainstalowania
Sprawozdanie
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:
<swp>fakt</swp>
Który następnie mozemy odczytać na dowolnej ilości stron. Aby
zrealizować odczyt faktów naleŜy skorzystać z Tagu:
<swp goal=”cel” scope=”przestrzen” />
Gdzie przestrzeń jest to zbiór stron, lub poszczególna strona z której
fakty są w obrębie naszego zainteresowania.
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
<swp></swp>
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
<swp></swp>
, 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.
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
<swp goal= scope= />
). Oraz pliku corowego, będę tak nazywał plik który posiada
wpisane fakty (w Tagach
<swp></swp>
).
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).
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 <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
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).
<swp>
spotkanie(data(3.4.8)).
</swp>
<swp goal="spotkanie(X)" scope="pl:miw"/>
swipl -f mojpliktymcz.pl -g 'spotkanie(X),write(X),halt.'
Spotkania
Materiały
Wybrane Wikis
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.