2011-04-20 7 views
7

Parece difícil detectar un límite de frase en un texto. Comillas como.!? se puede usar para delimitar oraciones, pero no tan precisas como puede haber palabras ambiguas y citas como USA o Prof. o Dr. Estoy estudiando la biblioteca Tperlregex y el libro de recetas Regular Expression por Jan Goyvaerts pero no sé cómo escribir la expresión que detecta ¿frase?¿Cómo obtener el número de oraciones de entrada?

¿Cuál puede ser la expresión comparativamente más precisa usando Tperlregex en delphi?

Gracias

+0

¿Cuántas frases es mi comentario, me gusta saber con sinceridad? Dr. J. I. Wilbers, PhD. Esq. –

Respuesta

6

En primer lugar, es probable que necesitan para llegar a su propia definición de lo que es una "sentencia", a continuación, aplicar esa definición. Por ejemplo, ¿qué tal:

He said: "It's OK!" 

¿Es una oración o dos? Una respuesta general es irrelevante. Decida si usted quiere que lo interprete como una o dos oraciones, y proceda en consecuencia.

En segundo lugar, no creo que use expresiones regulares para esto. En cambio, escanearía cada personaje e intentaría detectar secuencias. Un período en sí mismo puede no ser suficiente para delimitar una oración, pero un período seguido de espacios en blanco o retorno de carro (o final de cadena) probablemente sí lo sea. Esto inmediatamente te permite eliminar U.S.A (períodos no seguidos de espacios en blanco).

Para las abreviaturas comunes como el Prof. Dr. una puede ser una buena idea para crear un diccionario - quizá editable por los usuarios, ya que cada idioma tendrá su propio conjunto de abreviaturas comunes.

Cada idioma tendrá su propio conjunto de reglas de puntuación, lo que puede afectar la forma en que interpreta los caracteres de puntuación. Por ejemplo, el inglés tiende a poner un punto dentro del paréntesis (como este), mientras que el polaco hace lo contrario (como este). La misma diferencia se aplicará a las comillas dobles, comillas simples (algunos idiomas no las usan en absoluto, a veces son indistinguibles de los apóstrofos, etc.). Sus reglas bien pueden tener que ser específicas del idioma, al menos en parte.

Al final, puede aproximarse a la forma humana de delimitar oraciones, pero siempre habrá casos que pueden arrojar el análisis. Por ejemplo, suponiendo que tiene un diccionario que reconoce "Prof." como una abreviatura, ¿qué vas a hacer al respecto

Most people called him Professor Jones, but to me he was simply The Prof. 

Incluso si usted tiene otra frase que sigue y empieza con una letra mayúscula, que aún no le ayudará a saber dónde termina la frase, ya que como lo haría bien sea

Most people called him Professor Jones, but to me he was simply Prof. Bill. 
+0

+1 Tengo que agregar: sea cual sea su elección de implementación (regex o explícitamente codificada), querrá crear un conjunto de párrafos de prueba. Para cada párrafo, usted sabe cuántas oraciones se deben reportar. A menudo encontrará que tratar de implementar una nueva regla conducirá a una ruptura en las reglas existentes. –

0

Será sabio usar un procesador NLP con un modelo pre-entrenado. EnglishSD.nbin es uno de esos modelos que está disponible para OpenNLP y se puede usar en Visual Studio con SharpNLP.

La ventaja de usar este método es numerosa. Por ejemplo, considere la entrada

La profesora Jessica es una mujer maravillosa. Ella es originaria de EE. UU. Está casada con el Sr. Jacob Jr.

Si está utilizando una fracción de expresiones regulares, por ejemplo

string[] sentences = Regex.Split(text, @"(?<=['""A-Za-z0-9][\.\!\?])\s+(?=[A-Z])"); 

entonces la entrada anterior se separarán lo

Prof.

Jessica es una mujer maravillosa.

Ella es oriunda de U.

S.

A.

Ella está casada con el Sr.

Jacob Jr.

Sin embargo la salida deseada es

La Prof. Jessica es una mujer maravillosa.

Ella es oriunda de U.S.A. Ella está casada con el Sr. Jacob Jr.

Este tipo de fractura frase lógica sólo puede lograrse usando los modelos de formación del proyecto OpenNLP. El método es tan simple como esto.

private string mModelPath = @"C:\Users\ATS\Documents\Visual Studio 2012\Projects\Google_page_speed_json\Google_page_speed_json\bin\Release\"; 
private OpenNLP.Tools.SentenceDetect.MaximumEntropySentenceDetector mSentenceDetector; 
private string[] SplitSentences(string paragraph) 
    { 
     if (mSentenceDetector == null) 
     { 
      mSentenceDetector = new OpenNLP.Tools.SentenceDetect.EnglishMaximumEntropySentenceDetector(mModelPath + "EnglishSD.nbin"); 
     } 

     return mSentenceDetector.SentenceDetect(paragraph); 
    } 

donde mModelPath es la ruta del directorio que contiene el archivo NBIN.

El mSentenceDetector se deriva de la dll de OpenNLP.

, usted puede obtener la salida deseada por

string[] sentences = SplitSentences(text); 

Kindly read through this article I have written for integrating SharpNLP with your Application in Visual Studio to make use of the NLP tools

Cuestiones relacionadas