2009-07-07 2 views
9

Я пытаюсь разобрать (на Java) разметку Викимедиа, найденную в Википедии. Существует несколько существующих пакетов для этой задачи, но я не нашел подходящих для моих нужд особенно хорошо. Лучший пакет, с которым я работал, - это Mathclipse Bliki parser, который делает достойную работу на большинстве страниц.Разбор викимедийной разметки - парсеры на основе EBNF плохо подходят?

Этот анализатор является неполным и не может анализировать некоторые страницы или неправильно анализировать другие. К сожалению, код довольно грязный, и поэтому устранение проблем в этом синтаксическом анализаторе очень трудоемко и подвержено ошибкам.

При попытке найти лучший синтаксический анализ я исследовал с использованием анализатора на основе EBNF для этой задачи (в частности, ANTLR). Однако после некоторых попыток кажется, что этот подход не очень хорошо подходит для этой задачи, поскольку разметка Викимедиа относительно расслаблена и поэтому не может быть легко вписана в структурированную грамматику.

Мой опыт работы с ANTLR и подобными анализаторами очень ограничен, однако это может быть моя неопытность, которая вызывает проблемы, а не такие синтаксические анализаторы, по своей сути, плохо подходят для этой задачи. Может ли кто-нибудь, у кого больше опыта в этих темах, весить здесь?

@Stobor: Я уже упоминал, что я рассмотрел различные механизмы синтаксического анализа, в том числе те, которые были возвращены запросом google. Самое лучшее, что я нашел до сих пор, это двигатель Bliki. Проблема в том, что проблемы с фиксацией таких парсеров становятся невероятно утомительными, потому что все они являются по существу длинными цепочками условностей и регулярных выражений, что приводит к коду спагетти. Я ищу что-то более похожее на метод разбора EBNF, поскольку этот метод намного более ясен и более краток, и поэтому его легче понять и развиться. Я видел ссылку MediaWiki, которую вы опубликовали, и, похоже, подтверждает мои подозрения, что EBNF из коробки плохо подходит для этой задачи. Таким образом, я ищу механизм синтаксического анализа, который ясен и понятен, как EBNF, но также способен обрабатывать беспорядочный синтаксис разметки wiki.

+0

Это может быть хорошо, если вы могли бы указать несколько потребностей, которые не могут быть удовлетворены верхние хиты на http://google.com/search?q=wikipedia+java+parser, чтобы мы могли предложить лучшие ответы ... – Stobor

+0

также: http://www.mediawiki.org/wiki/Markup_spec/BNF – Stobor

ответ

4

Разбор содержимого медиавики в любом родовом смысле в значительной степени невозможно с помощью самой медиавики.Чтобы разобрать его, вы должны иметь возможность полностью анализировать HTML и CSS (поскольку они могут быть встроены), а также обрабатывать полное создание и расширение шаблона, а также любое дополнение парсера, которое может использовать релевантный контент. Этот экземпляр шаблона эквивалентен препроцессору.

Это в некоторых смыслах, аналогичных синтаксическому анализу C++, за исключением того, что синтаксический анализатор также обрабатывает некорректный ввод и произвольные дополнения синтаксиса, созданные расширениями парсера. Реальная реализация медиавики очень похожа на Perl 5, первоначальная реализация была не так уж плоха, потому что все краевые случаи просто выпадают, однако все связано друг с другом, но фактически любая последующая реализация для выполнения одной и той же вещи действительно сложна, тем более, что поведение часто возникает и не документируется, а не разрабатывается.

Если вам не нужны 100% страниц для работы или вы можете извлечь весь контент, вы можете сжечь что-то вместе, что сработает для вас, и, как вы уже отметили, есть некоторые пакеты, которые это делают. Не зная ваших реальных точных потребностей, я сомневаюсь, что кто-то может дать вам существенно лучший ответ о том, как его разобрать. Если вам нужно иметь возможность работать на каждой странице и правильно разбирать все, что вам нужно иметь довольно большую команду и несколько лет на работу, и даже тогда у вас все еще есть много мелких дел. не

Короче говоря, не является EBNF грамматику не очень хорошо подходит для разбора Mediawiki разметки, но ничего на самом деле не является ...

+0

Perfect , это был ответ, который я искал. Благодаря! – toluju

3

Вы правы Викимедиа не поддается определению четко определенных грамматистов EBNF.

Вы должны смотреть на инструменты, которые будут возвращаться назад, чтобы иметь возможность анализировать Wiki

btyacc который является возвратами Yacc. http://www.siber.com/btyacc/

Вы можете посмотреть Акцент. Лучше, чем Yacc http://accent.compilertools.net/

Или вам может понадобиться разбивка и выучить некоторый колорит пролога и бросить вас. Что бы вы ни делали, перед вами интересный период обучения.

Успехов

1

Я однажды пытался написать парсер для Boost.Quickbook, который является по существу такой же, как вики-текст, используемый в Википедии.

Это был очень утомительный процесс, чтобы получить некоторые основы работы, но я думаю, что в конечном итоге можно будет написать грамматику EBNF для этого. Если вам интересно, my partial parser доступен онлайн (грамматика встроена в doc-строки).

0

Этот ответ немного отсутствует, но как насчет рендеринга текста, а затем разбора HTML Dom, чтобы выяснить различные компоненты вики.

 Смежные вопросы

  • Нет связанных вопросов^_^