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

Предположим, есть много текстов, о которых известно, что они сделаны из одного шаблона (например, много HTML-страниц, отрисованных из шаблона, подкрепленного данными из какой-либо базы данных). Очень простой пример:

id:937 name=alice;
id:28 name=bob;
id:925931 name=charlie;

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

"id:" + $1 + " name=" + $2 + ";"

и 3 набора строк, которые были использованы с этим шаблоном:

  • $ 1 = 937, $ 2 = alice
  • $ 1 = 28, $ 2 = bob
  • $ 1 = 925931, $ 3 = charlie

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

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

Бонусный вопрос: есть ли готовые решения для этого?

2 ответа

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

Сказав это, что-то вроде RecordBreaker может помочь. Вы также можете использовать Google для ознакомления, если найдете какие-то полезные ссылки.

Выполните глобальное выравнивание нескольких последовательностей, а затем вызовите каждый результирующий столбец, который имеет постоянную часть значения шаблона:

                   id:   937 name=alice  ;
                   id: 28    name=bob    ;
                   id:925931 name=charlie;
Inferred template: XXX      XXXXXX       X

Большинство инструментов, о которых я знаю для выравнивания нескольких последовательностей, требуют меньших алфавитов - ДНК или белка - но, надеюсь, вы найдете инструмент, который работает с алфавитом, который вы используете (который, по-видимому, по крайней мере, является всеми печатными символами ASCII). В худшем случае вы, конечно, можете реализовать DP самостоятельно: чтобы выровнять 2 последовательности (строки) глобально, вы используете алгоритм Нидлмана-Вунша, в то время как для более чем двух последовательностей существует несколько подходов, наиболее распространенным из которых является сумма пар скоринг. Точный алгоритм для k > 2 последовательностей, к сожалению, требует экспоненциального времени в k, но эвристика, используемая в инструментах биоинформатики, таких как MUSCLE, намного быстрее и производит выравнивания, которые очень хороши. Если их убедить работать с алфавитом, который вы используете, они будут естественным выбором.

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