У меня есть проблема с сопоставлением текстового шаблона, с которой я мог бы использовать некоторое направление. Не очень хорошо знакомый с распознаванием образов в целом, я не знаю, является ли это одним из тех, «о, просто используйте алгоритм blah-blah», или это очень трудная проблема с шаблоном.Распознавание образов операторов SQL
Общая формулировка того, что я хочу сделать, это выявить сходства между рядом операторов SQL, чтобы позволить мне реорганизовать эти выражения на меньшее количество хранимых процедур или других динамически генерируемых фрагментов SQL. Например,
SELECT MIN(foo) FROM bar WHERE baz > 123;
SELECT MIN(footer) FROM bar;
SELECT MIN(foo), baz FROM bar;
все вроде то же самое, но я хотел бы признать, что значение внутри MIN() должен быть сменным значение, что я, возможно, еще один столбец в списке выбора, или необязательное предложение WHERE. Обратите внимание, что этот пример очень хорошо подготовлен, но я надеюсь, что он позволит вам увидеть, что я за ним.
Что касается области видимости, у меня будет множество тысяч операторов SQL, которые я бы надеялся уменьшить до десятков (?) Общих операторов. В исследованиях до сих пор я сталкивался с w-shingles и n-граммами и отказался от таких подходов, как «мешок слов», потому что упорядочение важно. Принимая это из области SQL, другим способом постановки этой проблемы может быть «задана серия текстовых инструкций, каков самый маленький набор текстовых фрагментов, которые можно использовать для сборки этих операторов?»
Это звучит очень похоже на то, что мне нужно делать. Ваша статья и обзор чрезвычайно полезны, указывая путь. Это также заставляет меня хотеть смотреть на инструменты разложения кода и видеть, что стоит за тем, как они работают. – tomo
Чтобы завершить эту мысль, я также нашел эту тему полезной, http://stackoverflow.com/questions/805626/diff-algorithm, которая, в свою очередь, указала мне на эту реализацию C#: http://www.mathertel.de/ Diff/ – tomo
IMHO, самые интересные инструменты для разграничения кода используют одну и ту же базовую технологию, но работают как своего рода дополнение клон-детектору: они * сравнивают * абстрактные деревья синтаксиса и сообщают, что * разные *, а не сообщают, что такое тоже самое. См. «Smart Differencer» на моем сайте; для этой публикации не было опубликовано ни одного документа, но вы должны иметь возможность находить технические документы по разбросу абстрактного синтаксиса на сайте scholar.google.com. –