stanford spanishpcfg spanish software ser pos natural language edu corenlp java nlp stanford-nlp gate

spanishpcfg - Herramientas para simplificar texto(Java)



stanford corenlp (4)

Creo que AlchemyApi es tu mejor opción. Aún así requerirá mucho trabajo de su parte para hacer exactamente lo que necesita, y como la mayoría de los comentaristas ya le han dicho, lo más probable es que no obtenga resultados de calidad al 100%.

¿Cuál es la mejor herramienta que puede hacer la simplificación de texto usando Java?

Aquí hay un ejemplo de simplificación de texto:

John, who was the CEO of a company, played golf. ↓ John played golf. John was the CEO of a company.


Creo que uno puede diseñar un algoritmo muy simple para los casos básicos de esta situación, mientras que los casos del mundo real pueden ser demasiados, por lo que tal enfoque se volverá ingobernable :)

Aún así, pensé que debería pensar en voz alta y escribir mi enfoque y tal vez agregar algún código de Python. Mi idea básica es que derivan una solución de los primeros principios, principalmente exponiendo explícitamente nuestro modelo de lo que realmente está sucediendo. Y no confiar en otras teorías, modelos, bibliotecas ANTES de que hagamos una por HAND y desde SCRATCH.

Meta: dada una oración, extraer las subsentencias de ella.

Ejemplo: John, quien era el director general de la compañía, jugaba al golf.

Salida esperada: John fue el CEO de la compañía. John jugó al golf.

Aquí está mi modelo de lo que está sucediendo aquí, escrito en forma de supuestos modelo: (¿axiomas?)

MA1. Las oraciones simples se pueden expandir insertando subsentencias. MA2. Una subsistencia es una calificación / modificación (información adicional) en una o más de las entidades. MA3. Para insertar una subsentencia, ponemos una coma justo al lado de la entidad que deseamos expandir (proporcionar más información) y adjuntamos la subsentencia, la llamaré una extensión, y colocaré otra coma cuando la extensión termine.

Dado este modelo, el algoritmo puede ser sencillo al menos para abordar los casos simples primero.

  1. DETECTAR: Dada una oración, detecta si tiene una cláusula de extensión, buscando un par de comas en la oración.
  2. EXTRACTO: Si encuentra dos comas, genere dos oraciones: 2.1 EXTRACT-BASE: oración base: borre todo entre las dos comas, obtendrá la oración base. 2.2 EXTRACTO-EXTENSIÓN: oración de extensión: tome todo lo que está dentro de la oración de extensión, reemplace ''who'' con la palabra que está justo delante de ella. Esa es tu segunda oración.
  3. IMPRIMIR: De hecho, debe imprimir primero la oración de extensión, porque la oración base depende de ello.

Bueno, ese es nuestro algoritmo. Sí, suena como un hack. Es. Pero algo que estoy aprendiendo ahora es que, si usas un truco en un programa, es un hack, si puede manejar más cosas, es una técnica.

Así que vamos a ampliar y complicar un poco la situación.

Casos compuestos: Ejemplo 2. John, quien era el CEO de la compañía, jugó Golf con Ram, el CFO.

¡Mientras lo escribo, me di cuenta de que había omitido la frase "quién era" para el CFO! Eso nos lleva al caso complicado de que nuestro algoritmo fallará. Antes de ir allí, permítame crear una versión más simple de 2 que FUNCIONARÁ.

Ejemplo 3. John, quien era el CEO de la compañía, jugó a Golf con Ram, quien era el CFO.

Ejemplo 4. John, el CEO de la compañía, jugó a Golf con Ram, el CFO.

Espera que no hayamos terminado todavía!

Ejemplo 5. John, quien es el CEO y Ram, quien era el CFO en ese momento, jugó al golf, que es un juego atractivo.

Para permitir esto necesito ampliar mis suposiciones del modelo:

MA4. Más de una entidad puede expandirse de la misma manera, pero no debe causar confusión porque la cláusula de extensión se produce justo al lado de la entidad sobre la que se informa. (explica el ejemplo 3)

MA5. La frase "quién era" puede omitirse ya que puede ser inferida por el oyente. (explica el ejemplo 4)

MA6. Algunas entidades son personas, se extenderán usando un ''quién'' y algunas entidades son cosas, extendidas usando un ''cuál''. Cualquiera de estas extensiones puede ser omitida.

Ahora, ¿cómo manejamos estas complicaciones en nuestro algoritmo?

Prueba esto:

  1. SPLIT-SENTENCE-INTO-BASE-AND-EXTENSIONS: Si la oración contiene una coma, busque la siguiente coma y extraiga lo que haya entre la oración de extensión. Continúa hasta que no encuentres más comas de cierre o comas de apertura a la izquierda. En este punto, debe tener una lista con la oración base y una o más oraciones de extensión.

  2. PROCESS_EXTENSIONS: Para cada extensión, si tiene "quién es" o "que es", reemplácela por su nombre antes del encabezado de la extensión. Si la extensión no tiene un "quién es" o "que es", coloque la palabra principal y una "es".

  3. IMPRIMIR: todas las oraciones de extensión primero y luego las oraciones de base.

No da miedo.

Cuando tenga tiempo en los próximos días, agregaré una implementación de python.

Gracias

Ravi Annaswamy


Es poco probable que resuelva este problema utilizando algún algoritmo conocido en el caso general, ya que esto está llegando a un territorio fuerte de la IA. ¡Incluso los humanos no pueden analizar muy bien la gramática!

Tenga en cuenta que el problema es bastante ambiguo con respecto a cuánto simplifica y qué supuestos está dispuesto a hacer. Podrías llevar tu ejemplo más allá y decir:

Se asume que Juan es el nombre de un ser. La raza de Juan es desconocida. John jugó al golf en algún momento en el pasado. Se supone que el golf se refiere al juego de pelota llamado golf, pero se desconoce la variante del golf que jugó John. En algún momento en el pasado, John era el CEO de una empresa. Se supone que el CEO significa "Director Ejecutivo" en el contexto de una empresa, pero esto no está especificado. La empresa es desconocida.

En caso de que la lección no sea obvia: cuanto más trate de determinar el significado exacto de las palabras, más latas de gusanos comenzará a abrir ...... se necesitan niveles de juicio e interpretación similares a los humanos para saber cuándo hacerlo. detener.

Es posible que pueda resolver algunos casos más simples utilizando varias herramientas de PNL basadas en Java: vea ¿Existe una buena biblioteca de procesamiento de lenguaje natural?


Veo su problema como una tarea de convertir oraciones complejas o compuestas en oraciones simples. Según los tipos de oraciones de la literatura, una oración simple se construye a partir de una cláusula independiente. Una oración compuesta y compleja se construye a partir de al menos dos cláusulas. Además, la cláusula debe tener sujeto y verbo.
Entonces su tarea es dividir la oración en cláusulas que forman su oración.

El análisis de dependencia de Stanford CoreNLP es una herramienta perfecta para dividir oraciones compuestas y complejas en oraciones simples. Puedes probar la demo en línea .
A partir de su oración de ejemplo, obtendremos un resultado de análisis en la notación de dependencia (SD) tipificada de Stanford como se muestra a continuación:

nsubj(CEO-6, John-1)
nsubj(played-11, John-1)
cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
det(company-9, a-8)
prep_of(CEO-6, company-9)
root(ROOT-0, played-11)
dobj(played-11, golf-12)

Se puede identificar una cláusula a partir de la relación (en SD) a qué categoría está sujeta, por ejemplo, nsubj , nsubjpass . Ver el Manual de Dependencia de Stanford
La cláusula básica se puede extraer de la cabeza como parte del verbo y dependiente como parte del sujeto. Desde SD arriba, hay dos cláusulas básicas, es decir

  • John CEO
  • John jugó

Después de obtener una cláusula básica, puede agregar otra parte para hacer de su oración una oración completa y significativa. Para ello, consulte el Manual de dependencia de Stanford .

Por cierto, su pregunta podría estar relacionada con Encontrar oraciones significativas de una oración

Respuesta al 3er comentario:

Una vez que nsubj(CEO-6, John-1) el par de sujeto un verbo, es decir, nsubj(CEO-6, John-1) , obtenga todas las dependencias que tienen un enlace a esa dependencia, excepto cualquier dependencia de la categoría que sea el sujeto, luego extraiga una palabra única de estas dependencias.

Basado en el ejemplo, nsubj(CEO-6, John-1) , si comienzas a cruzar desde John-1 , obtendrás nsubj(played-11, John-1) pero deberías ignorarlo ya que su categoría es el tema.

El siguiente paso es atravesar desde la parte CEO-6 . Obtendrás

cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
prep_of(CEO-6, company-9)

Del resultado anterior, tiene nuevas dependencias para atravesar (es decir, encontrar otras dependencias que tengan was-4, the-5, company-9 ya sea en jefe o dependiente).
Ahora tus dependencias son

cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
prep_of(CEO-6, company-9)
det(company-9, a-8)

En este paso, ha terminado de recorrer todas las dependencias vinculadas a nsubj(CEO-6, John-1) . A continuación, extraiga las palabras de todos los encabezados y dependientes, luego ordene la palabra en orden ascendente en función del número agregado a estas palabras. Este número indica el orden de las palabras en la oración original.

John was the CEO a company

A nuestra nueva oración le falta una parte, es decir, of . Esta parte está oculta en prep_of(CEO-6, company-9) . Si lees el Manual de dependencia de Stanford , hay dos tipos de SD : colapsado y no colapsado. Léalos para comprender por qué se oculta esto y cómo obtener el orden de las palabras de esta parte oculta.

Con el mismo enfoque, obtendrás la segunda frase.

John played golf