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 implementation và lexicon 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 :-)
http://stackoverflow.com/questions/2633353/algorithm-for-negating-sentences –