9

ウィキペディアで見つかったウィキメディア マークアップを (Java で) 解析しようとしています。このタスク用の既存のパッケージが多数ありますが、私のニーズに特に適したものは見つかりませんでした。私が使った中で最高のパッケージはMathclipse Bliki パーサーで、ほとんどのページでまともな仕事をします。

ただし、このパーサーは不完全で、特定のページの解析に失敗したり、他のページを正しく解析しません。悲しいことに、コードはややこしいので、この解析エンジンの問題を修正するには非常に時間がかかり、エラーが発生しやすくなります。

より優れた解析エンジンを見つけようとして、このタスクに EBNF ベースのパーサー (特に ANTLR) を使用して調査しました。しかし、いくつかの試行の後、ウィキメディアのマークアップは比較的緩和されており、構造化された文法に簡単に適合できないため、このアプローチはこのタスクにはあまり適していないようです。

ただし、ANTLR および同様のパーサーに関する私の経験は非常に限られているため、そのようなパーサーが本質的にこのタスクにあまり適していないというよりも、問題を引き起こしているのは私の経験不足である可能性があります。これらのトピックについてより多くの経験をお持ちの方は、ここで検討していただけますか?

@Stobor: Google クエリによって返されるものを含め、さまざまな解析エンジンを見てきました。私がこれまでに見つけた最高のものは、Bliki エンジンです。問題は、そのようなパーサーの問題を修正するのが信じられないほど面倒になることです。これらのパーサーはすべて、本質的に条件文と正規表現の長いチェーンであり、結果としてスパゲッティ コードになるからです。EBNF 解析法に似たものを探しています。その方法はより明確で簡潔であり、理解しやすく進化しやすいからです。あなたが投稿した mediawiki のリンクを見てきましたが、箱から出してすぐに使える EBNF はこのタスクにはあまり適していないという私の疑いを裏付けているようです。したがって、私は、EBNF のように明確で理解しやすいだけでなく、wiki マークアップの乱雑な構文を処理できる構文解析エンジンを探しています。

4

4 に答える 4

4

一般的な意味でのmediawikiコンテンツの解析は、mediawiki自体を使用して簡単に行うことはほとんど不可能です。それを解析するには、HTMLとCSSを完全に解析でき(埋め込みが可能であるため)、完全なテンプレートのインスタンス化と拡張、および関連するコンテンツが使用していた可能性のあるパーサーの追加を処理できる必要があります。このテンプレートのインスタンス化は、プリプロセッサと同等です。

ある意味では、パーサーが不正な形式の入力とパーサー拡張によって行われた任意の構文の追加も処理することを除いて、C++の解析と似ています。実際のmediawikiの実装はPerl5によく似ていますが、元の実装はすべてのエッジケースが落ちるだけなのでそれほど悪くはありませんでしたが、実際には後続の実装で同じことを行うのは非常に複雑です。多くの場合、動作は緊急で文書化されておらず、設計されていません。

ページの100%が機能する必要がない場合、またはすべてのコンテンツを抽出できるようにする必要がない場合は、機能するものをまとめることができる可能性があります。すでに述べたように、それを実行するパッケージがいくつかあります。あなたの実際の正確なニーズを知ることを除いて、私は誰もがそれを解析する方法についてあなたに実質的により良い答えを与えることができるとは思えません。すべてのページで作業し、すべてを正しく解析できるようにする必要がある場合は、かなり大規模なチームと数年の作業が必要ですが、それでもまだ多くの小さなエッジケースがあります。

つまり、EBNF文法は、mediawikiマークアップの解析に適していませんが、実際には何もありません...

于 2009-07-16T23:07:03.793 に答える
3

あなたは正しいです。ウィキメディアはEBNFで明確に定義されたグラマーには向いていません。

Wikiを解析できるようにするには、バックトラックするツールを確認する必要があります。

バックトラックyaccであるbtyacc。 http://www.siber.com/btyacc/

あなたはアクセントを見ることができます。Yaccよりも優れている http://accent.compilertools.net/

または、あなたは分解して、あなたが所有するプロローグとロールのいくつかのフレーバーを学ぶ必要があるかもしれません。あなたが何をするにしても、あなたはあなたの前に興味深い学習期間があります。

幸運を

于 2009-07-07T15:49:49.527 に答える
1

私はかつてBoost.Quickbookのパーサーを書こうとしましたが、これはウィキペディアで使用されているウィキテキストと本質的に同じです。

基本を機能させるだけでも非常に退屈なプロセスでしたが、最終的には EBNF 文法を記述できるようになると思います。興味のある方は、私の部分パーサーをオンラインで入手できます (文法はドキュメント文字列に埋め込まれています)。

于 2009-07-07T18:23:13.850 に答える
0

この答えは少し的外れですが、テキストをレンダリングしてから HTML Dom を解析して、さまざまな wiki コンポーネントを把握することはどうでしょうか。

于 2009-07-12T23:26:54.850 に答える