Алгоритм динамического программирования
Кажется, то, что вы ищете, очень похоже на то, что делает алгоритм Смита-Уотермана .
Из Википедии:
Алгоритм был впервые предложен Темплом Ф. Смитом и Майклом С. Уотерманом в 1981 году. Как и алгоритм Needleman-Wunsch ,Смит-Уотерман представляет собой алгоритм динамического программирования .Как таковое, оно обладает желаемым свойством, заключающимся в том, что оно гарантирует оптимальное локальное выравнивание по отношению к используемой системе оценки (которая включает в себя матрицу замещения и схему оценки промежутка).
Давайте рассмотрим практический пример, чтобы вы могли оценить его полезность.
Предположим, у нас есть текст:
text = "We the people of the United States, in order to form a more
perfect union, establish justice, insure domestic tranquility,
provide for the common defense,
promote the general welfare,
and secure the blessings of liberty to ourselves and our posterity,
do ordain and establish this Constitution for the United States of
America.";
Я выделил сегмент, которому мы собираемся соответствовать, просто для удобства чтения.
Мы сравним сродство (или сходство) со списком строк:
list = {
"the general welfare",
"my personal welfare",
"general utopian welfare",
"the general",
"promote welfare",
"stackoverflow rulez"
};
У меня уже реализован алгоритм, поэтому я вычислю сходство и нормализую результаты:
sw = SmithWatermanSimilarity[ text, #] & /@ list;
swN = (sw - Min[sw])/(Max[sw] - Min[sw])
Затем мы планируем результаты:
Я думаю, что это очень похоже на ваш ожидаемый результат.
HTH!
Некоторые реализации (с исходным кодом)