2012-04-20 24 views
6

Estoy tratando de dividir una oración/frase en palabras usando Regex.Cómo divido una frase en palabras usando Regex en C#

var phrase = "This isn't a test."; 
var words = Regex.Split(phrase, @"\W+").ToList(); 

palabras contiene "Este", "ISN", "t", "a", "prueba"

Obviamente es recoger el apóstrofe y la división en eso. ¿Puedo cambiar este comportamiento? También debe ser multilingüe, compatible con una variedad de idiomas (español, francés, ruso, coreano, etc.).

Necesito pasar las palabras a un corrector ortográfico. Específicamente Nhunspell.

return (from word in words let correct = _engine[langId].Spell(word) where !correct select word).ToList(); 
+0

división probar en espacios en lugar? ¿Tiene una buena muestra de casos de uso para demostrar qué debe manejar esta Regex? – mellamokb

+0

Estoy pasando las palabras a un corrector ortográfico, así que necesito perder la puntuación. – Dean

+0

Dado que desea dividir para varios idiomas diferentes, deberá usar un tokenizador que comprenda dichos idiomas. En su ejemplo, no es claramente una palabra, pero en otro idioma, "normalmente no forma parte de la palabra". La mayoría de las librerías de ortografía vienen con un Tokenizer o Analizador que puede hacer este trabajo por usted. – jessehouwing

Respuesta

7

Si desea dividir en palabras con fines de corrección ortográfica, esta es una buena solución:

new Regex(@"[^\p{L}]*\p{Z}[^\p{L}]*") 

Básicamente puede usar Regex.Split usando la expresión regular anterior. Utiliza la sintaxis unicode por lo que funcionaría en varios idiomas (aunque no para la mayoría de los asiáticos). Y no romperá palabras con apóstrofes o guiones.

4

Use Split().

words = phrase.Split(' '); 

Sin puntuación.

words = phrase.Split(new Char [] {' ', ',', '.', ':', , ';', '!', '?', '\t'}); 
1

Realmente no parece que necesite una expresión regular. Simplemente puede hacer:

phrase.Split(" "); 
+0

Solo si quieres puntuación en tus palabras. –

1

¿En qué desea dividirse? Espacios? ¿Puntuación? Tienes que decidir cuáles son los personajes de parada. Una expresión regular simple que usa espacio y algunos caracteres de puntuación sería "[^.?!\s]+". Eso se dividiría en punto, signo de interrogación, exclamación y cualquier carácter en blanco.

+0

También necesito considerar el español, que tendrá exclamaciones y preguntas al revés. – Dean

+0

Luego agrega esos caracteres a la lista de caracteres dentro del '[]' y después de '^'. Entonces, por ejemplo '" [^.?! ¿¡S] "'. Probablemente quiera agregar paréntesis, coma, punto y coma, y ​​muchos otros caracteres de puntuación. Esa lista son los caracteres que * no quieres * en tus palabras. El '^' al inicio significa "no estos personajes". Por lo tanto, también deberá agregar el carácter de intercalación (^) a la lista. –

+0

Ok, voy a ver qué puedo hacer para obtener una lista de puntuación. Me gusta este enfoque. – Dean

1

Puede intentarlo solo si intenta dividirlo en espacios.

var words = Regex.Split(phrase, @"[^ ]+").ToList(); 

El otro enfoque es agregar el apóstrofo al agregarlo a su clase de caracteres.

var words = Regex.Split(phrase, @"(\W|')+").ToList(); 

De lo contrario, ¿hay alguna razón específica por la que no puede usar string.Split()? Esto parecería mucho más directo. Además, también podría pasar otros caracteres de puntuación (es decir, dividir, así como los espacios).

var words = phrase.Split(' '); 
var words = phrase.Split(new char[] {' ', '.'}); 
0

No soy una persona de Java, pero se podía tratar de excluir puntuacion mientras que la división en
espacios al mismo tiempo. Algo como esto tal vez.

Estas son expresiones regulares crudas y expandidas, las palabras están en el grupo de captura 1.
Realice una búsqueda global.

Unicode (Cuenta doesen't de grafema de)

[\s\pP]* ([\pL\pN_-] (?: [\pL\pN_-] | \pP(?=[\pL\pN\pP_-]))*) 

ASCII

3

Debido a que varios idiomas usan reglas muy complejas para unir palabras en frases y oraciones, no puede confiar en una expresión regular simple para obtener todas las palabras de una parte del texto. Incluso para un lenguaje como 'simple' como Inglés que se encontrará en una serie de casos de esquina tales como:

  • Cómo manejar palabras como eres, no es donde hay dos palabras combinadas y una serie de los caracteres reemplazan con '.
  • Cómo manejar abreviaturas como Sr./Sra decir
  • palabras combinadas que utilizan '-'
  • palabras con guiones al final de una frase.

El chino y el japonés (entre otros) son notablemente difíciles de analizar de esta manera, ya que estos idiomas no usan espacios entre palabras, solo entre oraciones.

Le recomendamos leer en Text Segmentation y si la segmentación es importante para invertir en un corrector ortográfico que puede analizar un texto completo o un motor de segmentación de texto que puede dividir sus oraciones en palabras de acuerdo con las reglas del idioma.

Sin embargo, no pude encontrar un motor de segmentación multilingüe basado en .NET con una búsqueda rápida en Google. Lo siento.

0

Esto funcionó para mí: [^(\d|\s|\W)]*

Cuestiones relacionadas