2010-09-08 2 views
7

Supponiamo di avere una stringa generata in modo casuale s=t&^%JHGgfdteam*&HGEdfg, qual è l'approccio migliore per contare il numero di parole inglesi in quella stringa? (Parole inglesi come definite in alcuni file di dizionario). Ovviamente la forza bruta non è una buona idea ... un suffisso-tri e funzionerebbe? Ricerca binaria? Si noti che nel caso di s, ci sono due parole: "tè" e "squadra". Qualche idea? Cordiali salutiConteggio di parole inglesi in una stringa casuale

+0

"am" è una parola inglese. – erickson

+0

"a" è anche una parola inglese. – paxdiablo

+0

"ged" è anche una parola inglese. –

risposta

9

Vorrei caricare le parole del dizionario in una struttura Trie, quindi leggere la stringa da sinistra a destra e controllare se le sottostringhe sono nel trie. Se sono e ci sono bambini, continua. Se capita di essere una foglia o una parola valida, aggiungi al conteggio delle occorrenze.

In pseudo-codice:

Trie dict = ... // load dictionary 
Dictionary occurences = {} 

for i in length(string): 
    j = i + 1 
    # think of partial as string.Substring(i, j); 
    while dict.hasChildren(partial): 
     j++ 
     if isWord(partial): 
      dict[partial]++ 

In questo modo sarete garantisco che non perde un incontro, mentre ancora alla ricerca di tutte le possibilità.

è possibile limitare la lunghezza minima delle parole valide, modificando ciò che j viene inizializzato o rifiutando le parole brevi nel metodo isWord() (così a non sarebbe una parola "valido").

+0

Questo dovrebbe essere più che sufficiente per iniziare. Grazie! –

6

Il Aho-Corasick string matching algorithm crea la struttura di corrispondenza in tempo lineare nella dimensione del dizionario e corrisponde a modelli in tempo lineare nella dimensione del testo di input + numero di corrispondenze trovate.

+0

+1: Un trie è buono, ma un trie + un buon algoritmo di ricerca è di gran lunga migliore. –

+0

Bel complemento. Upvoted. –