Инструменты для упрощения текста (Java)

Каков наилучший инструмент, облегчающий упрощение текста с помощью Java?

Вот пример упрощения текста:

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

Ответы

Ответ 1

Я вижу вашу проблему как задачу преобразования сложного или сложного предложения в простые предложения. Основываясь на литературе Типы предложений, простое предложение построено из одного независимого предложения. Составное и сложное предложение построено по крайней мере из двух статей. Кроме того, предложение должно иметь предмет и глагол.
Поэтому ваша задача - разделить предложение на предложения, которые формируют ваше предложение.

Анализ зависимостей от Stanford CoreNLP - идеальный инструмент для разделения сложного и сложного предложения на простое предложение. Вы можете попробовать демонстрацию онлайн.
Из вашего примерного предложения мы получим результат синтаксического анализа в виде записи в стиле Stanford typed dependency (SD), как показано ниже:

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)

Предложение A может быть определено из отношения (в SD), к которому относится категория, например. nsubj, nsubjpass. См. Руководство по работе в Стэнфорде
Основное предложение может быть извлечено из head как часть глагола и зависимая как предметная часть. Из SD выше, есть два основных предложения: i.e.

  • Генеральный директор John
  • Джон сыграл

После того, как вы получите базовое предложение, вы можете добавить еще одну часть, чтобы сделать вашу статью полным и содержательным предложением. Для этого проконсультируйтесь с Руководство по работе в Стэнфорде.

Кстати, ваш вопрос может быть связан с Поиск значимых подпредложений из предложения


Ответ на 3-й комментарий:

Как только вы получили пару объектов глагола, т.е. nsubj(CEO-6, John-1), получите все зависимости, которые имеют ссылку на эту зависимость, за исключением любой зависимости, к которой относится данная категория, а затем извлекают уникальное слово из этих зависимостей,

На основе примера nsubj(CEO-6, John-1), если вы начнете перемещаться с John-1, вы получите nsubj(played-11, John-1), но вы должен игнорировать его, поскольку его категория подвержена.

Следующий шаг проходит от части CEO-6. Вы получите

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

Из приведенного выше результата вы получили новые зависимости для перемещения (например, найти другие зависимости, которые имеют was-4, the-5, company-9 в голове или в зависимости).
Теперь ваши зависимости

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)

На этом этапе вы завершили перемещение всех зависимостей, связанных с nsubj(CEO-6, John-1). Затем извлеките слова из всех заголовков и зависимых, а затем упорядочьте слово в порядке возрастания в зависимости от числа, добавленного к этим словам. Это число указывает порядок слов в исходном предложении.

John was the CEO a company

В нашем новом предложении отсутствует одна часть, т.е. of. Эта часть скрыта в prep_of(CEO-6, company-9). Если вы читаете Руководство по работе в Stanford Dependency Manual, существует два типа SD, рухнувший и не скомпенсированный. Пожалуйста, прочитайте их, чтобы понять, почему этот of скрыт и как получить порядок слов этой скрытой части.

С таким же подходом вы получите второе предложение

John played golf

Ответ 2

Я думаю, что можно разработать очень простой алгоритм для основных случаев этой ситуации, в то время как случаев реального мира может быть слишком много, что такой подход станет неуправляемым:)

Тем не менее я думал, что должен подумайте вслух и напишите мой подход и, возможно, добавьте код python. Моя основная идея заключается в том, чтобы получить решение из первых принципов, главным образом путем явной демонстрации нашей модели того, что на самом деле происходит. И не полагаться на другие теории, модели, библиотеки, прежде чем мы делаем это с помощью HAND и SCRATCH.


Цель: дать предложение, извлечь из него субтитры.

Пример: Джон, который был генеральным директором компании, играл в гольф.

Ожидаемый результат: Джон был генеральным директором компании. Джон играл в гольф.


Вот моя модель того, что здесь происходит, выписанная в виде модельных предположений: (Аксиомы?)

MA1. Простые предложения могут быть расширены путем вставки подписок. MA2. Подсекция - это квалификация/модификация (дополнительная информация) для одного или нескольких объектов. MA3. Чтобы вставить подпункт, мы помещаем запятую рядом с объектом, который хотим расширить (предоставить дополнительную информацию), и прикрепите субтитент, я собираюсь назвать его расширением - и поместите другую запятую, когда заканчивается расширение.

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

  • DETECT: если задано предложение, определите, имеет ли он предложение расширения, путем поиска пары запятых в предложении.
  • ЭКСТРАКТ: Если вы найдете две запятые, сгенерируйте два предложения: 2.1 EXTRACT-BASE: базовое предложение:  удалите все между двумя запятыми, вы получите базовое предложение. 2.2 EXTRACT-EXTENSION: расширение:  возьмите все в добавочном предложении, замените "кто" словом прямо перед ним.  Это ваше второе предложение.
  • ПЕЧАТЬ: на самом деле вы должны сначала напечатать предложение расширения, потому что базовое предложение зависит от него.

Ну, это наш алгоритм. Да, это звучит как хак. Это. Но кое-что, чему я сейчас участвую, заключается в том, что если вы используете трюк в одной программе, это взломать, если он может обрабатывать больше вещей, это метод.

Итак, давайте немного расширим и усложним ситуацию.

Сложные случаи: Пример 2. Джон, который был генеральным директором компании, играл в гольф с Рамом, финансовым директором.

Как я пишу, я заметил, что я опустил фразу "кто был" для финансового директора! Это приводит нас к усложняющему случаю, когда наш алгоритм потерпит неудачу. Прежде чем отправиться туда, позвольте мне создать более простую версию 2, которая будет работать.

Пример 3. Джон, который был генеральным директором компании, играл в гольф с Рамом, который был финансовым директором.

Пример 4. Джон, генеральный директор компании, сыграл в гольф с Рамом, финансовым директором.

Подождите, мы еще не закончили!

Пример 5. Джон, который является генеральным директором и Рамом, который в то время был финансовым директором, играл в гольф, что является захватывающей игрой.

Чтобы это сделать, мне нужно расширить свои модельные допущения:

MA4. Более одного объекта могут быть расширены аналогично, но не должны вызывать путаницу, поскольку    предложение расширения происходит непосредственно рядом с сообщением об объекте. (учетные записи, например, 3)

MA5. Фраза "кто была" может быть опущена, так как она может быть выведена слушателем. (учетные записи, например, 4)

MA6. Некоторые сущности - это люди, они будут расширены, используя "кто", а некоторые сущности - вещи, расширенные с помощью "того". Любая из этих расширительных головок может быть опущена.

Теперь, как мы справляемся с этими осложнениями в нашем алгоритме?

Попробуйте следующее:

  • РАЗДЕЛИТЬ-ПРИГОВОР-НА-BASE-И-продолжения: Если предложение содержит запятую, найдите следующую запятую и извлеките все, что находится между ними, в добавочное предложение. Продолжайте, пока вы не найдете больше закрывающей запятой или левой запятой. На этом этапе у вас должен быть список с базовым предложением и одним или несколькими предложениями расширения.

  • PROCESS_EXTENSIONS:  Для каждого расширения, если у него есть "кто есть" или "что есть", замените его по имени перед заголовком расширения.  Если расширение не имеет "кто есть" или "что есть", поместите ведущее слово и и есть.

  • ПЕЧАТЬ: все предложения расширения сначала, а затем базовые предложения.

Не страшно.

Когда я получу некоторое время в следующие несколько дней, я добавлю реализацию python.

Спасибо

Рави Аннасвами

Ответ 3

В общем случае вы вряд ли решите эту проблему, используя любой известный алгоритм - это попадает на сильную территорию ИИ. Даже люди не могут очень хорошо разбирать грамматику!

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

Предполагается, что Иоанн является именем существа. Гонка Иоанна неизвестна. Джон сыграл гольф в какой-то момент в прошлом. Предполагается, что гольф относится к мячу игра под названием гольф, но вариант гольфа, который играл Джон, неизвестен. В какой-то момент в прошлом Джон был генеральным директором компании. Предполагается, что генеральный директор означает "главный исполнительный директор" в контексте компании, но это не определен. Компания неизвестна.

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

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

Ответ 4

Я считаю, AlchemyApi - ваш лучший вариант. Тем не менее вам потребуется много работы на вашей стороне, чтобы сделать именно то, что вам нужно, и как большинство комментаторов рассказывали вам об этом, скорее всего, вы не получите 100% качественных результатов.