|
|
pl:miw:miw08_semantic_wiki [2008/06/14 15:06] gjn |
pl:miw:miw08_semantic_wiki [2019/06/27 15:50] |
====== Opis ====== | |
__**Projekt zakończony**__ | |
| |
Marcin Juszkiewicz, <monitorr@interia.pl> | |
| |
| |
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: | |
<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). | |
| |
====== Spotkania ====== | |
| |
<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.' | |
| |
===== 08.03.04 ===== | |
* ogólnie: kto coś już z tym robił? | |
| |
- http://korrekt.org/papers/KroetzschVrandecicVoelkelHaller_SemanticMediaWiki_2007.pdf | |
- http://www.semanticwiki.com/ | |
- http://www2006.org/programme/files/xhtml/4039/xhtml/fp4039-voelkel.html | |
- http://argentera.inria.fr/wiki/data/Main/MainHome.jsp | |
| |
* przechowywanie wiedzy semantycznej w wiki | |
| |
- http://pediaview.com/openpedia/Resource_Description_Framework | |
- http://pediaview.com/openpedia/Web_Ontology_Language | |
| |
* przechowywanie //reguł// w wiki | |
- http://wiki.splitbrain.org/wiki:syntax | |
- http://kaukoluwiki.opendfki.de/wiki/SemanticWikiSyntax | |
- http://www.xml.com/pub/a/2006/12/13/semantic-wikis-and-disaster-relief-operations.html?page=2 | |
| |
| |
| |
| |
| |
| |
| |
===== 080318 ===== | |
* plugin w php do dokuwiki, urucham po stronie serwera swiprolog | |
- http://student.agh.edu.pl/~mjuszkie/miw.txt | |
- http://gollem.science.uva.nl/SWI-Prolog/Manual/compilation.html | |
| |
| |
===== 080408 ===== | |
* prototyp | |
| |
| |
===== 080527 ===== | |
* cache? | |
| |
| |
===== 080603 ===== | |
* beta pluginu do zainst | |
* zarys sprawozd: cel, specyfi (fun), możliwe realizacje+projekt, implementacja, problemy+uwagi, etc.. | |
* opis koncepcji cache w sprawozd | |
| |
====== 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. | |
| |
| |