2010-06-23 19 views
6

Chciałbym utworzyć wykrzykniki dla konkretnego zdania za pomocą interfejsu API java?jak tworzyć wykrzykniki dla określonego zdania

np. To zaskakujące == Czy to nie zaskakujące!
np. Jest zimno == Czy to nie jest zimne!

Czy są sprzedawcy lub narzędzia, które pomagają generować wykrzykniki pod warunkiem, że wydasz wyrok (np. Po lewej stronie w powyższym przykładzie). Uwaga: zdania będą dostarczane przez użytkownika i powinniśmy być w stanie uzyskać prawidłowe zdanie.

Nie jestem pewien, czy to musi być oznaczone w innych kategoriach

Edit1

Więcej przykładów, chciałbym to być możliwie najbardziej ogólny charakter

przykład Spóźniają się == Nie spóźniają się!
np. Wygląda na zmęczonego == Nie wygląda na zmęczonego!
np. To dziecko jest brudne == Czy to dziecko nie jest brudne!
np. Jest gorąco == Czy to nie jest gorące!

+6

Chcesz, aby było to gramatycznie świadome, czy akceptacja głupiego regex jest niemożliwa? – polygenelubricants

+1

Czy naprawdę istnieje coś takiego jak "poprawne zdanie" dla tych danych wejściowych? "Jest zimno!" jest również poprawny gramatycznie. –

+0

Chciałbym mieć poprawne gramatycznie zdanie, jeśli jest ich wiele, to jest w porządku ze mną. Uwaga: Dodałem więcej przykładów. – user339108

Odpowiedz

2

To pytanie nie dotyczy wykrzykników. Możesz po prostu dodać "!" do wszystkich przykładów wejściowych i uzyskaj prawidłowe wyłudzające zdania.

Po przeprowadzeniu zmian gramatycznych, takich jak these.

LingPipe wygląda to ma jakiś intersting rzeczy, które można użyć (nie Java), zwłaszcza jeśli rozwijają system uczenia się i potrzeba uznania „parts of speach” (jak np podmiotu i czasownika frazę, jak na swoje przykłady) .

8

W zależności od tego, jak "inteligentny" i "wyrafinowany" ma to być, może to być bardzo trudny lub bardzo łatwy problem. Oto proste rozwiązanie regex, że jest całkiem głupi:

String[] sentences = { 
     "It's surprising", 
     "It's cold", 
     "It's $*($&%!", 
     "That is a hot coffee indeed..." 
    }; 
    for (String sentence : sentences) { 
     System.out.println(
      sentence.replaceAll("It's (.+)", "Isn't it $1!") 
     ); 
    } 

Drukuje (as seen on ideone.com):

 
Isn't it surprising! 
Isn't it cold! 
Isn't it $*($&%!! 
That is a hot coffee indeed... 
+1

Występuje błąd kompilacji w kodzie na ideone.com ... – Jesper

+0

Zobacz także odmianę taką jak ta: http://ideone.com/Xl20I - To nadal kwalifikuje się jako głupie wyrażenie regularne. – polygenelubricants

-2

Nie wiem, w jaki sposób wyrafinowany chcesz to być, ale jeśli chcesz tylko zmienić wyrażenia takie jak „to, co” do „Czy to nie jest cokolwiek!”, to jest bardzo proste:

String text = "It's cold"; 
String result = "Isn't it " + text.substring(5) + "!"; 

(nawet prostsze niż rozwiązanie polygenelubricant jest z wyrażeń regularnych).

+0

Ale z regex możesz robić głupie rzeczy w ten sposób: http://ideone.com/Xl20I – polygenelubricants

+0

Wyrażenia regularne są dużo bardziej elastyczne i zdolne niż moje proste rozwiązanie, ale nie wiemy, jak daleko wymagania dotyczące plakatu , więc pomyślałem, że przedstawię najprostsze możliwe rozwiązanie w oparciu o to, o co poprosił. – Jesper

+0

Chcę, aby to było bardziej ogólne na podstawie danych wejściowych, czy byłoby to możliwe? Czy są jakieś inne zestawy narzędzi, które wspierają generowanie takich wykrzykników? – user339108

3

Nie sądzę, że daleko posuną się proste konstrukcje regex. Problem polega na tym, że ponieważ w oczywisty sposób działasz w dziedzinie języka naturalnego, musisz wziąć pod uwagę wiele, wiele możliwości. Jak ogólne musi być rozwiązanie?

Wiem, że powiedziałeś, że coś takiego jest możliwe dzięki Java API, ale czy używanie Prolog byłoby opcją? SWI-Prolog ma interfejs Java (JPL), a problem, który opisujesz, byłby znacznie lepiej rozwiązany w Prologu. W rzeczywistości jest to problem, który Prolog robi najlepiej i jest używany w środowisku akademickim. SWI-Prolog zawiera nawet pakiet do przetwarzania języka naturalnego (http://www.swi-prolog.org/pldoc/package/nlp.html). Jest to najlepszy sposób, w jaki zdaję sobie sprawę z tego, jak poradzić sobie z problemem takim jak twój.

Oczywiście nie wiem, jak ważna jest ta funkcja jest do produktu/projektu i stosując Prolog prawdopodobnie nie jest opcją, więc inna opcja jest napisanie parsera które wyodrębnić czasownik/rzeczownik etc i utworzyć odpowiedni " model zdania "(inaczej grupa obiektów). Następnie możesz przekształcić ten model zdania na inny model zdania oparty na pewnych regułach, zaprojektowany w sposób rozszerzalny, tak, że gdy pojawią się nowe wyskakujące okienka (iz tak szeroką domeną będą), możesz po prostu dodać nową "regułę" do twoja transformacja.

To naprawdę nie jest banalne rozwiązanie, ale nie mogę sobie wyobrazić, jak może wyglądać trywialne rozwiązanie.

+0

nie znamy prologów, sprawdzimy, czy ktoś może zbadać tę opcję. – user339108

1

Spójrz na numer Natural Language ToolKit, a następnie sprecyzuj swoje pytanie, do jakiego podzestawu języka angielskiego chcesz pracować, a także wyraźniej zdefiniuj rodzaje żądanych wykrzykników.

+1

Czy to nie jest dostępne tylko w pythonie? – dierre

+0

Tak, NLTK to czysty język Python. –

+0

Z drugiej strony, Python działa ładnie w Javie przez Jython ... – tucuxi

1

Oto moje podejście z tylko wyrażeń regularnych, bez analizy głębokiego języka. Można go łatwo oszukać, ale obsługuje większość przykładów.

s.replace("(.+?)('re| are) (.+)", "Aren't $1 $3!") 
.replace("(.+?)('s| is) (.+)", "Isn't $1 $3!") 
.replace("(I|You|We|They) (.+)", "Don't $1 $2!") 
.replace("(He|She|It) (\\w+)s (.*)", "Doesn't $1 $2 $3!") 
// correct case 
.replace(" You", " you") 
.replace(" He", " he") 
.replace(" She", " she") 
.replace(" It", " it") 
.replace(" We", " we") 
.replace(" They", " they");