Eu tenho essa pequena função para obter uma pontuação de Assonance para o texto
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)
}
O que isso faz é obter uma lista com uma linhade texto em sua primeira posição e uma segunda linha de texto em sua segunda posição e assim por diante. Depois de obter essa linha, ela divide a frase e a coloca em uma lista contendo todas as palavras constituintes. O que eu faço com isso é que eu comparo a primeira letra da primeira palavra com a primeira letra da segunda palavra, e a primeira letra da segunda palavra com a primeira letra da terceira para obter uma pontuação total de assonância. Isso é dividido pelo tamanho do livro. Quando tento testar esta função com uma pequena lista de entrada "word" do formulário:
> words
[1] "babbling brook by blue grass"
Isso me dá esse erro:
> Error in if (substr(words[[1]][j], 1, 1) == substr(words[[1]][j + 1],
> : missing value where TRUE/FALSE needed
Eu estou trabalhando no RStudio, e muito iniciante no R, qualquer ajuda seria muito apreciada. Obrigado!
EDIT: Deve ser getAlliterationScore em vez de getAssonanceScore: D
Respostas:
3 para resposta № 1for j in length(words[[1]])
não faz o que você espera; j
é sempre igual ao tamanho total da lista. Isso também significa que j + 1
sai do final da lista (de modo que words[[1]][j + 1]
retorna NA
).
Mude o seu for
linha de loop para
for (j in seq_len(length(words[[1]]) - 1)) {
Agora
getAssonanceScore("babbling brook by blue grass", 0)
retorna 3.
Como observado nos comentários, uma abordagem melhor, computacionalmente mais eficiente e mais concisa seria
all_words <- unlist(strsplit(book, " "))
count <- sum(substr(head(all_words, -1), 1, 1) ==
substr(tail(all_words, -1), 1, 1))