Инструменты для упрощения текста (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% качественных результатов.