2010-04-13 20 views
17

Me preguntaba si alguien estaba familiarizado con algún intento de negación algorítmica de oraciones.Algoritmo para Omitir Oraciones

Por ejemplo, dada una oración como "Este libro es bueno" proporciona cualquier cantidad de oraciones alternativas que signifiquen lo contrario como "Este libro no es bueno" o incluso "Este libro es malo".

Obviamente, lograr esto con un alto grado de precisión probablemente estaría más allá del alcance de la actual PNL, pero estoy seguro de que ha habido algún trabajo sobre el tema. Si alguien sabe de algún trabajo, ¿quiere señalarme algunos documentos?

+12

solo agregue "... ¡NO!" al final de cualquier declaración para negarlo;) – AaronLS

+2

O en un sentido Orwelliano/1984, agregue el prefijo "un" a cualquier adjetivo ... "Este libro no es bueno" :-) –

+2

Puede proporcionar más información acerca de su objetivos de uso? –

Respuesta

2

La forma ingenua, por supuesto, es intentar agregar "no" justo después de {am, are, is}. Sin embargo, no tengo idea de cómo va a funcionar esto en su entorno, probablemente solo funcione con oraciones tipo predicado.

+4

La forma ingenua, por supuesto, es no intentar agregar "no" después de {am, are, is not} –

0

Para oraciones simples analizar buscando adverbios o adjetivos dadas las reglas de la gramática inglesa y sustituir un antónimo si solo existe un significado. De lo contrario, use la regla correcta de negación en inglés para negar el verbo (es decir: is -> is not).

alto nivel de algoritmo:

  1. Busque cada palabra por su tipo (sustantivo, verbo, adjetivo, adverbio, conjunción, etc ...)
  2. estructura de la oración inferir a partir de secuencias de tipo palabra (Su frase was: article, noun, verb, adjective/adverb; se sabe que es una oración simple.)
  3. Para oraciones simples, elija una palabra invertible e inviértala. Ya sea usando un antónimo o negando el verbo.

Para oraciones más complejas, como las que tienen cláusulas subordinadas, necesitará un análisis más complejo, pero para oraciones simples, esto no debería ser inviable.

1

Hay un proceso similar para la lógica de primer orden. El algoritmo habitual es mapear P a not P, y luego realizar traducciones válidas para mover el not algún lugar conveniente, por ejemplo:

Original: (not R(x) => exists(y) (O(y) and P(x, y))) 
Negate it: not (not R(x) => exists(y) (O(y) and P(x, y))) 
Rearrange: not (R(x) or exists(y) (O(y) and P(x, y))) 
      not R(x) and not exists(y) (O(y) and P(x, y)) 
      not R(x) and forall(y) not (O(y) and P(x, y)) 
      not R(x) and forall(y) (not O(y) or not P(x, y)) 

Realización de la misma en Inglés que estaría negando "Si no llueve aquí, entonces hay es alguna actividad que es una actividad al aire libre y se puede realizar aquí "a" NO es el caso que ... "y finalmente a" No llueve y todas las actividades posibles no son para actividades al aire libre o no se pueden realizar aquí ". "

El lenguaje natural es mucho más complicado que la lógica de primer orden, por supuesto ... pero si puede analizar la oración en algo donde las palabras "no", "y", "o", "existen", etc. .puede identificarse, entonces debería poder realizar traducciones similares.

8

Si bien no conozco ningún trabajo que específicamente busque la generación automática de oraciones negadas, me imagino que un buen lugar para comenzar sería leer sobre el trabajo de lingüística en formal semantics y pragmatics. Una buena introducción accesible sería Steven C. Levinson's Pragmatics book.

Un problema con el que creo que se encontrará es que puede ser muy difícil negar toda la información transmitida por una oración.Por ejemplo, tomemos:

John fixed the vase that he broke. 

Aunque cambie este a John no fijó el jarrón que rompió, hay una presupposition que hay un jarrón y que Juan lo rompió.

Del mismo modo, simplemente anulando la sentencia Juan no dejó de usar drogas como John dejó de usar drogas mantiene viva que Juan, en un momento dado, los medicamentos utilizados. Una negación más completa sería John nunca usó drogas.

Algunos trabajos existentes de procesamiento de lenguaje natural (NLP) que es posible que desee examinar son Natural Logic for Textual Inference de MacCartney y Manning 2007. En este trabajo utilizan la noción de lógica natural de George Lakoff y el cálculo de monotonicidad de Sánchez Valencia para crear un software que determina automáticamente si una oración implica a otra. Probablemente puedas usar algunas de sus técnicas para detectar la no implicación para construir artificialmente oraciones negadas y contradictorias.

+0

¿Quizás no arregló el jarrón que no existía y que no se rompió? Y ahora que lo pienso, ¿es él ella? O ... ¿Realmente rompió el jarrón en lugar de arreglarlo, después de que lo arregló? –

+3

Además, la frase "John nunca usó drogas", cuando se saca de contexto puede tener un significado de que alguien está tratando de ocultar algo. Por ejemplo, si un gran titular de la CNN de repente dijo "XYZ nunca tuvo relaciones con una cabra", de alguna manera implica que alguien lo ha alegado. Quizás la negación más completa sería reescribir la oración en algo completamente diferente, "John está feliz". –

2

Recomiendo retirar wordnet. Puede usarlo para buscar antónimos de una palabra, por lo que posiblemente podría reemplazar "malo" por "malo", ya que malo es un antónimo de bien. NLTK tiene una interfaz de python simple para wordnet.

-1

Niza demostraciones utilizando NTLK - http://text-processing.com/demo y un breve informe - http://text-processing.com/demo/sentiment/.

+1

Las oraciones negativas no son lo mismo que los sentimientos negativos. Aquí hay una frase positiva con un sentimiento negativo: 'La película fue horrible'. Aquí hay una oración negativa con un sentimiento positivo: 'La película no fue menos que la mejor que haya visto'. –

+0

@Tommy, no estoy de acuerdo con su generalización. "La película fue horrible" es una NOTA válida de "La película fue buena". es decir, horrible es un sinónimo válido de "no es bueno", al igual que "malo" en su publicación anterior. – Cerin