2011-10-01 11 views
25

Estoy tratando de analizar las palabras de una cadena y ponerlos en una matriz. He intentado lo siguiente:Ruby: Extraer palabras de Cadena

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

Parece que hacer el truco, pero es un poco inestable (que debería incluir más caracteres especiales, por ejemplo). ¿Hay una mejor manera de hacerlo en ruby?

Opcional: Tengo una descripción del curso cs. Tengo la intención de extraer todas las palabras y colocarlas en una matriz de cadenas, eliminar la palabra más común en el idioma inglés de la matriz producida, y luego usar el resto de las palabras como etiquetas que los usuarios pueden usar para buscar cs cursos.

+2

El idioma inglés es difícil de analizar con expresiones regulares. ¿Has considerado un analizador de lenguaje natural? Reconocerá más exactamente la diferencia entre los períodos en la oración 'Sr. Smith está aquí. Y devuelve 'Sr.' como una sola palabra que incluye el punto, pero' aquí' sin el punto. –

+0

@MarkByers, muy buen punto, no lo hice en este punto. Lo investigaré. ¡Gracias! – sybohy

Respuesta

53

El comando de división.

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

dividirá la cadena en una matriz basada en una expresión regular. \ W significa cualquier carácter "sin palabra" y el "+" significa combinar múltiples delimitadores.

+0

¡Funciona increíble! ¡Gracias! – sybohy

+0

¿Hay algo así directamente en Python? ¡Gracias! – Navneet

+4

Esto no siempre funciona. "Café Restaurant" .split (/ \ W + /) => ["Caf", "Restaurant"] suelta el carácter especial. – Swards

12

Bueno, usted podría dividir la cadena en espacios si ese es su delimitador de interés

@string1.split(' ') 

o dividir los límites de palabras

\W # Any non-word character 

\b # Any word boundary character 

O sobre los no palabras

\s # Any whitespace character 

Sugerencia: intente probar cada uno de estos en http://rubular.com

Y tenga en cuenta que Ruby 1.9 tiene algunas diferencias con respecto a 1,8

+1

Como se señaló en la respuesta de David Nehme, es posible que desee utilizar el operador + para indicar uno o más caracteres sucesivos que coincidan con ese patrón – BF4

+0

Además, el escaneo es ideal para extraer patrones coincidentes de un texto y funcionaría con el reverso de nuestras sugerencias divididas arriba, por ejemplo s.scan (/ w + /) – BF4

+0

¡gracias por la gran sugerencia! Jugué mucho con el rubro esta mañana y es una herramienta de enseñanza increíble. Solo me costaba implementar la extracción del patrón seleccionado en mi código. @ string1.split (% r {\ W +}) parece funcionar bien, pero Mark Byers (comentador anterior) tiene un buen punto sobre el análisis del lenguaje natural, así que tendré que tenerlo en cuenta. En cualquier caso, ¡GRACIAS! – sybohy

1

para los carriles se puede usar algo como esto:

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

Para mí el mejor de frases spliting es:

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

Incluso con palabras y signos de puntuación multilingües funcionan perfectamente:

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

Gracias. Funciona bien para palabras que no sean latinas. –

+0

¿Qué pasa con las contracciones? – Pachonk

+0

["can", "t"] manipular contracciones – JLB

Cuestiones relacionadas