2010-04-13 18 views
17

Zastanawiam się, czy ktoś znał wszelkie próby algorytmicznej negacji zdania.Algorytm negatywnych zdań

Na przykład podając zdanie takie jak "Ta książka jest dobra" podaj dowolną liczbę alternatywnych zdań, co oznacza coś przeciwnego, jak "Ta książka nie jest dobra" lub nawet "Ta książka jest zła".

Oczywiście, osiągnięcie tego z dużą dokładnością prawdopodobnie wykracza poza zakres obecnego NLP, ale jestem pewien, że było trochę pracy na ten temat. Jeśli ktokolwiek wie o jakiejkolwiek pracy, proszę wskazać mi jakieś papiery?

+12

po prostu dodaj "... NIE!" na końcu każdego oświadczenia, aby je zanegować;) – AaronLS

+2

Albo w sensie orwellowskim/1984, dodaj prefiks "un" do dowolnego przymiotnika ... "Ta książka jest ungood" :-) –

+2

Czy możesz podać więcej informacji o swoim cele użycia? –

Odpowiedz

2

Oczywiście naiwnością jest próba dodania "nie" zaraz po {jestem, jest, jest}. Nie mam pojęcia, jak to będzie działać w twoim otoczeniu, prawdopodobnie będzie działać tylko z orzeczeniami podobnymi do predykatów.

+4

Naiwny sposób, oczywiście, nie jest próbą dodania "nie" zaraz po {jestem, jest, nie jest} –

0

Dla prostych zdań parsuj poszukiwanie przysłówków lub przymiotników, biorąc pod uwagę zasady gramatyki angielskiej i zamień antonim, jeśli istnieje tylko jedno znaczenie. W przeciwnym razie użyj poprawnej angielskiej zasady negacji, aby zanegować czasownik (np .: is -> is not).

algorytm Wysoki poziom:

  1. Spójrz na każde słowo to typ (rzeczownik, czasownik, przymiotnik, przysłówek, połączeniu, etc ...)
  2. wywnioskować struktury zdania z sekwencji typu słowo (Twoje zdanie był: artykuł, rzeczownik, czasownik, przymiotnik/przysłówek; jest to znane zdanie.)
  3. Dla prostych zdań wybierz jedno odwracalne słowo i odwróć je. Albo za pomocą antonimu, albo negując czasownik.

Dla bardziej złożonych zdań, takich jak te z podrzędnymi klauzulami, będziesz potrzebował bardziej złożonej analizy, ale dla prostych zdań nie powinno to być niemożliwe.

1

Istnieje podobny proces dla logiki pierwszego rzędu. Zazwyczaj algorytm mapowania P do not P, a następnie wykonać poprawne tłumaczenia, aby przesunąć not gdzieś wygodne, np:

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)) 

Performing samo na angielski chcesz być negując „Jeśli to nie pada tutaj, to nie jest jakąś czynnością, która jest aktywnością na zewnątrz i można ją wykonać tutaj "na" NIE jest tak, że ... "i ostatecznie na" Nie pada deszcz i każda możliwa aktywność nie jest na zewnątrz lub nie może być wykonana tutaj. "

Język naturalny jest o wiele bardziej skomplikowany niż logika pierwszego rzędu, oczywiście ... ale jeśli możesz sparsować zdanie w coś, w którym występują słowa "nie", "i", "lub", "itd. można go zidentyfikować, wtedy powinieneś być w stanie wykonać podobne tłumaczenia.

8

Chociaż nie jestem świadomy żadnej pracy, która konkretnie analizuje automatyczne generowanie zanegowanych zdań, wyobrażam sobie, że dobrym miejscem na rozpoczęcie byłoby przeczytanie na temat prac lingwistycznych w formal semantics i pragmatics. Dobrym przystępnym wprowadzeniem byłaby książka Steven C. Levinson's Pragmatics.

Jedną z kwestii, o których myślę, że napotkasz, jest to, że bardzo trudno jest negować wszystkie informacje przekazywane przez zdanie.Weźmy na przykład:

John fixed the vase that he broke. 

Nawet jeśli zmienisz to Jana nie naprawić wazon że złamał, istnieje presupposition że istnieje wazon i że Jan złamał go.

Podobnie, po prostu niweczy zdanie John nie przestał brać narkotyki jak John zaprzestało stosowania leków nadal przekazuje, że John, w pewnym momencie, stosowane leki. Bardziej dokładna negacja brzmi: John nigdy nie używał leków.

Niektóre istniejące procesy przetwarzania języka naturalnego (NLP), na które warto zwrócić uwagę, to: MacCartney i Manning 2007's Natural Logic for Textual Inference. W tym artykule wykorzystują koncepcję naturalnej logiki George'a Lakoffa i rachunku monotoniczności Sancheza Walencji do tworzenia oprogramowania, które automatycznie określa, czy jedno zdanie pociąga za sobą drugie. Prawdopodobnie moglibyście wykorzystać niektóre z ich technik do wykrycia niezwiązanych z nimi sztuczek w celu sztucznego konstruowania zanegowanych i sprzecznych zdań.

+0

Być może on nie naprawił wazonu, który nie istniał i że się nie złamał? I pomyśleć o tym, czy on jest? Czy ... Czy naprawdę naprawił wazon, zamiast go naprawić, po tym, jak to naprawił? –

+3

Również zdanie "John nigdy nie używał narkotyków", gdy wyjęte z kontekstu może mieć znaczenie, że ktoś próbuje coś ukryć. Na przykład, jeśli duży nagłówek CNN nagle powiedział "XYZ nigdy nie miał stosunków z kozłem", to oznacza, że ​​ktoś tak twierdził. Być może najgłębszą negacją byłoby przepisanie zdania na coś zupełnie innego, "John jest szczęśliwy". –

2

Polecam sprawdzenie pod numerem wordnet. Możesz go użyć do wyszukiwania antonimów na słowo, więc możesz zastąpić słowo "zły" słowem "nie jest dobre", ponieważ zły jest antonimem dobra. NLTK ma prosty interfejs python do wordnet.

-1

Ładne wersje demonstracyjne za pomocą NTLK - http://text-processing.com/demo i krótki zapis - http://text-processing.com/demo/sentiment/.

+1

Negatywne zdania to nie to samo, co negatywne sentymenty. Oto pozytywne zdanie z negatywnym sentymentem: "Film był okropny". Oto negatywne zdanie z pozytywnym sentymentem: "Film był nie mniejszy niż największy, jaki kiedykolwiek widziałem". –

+0

@Tommy, nie zgadzam się z twoim uogólnionym. "Film był okropny" to poprawne stwierdzenie "Film był dobry". tj. okropny jest prawidłowym synonimem słowa "niedobry", tak jak "zły" jest w twoim wpisie powyżej. – Cerin