Лексеры / парсеры для (не) структурированных текстовых документов

Существует множество синтаксических анализаторов и лексеров для скриптов (т.е. структурированных компьютерных языков). Но я ищу тот, который может разбить (почти) неструктурированный текстовый документ на большие разделы, например, главы, абзацы и т. Д.

Для человека относительно легко идентифицировать их: где Оглавление, подтверждения или где начинается основная часть, и можно построить системы на основе правил, чтобы идентифицировать некоторые из них (например, параграфы).

Я не ожидаю, что он будет идеальным, но кто-нибудь знает о таком широком "основанном на блоках" лексере / парсере? Или вы могли бы указать мне направление литературы, которая может помочь?

4 ответа

Многие легковесные языки разметки, такие как разметка (которую, кстати, использует SO), реструктурированный текст и (возможно) POD, похожи на те, о которых вы говорите. Они имеют минимальный синтаксис и разбивают входные данные на синтаксически разбираемые фрагменты. Вы можете получить некоторую информацию, прочитав об их реализации.

Попробуйте: фрагменты, геши или преттифи

Они могут справиться практически со всем, что вы на них бросаете, и очень прощают ошибки в вашей грамматике, а также в ваших документах.

Рекомендации:
Gitorius использует prettify,
Github использует фрагменты,
розеттакод использует геши,

  1. Определите стандарт аннотации, который указывает, как вы хотите разбить вещи на части.
  2. Перейдите к Amazon Mechanical Turk и попросите людей пометить 10K-документы, используя ваш стандарт аннотаций.
  3. Тренируйте CRF (который похож на HMM, но лучше) на этих тренировочных данных.

Если вы действительно хотите пойти по этому пути, я могу уточнить детали. Но это будет много работы.

Большинство программ lex/yacc работают с четко определенной грамматикой. если вы можете определить свою грамматику в формате BNF (который большинство синтаксических анализаторов принимают схожим синтаксисом), то вы можете использовать любой из них. Это может указывать на очевидное. Однако вы все еще можете быть немного нечеткими в отношении "блоков" (токенов) текста, которые будут частью вашей грамматики. Ведь вы определяете правила для своих токенов.

В прошлом я использовал Perl-модуль Parse-RecDescent с разным уровнем успеха для подобных проектов.

Извините, это может быть не очень хороший ответ, но больше я делюсь своим опытом в подобных проектах.

Другие вопросы по тегам