2009-07-07 5 views
9

Ich versuche, (in Java) Wikimedia Markup wie auf Wikipedia zu analysieren. Es gibt eine Reihe existierender Pakete für diese Aufgabe, aber ich habe keine gefunden, die meinen Anforderungen besonders gut entsprechen. Das beste Paket, mit dem ich gearbeitet habe, ist das Mathclipse Bliki parser, das auf den meisten Seiten einen ordentlichen Job macht.Parsing von Wikimedia Markup - sind EBNF-basierte Parser schlecht geeignet?

Dieser Parser ist jedoch unvollständig und kann bestimmte Seiten oder Parsing für andere nicht korrekt analysieren. Leider ist der Code ziemlich chaotisch und das Reparieren der Probleme in dieser Parsing-Engine ist sehr zeitaufwendig und fehleranfällig.

Beim Versuch, eine bessere Parsing-Engine zu finden, habe ich untersucht, einen EBNF-basierten Parser für diese Aufgabe (speziell ANTLR). Nach einigen Versuchen scheint dieser Ansatz für diese Aufgabe jedoch nicht besonders geeignet zu sein, da das Wikimedia-Markup relativ entspannt ist und daher nicht einfach in eine strukturierte Grammatik eingepasst werden kann.

Meine Erfahrung mit ANTLR und ähnlichen Parsern ist jedoch sehr begrenzt, so dass es eher meine Unerfahrenheit sein kann, die Probleme verursacht, als solche Parser, die von Natur aus schlecht für diese Aufgabe geeignet sind. Kann hier jemand mit mehr Erfahrung zu diesen Themen einsteigen?

@Stobor: Ich habe erwähnt, dass ich verschiedene Analyse-Engines untersucht habe, einschließlich der von der Google-Abfrage zurückgegebenen. Das Beste, was ich bis jetzt gefunden habe, ist die Bliki-Engine. Das Problem ist, dass die Behebung von Problemen mit solchen Parsern unglaublich mühsam wird, da es sich bei ihnen im Wesentlichen um lange Ketten von Bedingungen und regulären Ausdrücken handelt, was zu Spaghetti-Code führt. Ich suche nach etwas, das der EBNF-Methode des Parsens ähnlicher ist, da diese Methode viel klarer und prägnanter ist und somit leichter zu verstehen und zu entwickeln ist. Ich habe den von dir geposteten Link zu einem MediaWiki gesehen und es scheint meinen Verdacht zu bestätigen, dass EBNF out of the box für diese Aufgabe schlecht geeignet ist. Daher suche ich nach einer Parsing-Engine, die klar und verständlich ist wie EBNF, aber auch in der Lage ist, die unordentliche Syntax von Wiki-Markup zu verarbeiten.

+0

Es wäre schön, wenn Sie ein paar Bedürfnisse hinweisen könnten, die nicht erfüllt werden die Top-Hits auf http://google.com/search?q=wikipedia+java+parser, damit wir bessere Antworten anbieten konnten ... – Stobor

+0

auch: http://www.mediawiki.org/wiki/Markup_spec/BNF – Stobor

Antwort

4

Das Parsen von Mediawiki-Inhalten in jedem generischen Sinn ist ziemlich kurz, wenn man mediawiki selbst benutzt.Um es analysieren zu können, müssen Sie in der Lage sein, HTML und CSS vollständig zu parsen (da sie eingebettet werden können) und die vollständige Template-Instantiierung und -Expansion sowie jeden Parser-Zusatz, den der relevante Inhalt verwendet hat, zu handhaben. Diese Template-Instanziierung entspricht einem Präprozessor.

Es ähnelt in gewisser Hinsicht dem Parsen von C++, außer dass der Parser auch fehlerhafte Eingaben und willkürliche Syntaxergänzungen behandelt, die von Parser-Erweiterungen verursacht werden. Die eigentliche Mediawiki-Implementierung ist ähnlich wie Perl 5, die ursprüngliche Implementierung war nicht so schlecht, da alle Randfälle einfach herausfallen, aber die Dinge miteinander verbunden sind, aber tatsächlich jede nachfolgende Implementierung das gleiche zu tun ist wirklich kompliziert, besonders seit der Verhaltensweisen sind oft emergent und nicht dokumentiert, nicht entworfen.

Wenn Sie nicht 100% der Seiten brauchen, um zu arbeiten oder in der Lage zu sein, den gesamten Inhalt zu extrahieren, könnten Sie etwas zusammenbauen, das für Sie funktioniert, und wie Sie bemerkt haben, gibt es einige Pakete, die das tun. Abgesehen davon, dass ich Ihre tatsächlichen genauen Bedürfnisse kenne, bezweifle ich, dass Ihnen jemand eine wesentlich bessere Antwort geben kann, wie Sie es analysieren können. Wenn Sie in der Lage sein müssen, auf jeder Seite zu arbeiten und alles richtig zu parsen, haben Sie ein ziemlich großes Team und mehrere Jahre zu arbeiten, und selbst dann haben Sie immer noch viele kleine Randfälle.

Also kurz gesagt, nicht ein EBNF grammer ist nicht gut geeignet Mediawiki-Markup-Parsing, aber nichts wirklich ist ...

+0

Perfekt , das war die Antwort, die ich suchte. Vielen Dank! – toluju

3

Sie haben Recht Wikimedia eignet sich nicht für EBNF gut definierte Grammer.

Sie müssen bei Tools suchen, die Wiki zu analysieren

btyacc wird Rückzieher in der Lage sein, die ein Rückzieher yacc ist. http://www.siber.com/btyacc/

Sie könnten sich Accent anschauen. Besser als Yacc http://accent.compilertools.net/

Oder Sie müssen möglicherweise zusammenbrechen und lernen etwas Geschmack von Prolog und rollen Sie besitzen. Was auch immer Sie tun, Sie haben eine interessante Lernphase vor sich.

Viel Glück

1

Ich habe einmal versucht, einen Parser für Boost.Quickbook zu schreiben, die im Wesentlichen die gleiche wie die Wiki-Text ist von Wikipedia verwendet.

Es war ein sehr langwieriger Prozess, nur um ein paar Grundlagen zum Laufen zu bringen, aber ich denke, dass es irgendwann möglich sein würde, EBNF-Grammatik dafür zu schreiben. Wenn Sie interessiert sind, ist my partial parser online verfügbar (die Grammatik ist in Doc-Strings eingebettet).

0

Diese Antwort ist ein wenig draußen, aber was ist mit dem Rendern des Textes und dann das Parsen der HTML-Dom, um herauszufinden, verschiedene Wiki-Komponenten.

Verwandte Themen