2010-04-21 13 views
21

He escrito este trozo de código que divide una cadena y lo almacena en una matriz de cadenas: -Separar una cadena en frases

String[] sSentence = sResult.split("[a-z]\\.\\s+"); 

Sin embargo, he añadido el [az] porque quería hacer frente a algunos de los problemas de abreviatura. Pero entonces mi resultado se muestra como lo que: -

Por otra parte, cuando Everett trató de instruirlos en las matemáticas básicas que resultó unresponsiv

veo que pierdo el patrón especificado en la función de división. Está bien que pierda el período, pero perder la última letra de la palabra perturba su significado.

¿Alguien podría ayudarme con esto y, además, podría alguien ayudarme con las abreviaturas? Por ejemplo, debido a que dividí la cadena en función de los períodos, no quiero perder las abreviaturas.

Respuesta

45

Oraciones de análisis está lejos de ser una tarea trivial, incluso para los idiomas latinos como el inglés. Un enfoque ingenuo como el que describes en tu pregunta fallará con la suficiente frecuencia como para que resulte inútil en la práctica.

Un mejor enfoque es utilizar un BreakIterator configurado con la configuración regional de la derecha.

BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US); 
String source = "This is a test. This is a T.L.A. test. Now with a Dr. in it."; 
iterator.setText(source); 
int start = iterator.first(); 
for (int end = iterator.next(); 
    end != BreakIterator.DONE; 
    start = end, end = iterator.next()) { 
    System.out.println(source.substring(start,end)); 
} 

produce el siguiente resultado:

  1. Esto es una prueba.
  2. Esta es una T.L.A. prueba.
  3. Ahora con un Dr. en él.
+6

Cuando uso esta frase: "Mi amigo, el Sr. Jones, tiene un perro nuevo". Se rompe después de que el Sr. Está sucediendo debido a la capitalización de Jones. ¿Conoces una forma de evitarlo? ¡De lo contrario, BreakIterator es genial! – nbz

11

Será difícil conseguir una expresión regular para trabajar en todos los casos, pero para arreglar su problema inmediato se puede utilizar una búsqueda hacia atrás:

String sResult = "This is a test. This is a T.L.A. test."; 
String[] sSentence = sResult.split("(?<=[a-z])\\.\\s+"); 

Resultado:

This is a test 
This is a T.L.A. test. 

Nota que hay son abreviaturas que no terminan con letras mayúsculas, como abreviatura, Sr., etc. ¡Y también hay oraciones que no terminan en puntos!

+0

Gracias por su respuesta. –

+1

Esto fallará en el 9.3% de las oraciones. Y oraciones que ... usan puntos suspensivos. Y oraciones con errores tipográficos en ellos. Y así. Hagas lo que hagas, tu código cometerá errores, visto desde la perspectiva humana. –

4

Si puede, use una herramienta de procesamiento de lenguaje natural, como LingPipe. Hay muchas sutilezas que serán muy difíciles de atrapar el uso de expresiones regulares, por ejemplo, (por ejemplo, :-)), el Sr. , abreviaturas, suspensivos (...), etcétera .

Hay un tutorial muy fácil de seguir en Sentence Detection en el sitio web de LingPipe.

+0

Hola, revisé el tutorial. Parecía perfecto, sin embargo, no puedo entender cómo usarlo con eclipse.¿Podrías ayudarme por favor? –

Cuestiones relacionadas