2009-07-07 3 views
9

Sto tentando di analizzare (in Java) il markup di Wikimedia come trovato su Wikipedia. Ci sono un certo numero di pacchetti esistenti là fuori per questo compito, ma non ho trovato nessuno adatto alle mie esigenze particolarmente bene. Il miglior pacchetto con cui ho lavorato è lo Mathclipse Bliki parser, che fa un lavoro decente sulla maggior parte delle pagine.Analisi di markup wikimedia: i parser basati su EBNF sono inadeguati?

Questo parser è incompleto, tuttavia, e non riesce a analizzare alcune pagine o le analisi in modo errato su altri. Purtroppo il codice è piuttosto disordinato e quindi risolvere i problemi in questo motore di analisi è molto dispendioso in termini di tempo e tempo.

Nel tentativo di trovare un motore di analisi migliore, ho studiato utilizzando un parser basato su EBNF per questo compito (in particolare ANTLR). Tuttavia, dopo alcuni tentativi sembra che questo approccio non sia particolarmente adatto per questo compito, poiché il markup di Wikimedia è relativamente rilassato e quindi non può essere facilmente inserito in una grammatica strutturata.

La mia esperienza con ANTLR e parser simili è molto limitata tuttavia, quindi può essere la mia inesperienza che sta causando problemi piuttosto che tali parser sono intrinsecamente poco adatti per questo compito. Qualcuno con più esperienza su questi argomenti può pesare qui?

@Stobor: ho menzionato che ho esaminato vari motori di analisi, compresi quelli restituiti dalla query di Google. Il migliore che ho trovato finora è il motore Bliki. Il problema è che risolvere i problemi con tali parser diventa incredibilmente noioso, perché sono essenzialmente lunghe catene di condizionali ed espressioni regolari, con conseguente codice spaghetti. Sto cercando qualcosa di più simile al metodo di analisi EBNF, in quanto tale metodo è molto più chiaro e conciso, e quindi più facile da capire ed evolvere. Ho visto il link mediawiki che hai postato e sembra confermare i miei sospetti che EBNF out of the box sia inadatto per questa attività. Quindi sto cercando un motore di analisi che sia chiaro e comprensibile come EBNF, ma anche in grado di gestire la sintassi disordinata del markup wiki.

+0

Potrebbe essere bello se si potesse indicare un paio di bisogni che non sono soddisfatte da i migliori successi su http://google.com/search?q=wikipedia+java+parser in modo da poter offrire risposte migliori ... – Stobor

+0

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

risposta

4

L'analisi del contenuto mediawiki in qualsiasi senso generico è praticamente impossibile se si utilizza mediawiki.Per analizzarlo è necessario essere in grado di analizzare completamente HTML e CSS (poiché possono essere incorporati) e gestire l'istanziazione e l'espansione del modello completo, nonché qualsiasi aggiunta di parser che il contenuto pertinente potrebbe aver utilizzato. Quel modello di istanziazione è equivalente a un preprocessore.

È in qualche modo simile all'analisi di C++ tranne che il parser gestisce anche l'input malformato e le aggiunte di sintassi arbitraria create dalle estensioni del parser. L'effettiva implementazione di mediawiki è molto simile a quella di Perl 5, l'implementazione originale non era poi così male perché tutti i casi limite cadono, tuttavia le cose sono collegate tra loro, ma in realtà ottenere un'implementazione successiva per fare la stessa cosa è davvero complicato, specialmente dal momento i comportamenti sono spesso emergenti e non documentati, non progettati.

Se non hai bisogno che il 100% delle pagine funzioni o sia in grado di estrarre tutto il contenuto, potresti riuscire a mettere insieme qualcosa che funziona per te e, come hai notato, ci sono alcuni pacchetti che lo fanno. A parte conoscere le tue reali esigenze, dubito che qualcuno possa darti una risposta sostanzialmente migliore su come analizzarlo. Se devi essere in grado di lavorare su ogni pagina e analizzare correttamente tutto ciò che è meglio avere una squadra abbastanza grande e diversi anni di lavoro, e anche allora hai ancora un sacco di piccoli casi limite.

Così, in breve, senza una grammatica EBNF non è adatto per l'analisi MediaWiki markup, ma niente è davvero ...

+0

Perfetto , questa era la risposta che stavo cercando. Grazie! – toluju

3

Sei corretto Wikimedia non si presta a grammatiche EBNF ben definite.

Dovrete guardare strumenti che BackTrack per essere in grado di analizzare Wiki

btyacc che è un Yacc backtracking. http://www.siber.com/btyacc/

Si potrebbe guardare Accent. Meglio di Yacc http://accent.compilertools.net/

Oppure potresti dover rompere e imparare un po 'di prologo e rotolare di tua proprietà. Qualunque cosa tu faccia hai un interessante periodo di apprendimento prima di te.

Buona fortuna

1

una volta ho provato a scrivere un parser per i Boost.Quickbook, che è essenzialmente lo stesso del wiki-testo utilizzato da Wikipedia.

È stato un processo molto noioso solo per far funzionare alcune nozioni di base, ma penso che alla fine sarebbe stato possibile scrivere la grammatica EBNF per questo. Se sei interessato, lo my partial parser è disponibile online (la grammatica è incorporata in doc-string).

0

Questa risposta è un po 'fuori, ma per quanto riguarda il rendering del testo e l'analisi del Dom HTML per poter capire i diversi componenti del wiki.

Problemi correlati