2012-05-01 27 views
5

POS etiketleme temel alınarak cümleleri etkisiz hale getirmenin bir yolunu bulmaya çalışıyorum. dikkate alınız:POS etiketleme kullanarak cümleler cezalandırılıyor

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"; 
} 

BTW: Bu örnekte, ben POS-tagging implementation Ian Barber lexicon kullanıyorum. Bu kod çalışan bir örnek olacaktır:

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 

Eğer görebilirsiniz (ve bu hususun da kodda yorumlanır) gibi, kendileri wel olarak reddedildiği ediliyor kelimeleri negating: nevernotnever dönüşür hangi besbelli 'olmamalı t olur. Regex becerilerim tüm bunlar olmadığından, bu kelimeleri kullanılan regeeksten çıkarmanın bir yolu var mı?

[değiştir] Ayrıca, ben :-) oldukça kusurlu o (hala) eminim beri

+0

http://stackoverflow.com/questions/2633353/algorithm-for-negating-sentences –

cevap

3

bu bir deneyin, bu yadsıyan bir uygulamada olabilir diğer yorum/eleştiri çok bekleriz:

$sentence = preg_replace("/(\s)(?:(?!never|neither|not)(\w*))\/(JJ|MD|RB|VB|VBD|VBN)\b/", "$1not$2", $sentence);