Вероятностная генерация семантических сетей - PullRequest
9 голосов
/ 10 июля 2010

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

Например, рассмотрим диалоговое окно:

"the man has a hat"
"he has a coat"
"what does he have?" => "a hat and coat"

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

the_man = Entity('the man')
has = Entity('has')
a_hat = Entity('a hat')
a_coat = Entity('a coat')
Relation(the_man, has, a_hat)
Relation(the_man, has, a_coat)
print the_man.relations(has) => ['a hat', 'a coat']

Однако эта реализация предполагает предварительное знание того, что сегменты текста "человек" и "он" относятся к одной и той же сетевой сущности.

Как бы вы разработали систему, которая "изучает" эти отношения между сегментами семантической сети?Я привык думать о проблемах ML / NL, основанных на создании простого обучающего набора пар атрибут / значение и подаче его в алгоритм классификации или регрессии, но у меня возникают проблемы с постановкой этой проблемы таким образом.

В конечном счете, мне кажется, мне нужно будет наложить вероятности поверх семантической сети, но это существенно усложнит реализацию.Есть ли какой-либо уровень техники в этом направлении?Я посмотрел на несколько библиотек, таких как NLTK и OpenNLP, и, хотя у них есть достойные инструменты для обработки символической логики и синтаксического анализа естественного языка, ни одна из них, похоже, не имеет какой-либо proabablilstic структуры для преобразования одной в другую.

Ответы [ 3 ]

3 голосов
/ 10 июля 2010

За такой задачей стоит довольно большая история.Лучше всего начать с просмотра Вопросов .

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

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

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

Существует некоторое исследование вероятностных реляционныхмоделирование, в основном в Марковских логических сетях в Вашингтонском университете и вероятностных реляционных моделях в Стэнфорде и других местах.Я немного не в курсе этой области, но это сложная проблема, и, насколько я знаю, это все исследования на ранней стадии.Есть много проблем, в основном связанных с эффективным и масштабируемым выводом.

В общем, это хорошая идея и очень разумная вещь, которую нужно делать.Тем не менее, это также очень трудно достичь.Если вы хотите взглянуть на изящный пример современного уровня техники (то есть, что возможно с кучей людей и денег), можете проверить PowerSet .

2 голосов
/ 10 июля 2010

Интересный вопрос, я немного поработал над ядром NLP со строгой типизацией в C #: http://blog.abodit.com/2010/02/a-strongly-typed-natural-language-engine-c-nlp/ и недавно начал подключать его к онтологическому магазину.

Для меня этоПохоже, проблема здесь действительно: как вы анализируете ввод естественного языка, чтобы выяснить, что «Он» - это то же самое, что и «человек»?К тому времени, когда в Семантической сети уже слишком поздно: вы потеряли тот факт, что утверждение 2 следовало за утверждением 1, и неоднозначность в утверждении 2 можно устранить с помощью утверждения 1. Добавление третьего отношения после того, чтобы сказать, что «Он»и «мужчина» - это тоже вариант, но вам все равно нужно понимать последовательность этих утверждений.

Большинство синтаксических анализаторов НЛП, похоже, сосредоточены на разборе отдельных предложений или больших блоков текста, но реже на обработке разговоров.,В моем собственном NLP-движке есть история разговоров, которая позволяет понять одно предложение в контексте всех предложений, которые были до него (а также проанализированных строго типизированных объектов, на которые они ссылались).Таким образом, я бы справился с этим, чтобы понять, что «Он» неоднозначен в текущем предложении, а затем оглянуться назад, чтобы попытаться выяснить, кто был последним мужчиной, о котором упоминалось.

В случае моегоНапример, home может сказать, что вы пропустили звонок с номера, которого нет в его базе данных.Вы можете напечатать «Это был Джон Смит», и он может понять, что «Это» означает только что упомянутый вам звонок.Но если вы наберете «Пометьте как Party Music» сразу после звонка, он все равно разрешит песню, которая воспроизводится в данный момент, потому что дом ищет что-то, что можно назвать ITaggable.

0 голосов
/ 10 июля 2010

Я не совсем уверен, если это то, что вы хотите, но взгляните на генерацию естественного языка wikipedia , "обратный" синтаксический анализ, создание производных, которые соответствуют заданным семантическим ограничениям. 1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...