2011-12-17 15 views
14

Sto cercando di assegnare alcuni punteggi di leggibilità diversi al testo in R come il Flesh Kincaid.Conteggio sillabe

Qualcuno sa di un modo per segmentare le parole in sillabe usando R? Non ho necessariamente bisogno dei segmenti della sillaba ma di un conteggio.

così per esempio:

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

sarebbe resa: 1, 1, 2, 2, 1, 3

Ciascun numero corrispondente al numero di sillabe nella parola.

risposta

8

GSK3 è corretta: se si desidera una soluzione corretta, è non banale.

Per esempio, è necessario guardare fuori per le cose strane come in silenzio e alla fine di una parola (ad es riquadro), o sapere quando non è in silenzio, come in finale.

Tuttavia, se si desidera solo una quick-and-dirty approssimazione, questo lo farà:

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

Per capire come le parti funzionano, solo spogliare la funzione chiama dall'esterno verso l'interno, a partire da nchar e poi da gsub, ecc ... ... fino a quando l'espressione ha senso per te.

Ma la mia ipotesi è, considerando una lotta tra il potere di R contro la profusione di eccezioni in lingua inglese, si potrebbe ottenere una risposta decente (forse il 99% giusto?) Analizzando il testo normale, senza molto lavoro - diamine , il semplice parser sopra può ottenere il 90% + a destra. Con un po 'più di lavoro, potresti occuparti di silent e se lo desideri.

Tutto dipende dalla vostra applicazione - se questo è abbastanza buono o avete bisogno di qualcosa di più preciso.

+0

risposta veramente bello. –

+0

ty - devo amare le espressioni regolari 8 ^) – kfmfe04

+2

Una versione più efficiente e più semplice della stessa approssimazione sarebbe qualcosa come 'sapply (gregexpr (" [aeiouy] + ", x, ignore.case = TRUE), lunghezza)' . –

4

Il pacchetto koRpus vi aiuterà a immensley, ma è un po 'difficile da lavorare.

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

Ora ho una funzione per contare le sillabe molto accuratamente e per fare flesch.kincaid. Ho intenzione di rilasciarlo un po 'di tempo quest'estate. –

+0

@Tyler Rinker È fantastico! Pubblica un commento qui quando è fuori. Quanto è veloce la tua funzione? – Zach

+0

Ho fatto benchmarking in quel momento (ho ricevuto molto aiuto usando le tabelle hash delle persone di talkstats.com) ma non ricordo nulla. diciamo solo che è veloce quanto i contatori delle sillabe on line e più preciso. Io uso un approccio combinato dizionario/algoritmo. Il tavolo hash lo fa volare. –

10

qdap version 1.1.0 fa questo compito:

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

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

solo per aggiungere una grande applicazione: http://rpubs.com/bbolker/6742 –

+0

Grazie per aver condiviso Yihui :-) –