У мене є ця невеличка функція для отримання оцінки асонансу для тексту
getAssonanceScore <- function(book, count) {
#for each sentence
for (i in length(book[[1]])){
words <- strsplit(book[i], "\ ")
for (j in length(words[[1]])){
if (substr(words[[1]][j],1,1) == substr(words[[1]][j+1],1,1) ) {
count <- count + 1
}
}
}
count <- count / length(book)
return (count)
}
Це робить те, що він отримує список з одним рядкомтексту на першій позиції та другий рядок тексту на другій позиції тощо. Отримавши цей рядок, він розбиває речення і включає його до списку, що містить усі складові слова. Що я з цим роблю, так це те, що я порівнюю першу літеру першого слова з першою літерою другого слова, і першу літеру другого слова з першою літерою 3-ї, щоб отримати загальний бал асонансу. Потім це ділиться на тривалість книги. Коли я намагаюся перевірити цю функцію за допомогою невеликого вхідного списку "слово" форми:
> words
[1] "babbling brook by blue grass"
це дає мені цю помилку:
> Error in if (substr(words[[1]][j], 1, 1) == substr(words[[1]][j + 1],
> : missing value where TRUE/FALSE needed
Я працюю в RStudio, і я дуже новачок у R, будь-яка допомога буде дуже вдячна. Дякую!
EDIT: Це має бути getAlliterationScore замість getAssonanceScore: D
Відповіді:
3 для відповіді № 1for j in length(words[[1]])
не робить того, що ви очікуєте; j
лише колись дорівнює повній довжині списку. Це також означає, що j + 1
біжить з кінця списку (так що words[[1]][j + 1]
повертає NA
)
Змініть свій for
циклічна лінія до
for (j in seq_len(length(words[[1]]) - 1)) {
Зараз
getAssonanceScore("babbling brook by blue grass", 0)
повертається 3.
Як зазначалось у коментарях, був би кращий, обчислювально ефективніший та більш стислий підхід
all_words <- unlist(strsplit(book, " "))
count <- sum(substr(head(all_words, -1), 1, 1) ==
substr(tail(all_words, -1), 1, 1))