Я пытаюсь найти способ отрицать предложения на основе POS-тегов. Пожалуйста, обратите внимание:Отрицание предложений с использованием POS-тегов
include_once 'class.postagger.php';
function negate($sentence) {
$tagger = new PosTagger('includes/lexicon.txt');
$tags = $tagger->tag($sentence);
foreach ($tags as $t) {
$input[] = trim($t['token']) . "/" . trim($t['tag']) . " ";
}
$sentence = implode(" ", $input);
$postagged = $sentence;
// Concatenate "not" to every JJ, RB or VB
// Todo: ignore negative words (not, never, neither)
$sentence = preg_replace("/(\w+)\/(JJ|MD|RB|VB|VBD|VBN)\b/", "not$1/$2", $sentence);
// Remove all POS tags
$sentence = preg_replace("/\/[A-Z$]+/", "", $sentence);
return "$postagged<br>$sentence";
}
КСТАТИ: В этом примере я использую POS-tagging implementation и lexicon Яна Барбер. Примером такого кода, работающего будет:
echo negate("I will never go to their place again");
I/NN will/MD never/RB go/VB to/TO their/PRP$ place/NN again/RB
I notwill notnever notgo to their place notagain
Как вы можете видеть, (и этот вопрос также прокомментировал в коде), отрицая слова сами быть сведены на нет, как вэй: never
становится notnever
, который, очевидно, не должен» т. Поскольку мои навыки регулярного выражения не все это, есть ли способ исключить эти слова из используемого регулярного выражения?
[править] Кроме того, я бы очень приветствую другие комментарии/критику вы могли бы иметь в этой реализации отрицая, так как я уверен, что это (все еще) вполне испорчен :-)
http://stackoverflow.com/questions/2633353/algorithm-for-negating-sentences –