2012-05-01 34 views
5

Tôi đang cố gắng tìm cách loại bỏ các câu dựa trên tính năng gắn thẻ POS. Vui lòng xem xét:Bỏ qua các câu bằng cách sử dụng gắn thẻ 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"; 
} 

BTW: Trong ví dụ này, tôi đang sử dụng POS-tagging implementationlexicon của Ian Barber. Một ví dụ về mã này chạy sẽ là:

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 

Như bạn thấy, (và vấn đề này cũng là nhận xét trong mã), phủ nhận những lời mình đang bị phủ nhận như wel: never trở thành notnever, mà rõ ràng shouldn' t xảy ra. Kể từ khi kỹ năng regex của tôi không phải là tất cả những điều đó, có cách nào để loại trừ những từ này từ regex được sử dụng?

[sửa] Ngoài ra, tôi sẽ rất hoan nghênh ý kiến ​​khác/phê bình bạn có thể có trong việc thực hiện phủ định này, vì tôi chắc chắn rằng đó là (vẫn còn) khá thiếu sót :-)

+0

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

Trả lời

3

này cung cấp cho một thử:

$sentence = preg_replace("/(\s)(?:(?!never|neither|not)(\w*))\/(JJ|MD|RB|VB|VBD|VBN)\b/", "$1not$2", $sentence); 
Các vấn đề liên quan