Подтвердить что ты не робот

Грамматический вывод регулярных выражений для заданного конечного списка репрезентативных строк?

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

Не слишком сложно смотреть на наборы этих строк один за другим, чтобы увидеть шаблоны; к сожалению, около 24 000 из этих уникальных строк разбиты на 33 категории и 1714 подкатегорий, поэтому несколько больно делать это вручную.

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

Я рассмотрел повторение жадного алгоритма с длинной общей подстрокой, но это происходит только потому, что оно не скроет ничего, кроме точных совпадений, поэтому не будет обнаруживать, скажем, общую картину различных числовых строк в конкретном положение в грамматике.

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

4b9b3361

Ответ 1

Да, оказывается, это действительно существует; требуется то, что известно академически как алгоритм обучения DFA, примеры которого включают:

  • Angluin L *
  • L * (добавление встречных примеров к столбцам)
  • Кирнс/Вазирани
  • Rivest/Schapire
  • NL *
  • Регулярный положительный отрицательный вывод (RPNI)
  • DeLeTe2
  • Алгоритм Бирмана и Фельдмана
  • Алгоритм Бирмана и Фельдмана (с использованием SAT-решения)

Источник для вышеописанного libalf, рамки алгоритма обучения автоматов с открытым исходным кодом на С++; описания, по крайней мере, некоторых из этих алгоритмов можно найти в этот учебник и другие. Существуют также алгоритмы грамматического вывода (включая обучение DFA) в gitoolbox для MATLAB.

Так как этот вопрос появился до и в прошлом не был удовлетворительно удовлетворен, я в процессе оценки этих алгоритмов и буду обновлять информацию о насколько они полезны, если только кто-то, у кого больше опыта в этой области, сначала (что предпочтительнее).

ПРИМЕЧАНИЕ: Я принимаю свой собственный ответ, но с радостью соглашусь с лучшим, если кто-то сможет его предоставить.

ДАЛЬНЕЙШЕЕ ЗАМЕЧАНИЕ: Я решил пойти по пути использования пользовательского кода, поскольку использование общего алгоритма оказывается немного избыточным для данных, с которыми я работаю, Я оставляю этот ответ здесь, если кому-то это понадобится, и будет обновляться, если я когда-либо его оцениваю.

Ответ 2

Единственное, что я могу предложить, - это немного поработать с Nltk (набор инструментов для Natural Language Toolkit для Python) и посмотреть, может ли он по крайней мере, распознавать повторяющиеся шаблоны.

Еще одна вещь, которую вы можете изучить, - MALLET (пакет на основе Java для обработки статистического естественного языка, классификация документов, кластеризация, тематическое моделирование, извлечение информации и т.д.)

Perl имеет что-то, называемое LinkParser, но, похоже, вам требуется предоставить представление о фактической грамматике (с другой стороны, он поставляется с большой набор различных моделей, поэтому, возможно, это может быть shoehorned, чтобы помочь вам сортировать ваши образцы).

Gate может позволить вам создавать примеры из подмножества записей в вашем корпусе и, возможно, реконструировать грамматику из них.

Наконец, посмотрите CRAN-репозиторий для пакетов, специфичных для текста.