Это известно как алгоритм Нидлмана-Вунша .Он рассчитывает как расстояние между двумя строками, так и так называемый traceback , который позволяет восстановить выравнивание.
Поскольку эта проблема в основном возникает в биологии при сравнении биологических последовательностей,этот алгоритм (и связанные с ним) реализованы в пакете R {Biostrings} , который является частью Bioconductor .
Поскольку этот пакет реализует более общее решение, чемпростое расстояние Левенштейна, использование, к сожалению, более сложное, а виньетка использования соответственно длинна.Но основное использование для ваших целей заключается в следующем:
library(Biostrings)
dist_mat = diag(27L)
colnames(dist_mat) = rownames(dist_mat) = c(letters, ' ')
result = pairwiseAlignment(
"abc abc", "abcde acc",
substitutionMatrix = dist_mat,
gapOpening = 1, gapExtension = 1
)
Это просто не даст вам список c('b', 'c', 'c')
, потому что этот список не полностью отражает то, что на самом деле здесь произошло.Вместо этого он вернет выравнивание между двумя строками.Это может быть представлено в виде последовательности с подстановками и пробелами:
score(result)
# [1] 3
aligned(result)
as.matrix(aligned(result))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
# [1,] "a" "b" "c" "-" "-" " " "a" "b" "c"
aligned(result)
- Для каждого символа во второй строке он предоставляет соответствующий символ в исходной строке, заменяя вставленные символы на -
.По сути, это «рецепт» для преобразования первой строки во вторую.Обратите внимание, что он будет содержать только вставки и замены, но не удаления.Чтобы получить их, вам нужно выполнить выравнивание в обратном направлении (т.е. поменять местами строковые аргументы).