У меня есть список векторов символов, представляющих слова, разделенные на фонемы:
> head(words)
[[1]]
[1] "UU"
[[2]]
[1] "EY" "Z"
[[3]]
[1] "T" "R" "IH" "P" "UU" "L" "EY"
[[4]]
[1] "AA" "B" "ER" "G"
[[5]]
[1] "AA" "K" "UU" "N"
[[6]]
[1] "AA" "K" "ER"
Для каждого слова в списке хотелось бы найти количество слов, отличающихся от рассматриваемого слова на одну фонему (одна фонема добавлена, вычтена или заменена) и имеющих одинаковое количество фонем на тех же позициях. В этом смысле для слова "EY" "Z"
допустимы следующие случаи:
[1] "M" "EY" "Z"
[1] "AY" "Z"
[1] "EY" "D"
[1] "EY" "Z" "AH"
Но следует отклонить следующие случаи:
[1] "EY" "D" "Z"
[1] "Z" "EY" "D"
[1] "HH" "EY"
По сути, я хотел бы найти различия одного элемента в отношении положения фонем в векторах. На данный момент лучшее решение, которое я нашел, это:
diffs <- c()
for (i in seq_along(words)) {
diffs <- c(diffs, sum(sapply(words, function(y) {
count <- 0
elements <- list(words[[i]], y)
len <- c(length(words[[i]]), length(y))
if (identical(elements[which(len==max(len))][[1]][-1], elements[which(len==min(len))][[1]]) == 1) {
count + identical(elements[which(len==max(len))][[1]][-1], elements[which(len==min(len))][[1]])
} else {
length(elements[which(len==min(len))][[1]]) <- length(elements[which(len==max(len))][[1]])
elements <- rapply(elements, f=function(x) ifelse(is.na(x),"$$",x), how="replace" )
count + sum(elements[[1]] != elements[[2]])
}
})== 1))
}
Однако это решение требует времени, потому что мой список words
содержит 120 000 элементов (слов/векторов), поэтому я хотел бы спросить, знаете ли вы другие решения для ускорения процесса.
Заранее большое спасибо за ваши ответы
[1] "EY" "D" "Z"
не является приемлемым случаем? Означает ли это, что вы можете добавить только в начале или в конце? Это то же самое для удаления? - person F. Privé   schedule 03.09.2017