Мы должны разделить алгоритмы и проблемы. Мы пишем алгоритмы для решения проблем, и они масштабируются определенным способом. Хотя это - упрощение, давайте маркируем алгоритм 'P', если масштабирование достаточно хорошо, и 'NP', если это не.
полезно знать вещи о проблемах, которые мы пытаемся решить, а не алгоритмы, которые мы используем для решения их. Таким образом, мы скажем, что все проблемы, которые имеют хорошо масштабирующийся алгоритм, "в P". И те, которые имеют плохо масштабирующийся алгоритм, "в NP".
, Который означает, что много простых проблем "в NP" также, потому что мы можем записать плохие алгоритмы для решения легких проблем. Было бы хорошо знать, какими проблемами в NP являются действительно хитрые, но мы только хотим сказать, что "это - те, мы не нашли хороший алгоритм для". В конце концов, я мог придумать проблему (назовите ее X), что я думаю, нуждается в суперудивительном алгоритме. Я говорю миру, что лучший алгоритм, который я мог придумать для решения X масштабов плохо, и таким образом, я думаю, что X действительно жесткая проблема. Но завтра, возможно, кто-то более умный, чем я изобретает алгоритм, который решает X и находится в P. Таким образом, это не очень хорошее определение тяжелых проблем.
Весь одинаковый, существует много проблем в NP, для которого никто не знает хороший алгоритм. Таким образом, если я мог доказывать , что X определенный вид проблемы: тот, где хороший алгоритм для решения X мог также использоваться, некоторым окольным способом, дать хороший алгоритм для каждый другая проблема в NP. Хорошо теперь люди могли бы быть немного более убеждены, что X по-настоящему хитрая проблема. И в этом случае мы звоним X Полный NP.
Чтобы грубо скопировать этот ответ , почему бы не попробовать Набор средств естественного языка ?
Стэнфордский синтаксический анализатор, предложенный ealdent, выполнит эту работу, я бы предпочел закодировать его как:
POS tagger тоже может работать, но ваше предложение сложное («кто в свою очередь»).
Я бы посоветовал вам использовать Stanford Parser ( http://nlp.stanford.edu/software/lex-parser.shtml ), который является открытым исходным кодом и относительно просто, как эти вещи. С его помощью вы можете извлечь типизированный синтаксический анализ зависимости. Анализ зависимости предложения в основном разбивает предложение на набор бинарных отношений r (B, A)
, где слово A грамматически зависит от слова B.
Возьмите ваше предложение
X bumped Y , который, в свою очередь, пнул Z.
В этом предложении и X, и Y зависят от bumped, чтобы получить их грамматические отношения в этом предложении. Стэнфордский синтаксический анализатор извлечет для них следующие отношения:
nsubj(bumped, X)
dobj(bumped, Y)
Это означает, что объект bumped - X, а прямой объект bumped - Y. Затем вы можете использовать эту информацию для построения грамматической связи: bumped (X, Y)
. Точно так же Стэнфордский синтаксический анализатор извлекает следующие соотношения для остальной части предложения:
nsubj(kicked, who)
rcmod(Y, kicked)
dobj(kicked, Z)
В этом случае у вас есть субъект, которого удаляют, это «кто», с Y в качестве rcmod
(модификатор относительного предложения). Я не уверен, какова цель вашей системы, но вы, вероятно, обнаружите, что вам нужно вручную создать кучу правил, чтобы охватить ситуации. В этом случае ваше правило может приравнять rcmod
к nsubj
, чтобы получить kicked (Y, Z)
.
Для получения дополнительной информации об использовании типизированные зависимости Stanford Parser, на сайте Stanford Parser есть отличный учебник ( http://nlp.stanford.edu/software/dependencies_manual.pdf ).
у вас есть субъект "кто", а Y в качестве rcmod
(модификатор относительного предложения). Я не уверен, какова цель вашей системы, но вы, вероятно, обнаружите, что вам нужно вручную создать кучу правил, чтобы охватить ситуации. В этом случае ваше правило могло бы приравнять rcmod
к nsubj
, чтобы получить kicked (Y, Z)
.
Подробнее об использовании типизированные зависимости Stanford Parser, на сайте Stanford Parser есть отличный учебник ( http://nlp.stanford.edu/software/dependencies_manual.pdf ).
у вас есть субъект "кто", а Y в качестве rcmod
(модификатор относительного предложения). Я не уверен, какова цель вашей системы, но вы, вероятно, обнаружите, что вам нужно вручную создать кучу правил, чтобы охватить ситуации. В этом случае ваше правило могло бы приравнять rcmod
к nsubj
, чтобы получить kicked (Y, Z)
.
Подробнее об использовании типизированные зависимости Stanford Parser, на сайте Stanford Parser есть отличный учебник ( http://nlp.stanford.edu/software/dependencies_manual.pdf ).
но вы, вероятно, обнаружите, что вам нужно вручную создать кучу правил, чтобы охватить ситуации. В этом случае ваше правило могло бы приравнять rcmod
к nsubj
, чтобы получить kicked (Y, Z)
.
Подробнее об использовании типизированные зависимости Stanford Parser, на сайте Stanford Parser есть отличный учебник ( http://nlp.stanford.edu/software/dependencies_manual.pdf ).
но вы, вероятно, обнаружите, что вам нужно вручную создать кучу правил, чтобы охватить ситуации. В этом случае ваше правило могло бы приравнять rcmod
к nsubj
, чтобы получить kicked (Y, Z)
.
Подробнее об использовании типизированные зависимости Stanford Parser, на веб-сайте Stanford Parser есть отличное руководство по этой теме ( http://nlp.stanford.edu/software/dependencies_manual.pdf ).
Помимо Стэнфордского синтаксического анализатора, возможен и RASP - он может создавать списки грамматических отношений как часть своего вывода. См. этот вопрос .