Я анализирую неструктурированные документы в структурированное представление (XML), используя шаблон для описания ожидаемого результата. Простая типичная проблема может быть списком строк:
"Chapter 1"
"Section background"
"this is something"
"this is another"
"Section methods"
"take some xxx"
"do yyy"
"and some..."
"Chapter apparatus"
"we created..."
который я хочу преобразовать в:
<div role="CHAPTER" title="1">
<div role="SECTION" title="background">
<p>this is a paragraph...</p>
<p>this is another...</p>
</div>
<div role="SECTION" title="methods">
<p>take some xxx</p>
<p>do yyy</p>
<p>and some...</p>
</div>
</div>
<div role="CHAPTER" title="apparatus">
<div role="SECTION" title="???">
<p>we created...</p>
</div>
</div>
Метки CHAPTER и SECTION отсутствуют в строках, но генерируются из эвристических регулярных выражений (например, "[Cc]hap(ter)?(\s\d+\.)?.*
") и применяются ко всем строкам.
Предполагаемый результат описывается «шаблоном», который в настоящее время выглядит примерно так:
<template count="0," role="CHAPTER">
<regex>[Cc]hap(ter)?(\s+.*)</regex>
<template count="0," role="SECTION">
<regex>[Ss]ec(tion)?(\s+.*)</regex>
<template count="0," role="p">
<regex>.*</regex>
</template>
</template>
</template>
(в некоторых случаях значения могут быть диапазонами, например 2,4).
Я знаю, что это очень сложная проблема (SGML пытался решить ее части), и что реальные документы не соответствуют аккуратно таким шаблонам, поэтому я готов к частичному анализу, а также к потере некоторой точности и отзыву.
В течение нескольких лет я использовал свой собственный рабочий код, который работает с документами размером до нескольких мегабайт в разных типах. Производительность не проблема. У меня есть разные шаблоны для разных типов документов (тезисы, файлы журналов, вывод на фортран и т. Д.). Некоторые документы имеют вложенную структуру (например, как указано выше), в то время как другие более плоские, но имеют много других типов разметки.
Я сейчас рефакторинг и удивляюсь:
- есть ли набор инструментов с открытым исходным кодом, который решает эту проблему? (желательно Java)
- если нет, могу ли я использовать стратегию группировки XSLT2 в сочетании с регулярными выражениями
- или я должен использовать автомат? Если это так, я должен использовать инструментарий или написать свой собственный?
РЕДАКТИРОВАТЬ: @naspinski и вообще. Всегда можно написать конкретный код сценария для решения конкретных проблем. Я хочу общее решение, поскольку я могу анализировать многие (даже миллионы) документов с заметной (но не бесконечной) изменчивостью структуры. Я хочу, чтобы структура проанализированных документов была выражена в XML, а не в скрипте. Я считаю, что будет проще добавлять новые решения с помощью шаблонов (декларативных), а не сценариев.
РЕДАКТИРОВАТЬ Я почти уверен, что мой лучший подход сейчас заключается в использовании ANTLR. Это мощный инструмент, который из моих первоначальных исследований может анализировать строки и группы линий.