2011-10-01 19 views
25

Sto cercando di analizzare le parole da una stringa e inserirle in una matrice. Ho provato la seguente cosa:Ruby: Estrarre parole da stringa

@string1 = "oriented design, decomposition, encapsulation, and testing. Uses " 
puts @string1.scan(/\s([^\,\.\s]*)/) 

Sembra di fare il trucco, ma è un po 'traballante (devo includere caratteri speciali, ad esempio). C'è un modo migliore per farlo in ruby?

Opzionale: Ho una descrizione del corso cs. Ho intenzione di estrarre tutte le parole da esso e metterle in un array di stringhe, rimuovere la parola più comune in inglese dall'array prodotto, e quindi usare il resto delle parole come tag che gli utenti possono usare per cercare cs corsi.

+2

La lingua inglese è difficile da analizzare con le espressioni regolari. Hai considerato un parser del linguaggio naturale? Riconoscerà più accuratamente la differenza tra i periodi nella frase 'Mr. Smith è qui e restituisce "Mr." come una singola parola che include il punto, ma "qui" senza il punto. –

+0

@MarkByers, ottimo punto, non l'ho fatto a questo punto. Lo esaminerò. Grazie! – sybohy

risposta

53

Il comando di divisione.

words = @string1.split(/\W+/) 

dividerà la stringa in un array basato su un'espressione regolare. \ W indica qualsiasi carattere "non parola" e "+" significa combinare più delimitatori.

+0

Funziona benissimo! Grazie! – sybohy

+0

C'è qualcosa di diretto in Python? Grazie! – Navneet

+4

Questo non sempre funziona. "Café Restaurant" .split (/ \ W + /) => ["Caf", "Restaurant"] rilascia il carattere speciale. – Swards

12

Beh, si potrebbe dividere la stringa su spazi se è la vostra delimitatore di interesse

@string1.split(' ') 

o dividere su confini di parola

\W # Any non-word character 

\b # Any word boundary character 

O sulla non-parole

\s # Any whitespace character 

Suggerimento: prova a provare ognuno di questi su http://rubular.com

e notare che Ruby 1.9 presenta alcune differenze da 1,8

+1

Come notato nella risposta di david nehme, potresti voler usare l'operatore + per indicare uno o più caratteri successivi che corrispondono a quel modello – BF4

+0

Inoltre, la scansione è ottima per estrarre schemi di corrispondenza da un testo e funziona con il contrario dei nostri suggerimenti divisi sopra ad es s.scan (/ w + /) – BF4

+0

grazie per i tanti grandi suggerimenti! Ho giocato molto con i rubinetti stamattina ed è uno strumento didattico straordinario. Stavo solo avendo problemi nell'implementare l'estrazione del pattern selezionato nel mio codice. @ string1.split (% r {\ W +}) sembra funzionare bene ma Mark Byers (il commentatore sopra) ha un buon aspetto sull'analisi del linguaggio naturale, quindi dovrò tenerlo a mente. In ogni caso, GRAZIE! – sybohy

1

Per Rails si può usare qualcosa di simile:

@string1.split(/\s/).delete_if(&:blank?) 
10

Per me il migliore per frasi spliting è:

line.split(/[^[[:word:]]]+/) 

Anche con parole multilingue e segni di punteggiatura funzionano perfettamente:

line = 'English words, Polski Żurek!!! crème fraîche...' 
line.split(/[^[[:word:]]]+/) 
=> ["English", "words", "Polski", "Żurek", "crème", "fraîche"] 
+0

Grazie. Funziona bene per parole non latine. –

+0

E riguardo le contrazioni? – Pachonk

+0

["can", "t"] contrazioni della maniglia – JLB

Problemi correlati