как создавать восклицания для конкретного предложения - PullRequest
6 голосов
/ 23 июня 2010

Я хотел бы создать восклицания для конкретного предложения с использованием API Java?

например, это удивительно == Разве это не удивительно!
например, холодно == Не холодно ли!

Существуют ли какие-либо поставщики или инструменты, которые помогут вам генерировать восклицательные знаки, при условии, что вы даете предложение (то есть слева в приведенном выше примере).Примечание: предложения будут предоставлены пользователем, и мы сможем получить правильное предложение.

Я не уверен, если это нужно пометить в других категориях

РЕДАКТИРОВАТЬ1

Еще несколько примеров, я хотел бы, чтобы это было как можно более универсальным

например, они опоздали == Не опоздали!
например, он выглядит усталым== Разве он не выглядит усталым!
Например, этот ребенок грязный == Разве этот ребенок не грязный!
Например, он горячий == Разве это не жарко!

Ответы [ 6 ]

8 голосов
/ 23 июня 2010

В зависимости от того, насколько «умным» и «сложным» вы хотите, чтобы это было, это может быть либо очень трудной, либо очень простой задачей. Вот простое решение регулярных выражений, которое довольно глупо:

    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!")
        );
    }

Это печатает ( как видно на ideone.com ):

Isn't it surprising!
Isn't it cold!
Isn't it $*($&%!!
That is a hot coffee indeed...
3 голосов
/ 30 июля 2010

Я не думаю, что вы сильно продвинетесь с простыми конструкциями регулярных выражений. Проблема в том, что, поскольку вы, очевидно, работаете в области естественного языка, существует множество возможностей, которые вы должны принять во внимание. Насколько общим должно быть решение?

Я знаю, что вы сказали, что что-то подобное возможно с Java API, но будет ли использование Prolog вариантом? SWI-Prolog имеет интерфейс Java (JPL), и описываемая вами проблема будет гораздо лучше решена в Prolog. Фактически, это та проблема, с которой Пролог справляется лучше всего и используется в научных кругах. SWI-Prolog даже включает в себя пакет для обработки естественного языка (http://www.swi -prolog.org / pldoc / package / nlp.html ). Это лучший способ справиться с проблемой, как я знаю.

Конечно, я не знаю, насколько важна эта функция для вашего продукта / проекта, и использование Prolog, вероятно, не вариант, поэтому другой вариант - написать парсер, который извлекает глагол / существительное и т. Д. И создает соответствующее "предложение модель "(группа объектов). Затем вы можете преобразовать эту модель предложений в другую модель предложений, основанную на некоторых правилах, разработанных расширяемым образом, чтобы при появлении новых случаев (и с таким широким доменом) вы могли просто добавить новое «правило» в твоя трансформация.

Это действительно нетривиальное решение, но я не представляю, как может выглядеть тривиальное решение.

2 голосов
/ 04 августа 2010

Этот вопрос не о восклицаниях. Вы можете просто добавить «!» ко всем вашим входным примерам и получите действительные восклицательные предложения.

Вы после грамматических преобразований, как эти .

LingPipe похоже, что в нем есть интересные материалы, которые вы могли бы использовать (это Java), особенно если вы разрабатываете систему обучения и вам необходимо распознавать ' части речи ' (например, тема и глагольная фраза в соответствии с вашими примерами).

1 голос
/ 06 августа 2010

Вот мое взятие только с регулярными выражениями, без глубокого анализа языка. Его легко обмануть, но он подходит для большинства ваших примеров.

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"); 
1 голос
/ 31 июля 2010

Посмотрите на Natural Language ToolKit , затем уточните свой вопрос, с каким подмножеством английского языка вы хотите, чтобы ваш код работал, и более четкое определение типов восклицательного перевода, которые вы хотите.

0 голосов
/ 23 июня 2010

Я не знаю, насколько изощренным вы хотите, чтобы это было, но если вы просто хотите изменить выражения вроде «Это что угодно» на «Разве это не так!», То это очень просто:*

(даже проще, чем решение для полигенных смазок с регулярными выражениями).

...