Каков наилучший инструмент, облегчающий упрощение текста с помощью Java?
Вот пример упрощения текста:
John, who was the CEO of a company, played golf.
↓
John played golf. John was the CEO of a company.
Каков наилучший инструмент, облегчающий упрощение текста с помощью Java?
Вот пример упрощения текста:
John, who was the CEO of a company, played golf.
↓
John played golf. John was the CEO of a company.
Я вижу вашу проблему как задачу преобразования сложного или сложного предложения в простые предложения.
Основываясь на литературе Типы предложений, простое предложение построено из одного независимого предложения. Составное и сложное предложение построено по крайней мере из двух статей. Кроме того, предложение должно иметь предмет и глагол.
Поэтому ваша задача - разделить предложение на предложения, которые формируют ваше предложение.
Анализ зависимостей от 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.
После того, как вы получите базовое предложение, вы можете добавить еще одну часть, чтобы сделать вашу статью полным и содержательным предложением. Для этого проконсультируйтесь с Руководство по работе в Стэнфорде.
Кстати, ваш вопрос может быть связан с Поиск значимых подпредложений из предложения
Как только вы получили пару объектов глагола, т.е. 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
Я думаю, что можно разработать очень простой алгоритм для основных случаев этой ситуации, в то время как случаев реального мира может быть слишком много, что такой подход станет неуправляемым:)
Тем не менее я думал, что должен подумайте вслух и напишите мой подход и, возможно, добавьте код python. Моя основная идея заключается в том, чтобы получить решение из первых принципов, главным образом путем явной демонстрации нашей модели того, что на самом деле происходит. И не полагаться на другие теории, модели, библиотеки, прежде чем мы делаем это с помощью HAND и SCRATCH.
Цель: дать предложение, извлечь из него субтитры.
Пример: Джон, который был генеральным директором компании, играл в гольф.
Ожидаемый результат: Джон был генеральным директором компании. Джон играл в гольф.
Вот моя модель того, что здесь происходит, выписанная в виде модельных предположений: (Аксиомы?)
MA1. Простые предложения могут быть расширены путем вставки подписок. MA2. Подсекция - это квалификация/модификация (дополнительная информация) для одного или нескольких объектов. MA3. Чтобы вставить подпункт, мы помещаем запятую рядом с объектом, который хотим расширить (предоставить дополнительную информацию), и прикрепите субтитент, я собираюсь назвать его расширением - и поместите другую запятую, когда заканчивается расширение.
Учитывая эту модель, алгоритм может быть простым, по крайней мере, для решения простых случаев.
Ну, это наш алгоритм. Да, это звучит как хак. Это. Но кое-что, чему я сейчас участвую, заключается в том, что если вы используете трюк в одной программе, это взломать, если он может обрабатывать больше вещей, это метод.
Итак, давайте немного расширим и усложним ситуацию.
Сложные случаи: Пример 2. Джон, который был генеральным директором компании, играл в гольф с Рамом, финансовым директором.
Как я пишу, я заметил, что я опустил фразу "кто был" для финансового директора! Это приводит нас к усложняющему случаю, когда наш алгоритм потерпит неудачу. Прежде чем отправиться туда, позвольте мне создать более простую версию 2, которая будет работать.
Пример 3. Джон, который был генеральным директором компании, играл в гольф с Рамом, который был финансовым директором.
Пример 4. Джон, генеральный директор компании, сыграл в гольф с Рамом, финансовым директором.
Подождите, мы еще не закончили!
Пример 5. Джон, который является генеральным директором и Рамом, который в то время был финансовым директором, играл в гольф, что является захватывающей игрой.
Чтобы это сделать, мне нужно расширить свои модельные допущения:
MA4. Более одного объекта могут быть расширены аналогично, но не должны вызывать путаницу, поскольку предложение расширения происходит непосредственно рядом с сообщением об объекте. (учетные записи, например, 3)
MA5. Фраза "кто была" может быть опущена, так как она может быть выведена слушателем. (учетные записи, например, 4)
MA6. Некоторые сущности - это люди, они будут расширены, используя "кто", а некоторые сущности - вещи, расширенные с помощью "того". Любая из этих расширительных головок может быть опущена.
Теперь, как мы справляемся с этими осложнениями в нашем алгоритме?
Попробуйте следующее:
РАЗДЕЛИТЬ-ПРИГОВОР-НА-BASE-И-продолжения: Если предложение содержит запятую, найдите следующую запятую и извлеките все, что находится между ними, в добавочное предложение. Продолжайте, пока вы не найдете больше закрывающей запятой или левой запятой. На этом этапе у вас должен быть список с базовым предложением и одним или несколькими предложениями расширения.
PROCESS_EXTENSIONS: Для каждого расширения, если у него есть "кто есть" или "что есть", замените его по имени перед заголовком расширения. Если расширение не имеет "кто есть" или "что есть", поместите ведущее слово и и есть.
ПЕЧАТЬ: все предложения расширения сначала, а затем базовые предложения.
Не страшно.
Когда я получу некоторое время в следующие несколько дней, я добавлю реализацию python.
Спасибо
Рави Аннасвами
В общем случае вы вряд ли решите эту проблему, используя любой известный алгоритм - это попадает на сильную территорию ИИ. Даже люди не могут очень хорошо разбирать грамматику!
Обратите внимание, что проблема довольно неоднозначна в отношении того, насколько вы упростите и какие предположения вы готовы сделать. Вы можете продолжить свой пример и сказать:
Предполагается, что Иоанн является именем существа. Гонка Иоанна неизвестна. Джон сыграл гольф в какой-то момент в прошлом. Предполагается, что гольф относится к мячу игра под названием гольф, но вариант гольфа, который играл Джон, неизвестен. В какой-то момент в прошлом Джон был генеральным директором компании. Предполагается, что генеральный директор означает "главный исполнительный директор" в контексте компании, но это не определен. Компания неизвестна.
В случае, если урок не очевиден: чем больше вы пытаетесь определить точный смысл слов, тем больше банок червей вы начинаете открывать... он принимает человеческие уровни суждения и интерпретации знать, когда остановиться.
Возможно, вы сможете решить несколько более простых случаев с использованием различных инструментов NLP на Java: см. Есть ли хорошая библиотека обработки естественного языка
Я считаю, AlchemyApi - ваш лучший вариант. Тем не менее вам потребуется много работы на вашей стороне, чтобы сделать именно то, что вам нужно, и как большинство комментаторов рассказывали вам об этом, скорее всего, вы не получите 100% качественных результатов.