2011-12-17 40 views
14

Estoy buscando asignar algunas puntuaciones de legibilidad diferentes al texto en R, como Flesh Kincaid.Contando sílabas

¿Alguien sabe de una manera de segmentar palabras en sílabas usando R? No necesariamente necesito los segmentos de sílaba en sí mismos, sino un conteo.

Así, por ejemplo:

x <- c('dog', 'cat', 'pony', 'cracker', 'shoe', 'Popsicle') 

habría Rendimiento: 1, 1, 2, 2, 1, 3

Cada número correspondiente el número de sílabas en la palabra.

Respuesta

8

GSK3 es correcta: si quieres una solución correcta, es no trivial.

Por ejemplo, usted tiene que estar atento a las cosas extrañas como e muda al final de una palabra (por ejemplo panel), o saber cuando no está en silencio, como en final.

Sin embargo, si lo que desea es un rápida y sucio aproximación, esto lo hará:

> nchar(gsub("[^X]", "", gsub("[aeiouy]+", "X", tolower(x)))) 
[1] 1 1 2 2 1 3 

Para comprender cómo las partes de trabajo, simplemente tira de lejos la función llama de afuera hacia adentro, comenzando con nchar y luego gsub, etc ... ... hasta que la expresión tenga sentido para usted.

Pero supongo que, considerando una pelea entre el poder de R frente a la profusión de excepciones en el idioma inglés, podrías obtener una respuesta decente (tal vez 99% ¿no?) Analizando texto normal, sin mucho trabajo - diablos , el analizador simple anterior puede obtener el 90% más a la derecha. Con un poco más de trabajo, podrías lidiar con e silenciosas si quieres.

Todo depende de su aplicación, si esto es suficientemente bueno o necesita algo más preciso.

+0

realmente agradable respuesta. –

+0

ty - gotta love expresiones regulares 8 ^) – kfmfe04

+2

Una versión más eficiente y simple de la misma aproximación sería algo como 'sapply (gregexpr (" [aeiouy] + ", x, ignore.case = TRUE), longitud)' . –

4

El paquete koRpus te ayudará muchísimo, pero es un poco difícil trabajar con él.

stopifnot(require(koRpus)) 
tokens <- tokenize(text, format="obj", lang='en') 
flesch.kincaid(tokens) 
+1

Ahora tengo una función para contar las sílabas con mucha precisión y para hacer flesch.kincaid. Planeo liberarlo en algún momento de este verano. –

+0

@Tyler Rinker ¡Eso es increíble! Publique un comentario aquí cuando esté fuera. ¿Qué tan rápido es tu función? – Zach

+0

Hice benchmarking en ese momento (recibí mucha ayuda usando tablas hash de personas de talkstats.com) pero no puedo recordarlo a mano. digamos que es tan rápido como los contadores de sílabas en línea y más preciso. Utilizo un enfoque combinado de diccionario/algoritmo. La tabla hash lo hace volar. –

10

qdap version 1.1.0 hace esta tarea:

library(qdap) 
x <- c('dog', 'cat', 'pony', 'cracker', 'shoe', 'Popsicle') 
syllable_sum(x) 

## [1] 1 1 2 2 1 3 
+3

solo para agregar una gran aplicación: http://rpubs.com/bbolker/6742 –

+0

Gracias por compartir Yihui :-) –