regex — счетчик PHP добавляет дополнительное приращение

В основном у меня есть простая программа, которая принимает какой-то текст в виде ввода из формы, сопоставляет все слова в тексте с двумя лексиконами. Одна лексика содержит список положительных слов, а другая содержит список отрицательных слов. Для каждого совпадения положительного слова $ posMatchCount увеличивается. Для каждого совпадения с отрицательным словом увеличивается $ negMatchCount. Выполняется простое сравнение, и если положительные слова больше, программа возвращает «Положительный», в противном случае возвращает «отрицательный». Он возвращает «Нейтральный», если положительные слова == отрицательные слова или если нет положительных или отрицательных совпадений. Вот полный код:

        <?php
include("positive_lexicon.php");
include("negative_lexicon.php");
?>
<html>
<head>
<title>Output</title>
</head>
<body>

<h1>Output</h1>
<hr>
<?php

$ preprocessedDoc2 = «Я люблю этот телефон, но ненавижу батарею, я обожаю размер экрана»;

/////////////////////////////////////////////////////////////////////////////////match doc text with POSITIVE sentiment lexicon

$matchedPosWords = NULL;//contains matched words
$posMatchCount = 0;//count of POS matches

$array1 = explode(' ', $preprocessedDoc2);
foreach($array1 as $word){

if(preg_match("/\s{$word}\s/", $positiveLexicon)){
$matchedPosWords = $matchedPosWords . $word . " - ";
$posMatchCount++;
$posMatch = true; //for subjectivity check
}
else{
$posMatch= false; //for subjectivity check
}
}

echo "Matched POSITIVE words: <br><br>";
echo "<div style=\"background-color:#66FF66\">";
echo $matchedPosWords . " (Total: {$posMatchCount})";
echo "</div>";
echo "<br><br>";

/////////////////////////////////////////////////////////////////////////////////match doc text with NEGATIVE sentiment lexicon

$matchedNegWords = NULL;//contains matched words
$negMatchCount = 0;//count of NEG matches

$array2 = explode(' ', $preprocessedDoc2);
foreach($array2 as $word2){

if(preg_match("/\s{$word2}\s/", $negativeLexicon)){
$matchedNegWords = $matchedNegWords . $word2 . " - ";
$negMatchCount++;
$negMatch = true; //for subjectivity check
}
else{
$negMatch = false; //for subjectivity check
}
}

echo "Matched NEGATIVE words: <br><br>";
echo "<div style=\"background-color:#FF5050\">";
echo $matchedNegWords . " (Total: {$negMatchCount})";
echo "</div>";
echo "<br><br>";

/////////////////////////////////////////////////////////////////////////////////comparison between POSITIVE and NEGATIVE words

echo "analyzing document's sentiment ...<br><br>";

function checkPolarity($posWords, $negWords, $posMatch1, $negMatch1){//function to check polarity of docif((($posMatch1==false) && ($negMatch1==false))||($posWords==$negWords)){
return "<strong>NEUTRAL</strong>"; //if there are no POS or NEG matches, or matches are equal, return NEUTRAL

}

if($posWords > $negWords){
return "<strong>POSITIVE</strong>"; //if count of POS matches is greater than count of NEG matches, return POSITIVE

}

else{
return "<strong>NEGATIVE</strong>"; //if count of NEG matches is greater than count of POS matches, return NEGATIVE

}}

$polarity = checkPolarity($posMatchCount, $negMatchCount, $posMatch, $negMatch); //call function to check polarity

echo "Polarity of the document is: " . $polarity; //display overall polarity
echo "<br><br>";

$polarity = "";?>

</body>
</html>

Однако иногда он возвращает «нейронный», хотя количество положительных слов больше, чем отрицательных. Иногда это делает дополнительный шаг. Например, строка «я люблю этот телефон, но ненавижу батарею, я обожаю размер экрана» возвращает следующее:

Matched POSITIVE words:

love - adore - - (Total: 3)Matched NEGATIVE words:

hate - - (Total: 2)

Несмотря на то, что есть только два положительных совпадения и одно отрицательное совпадение, это дает счет 3 для положительных совпадений и 2 для отрицательных совпадений. Я знаю, что проблема будет сразу обнаружена на SO, хотя я не могу ее найти. Я попробую свою удачу ..

0

Решение

На мой взгляд, код не выглядит неправильно. Но вывод, который вы положили

Matched POSITIVE words:

love - adore - - (Total: 3)Matched NEGATIVE words:

hate - - (Total: 2)

У вас есть один пробел в последней записи как для положительных, так и для отрицательных совпадений, что я считаю неправильным.

если хотите, измените код на отладочный и проверьте.

echo "Foreach for Positive words started <br/>";
foreach($array1 as $word){

if(preg_match("/\s{$word}\s/", $positiveLexicon) && trim($word) != "" ){
echo $word."= <br/>"; // there should be no empty word in this
$matchedPosWords = $matchedPosWords." - ". $word; // there should be no dash at the last, only word
$posMatchCount++;
$posMatch = true; //for subjectivity check
}
else{
$posMatch= false; //for subjectivity check
}
}
echo "Foreach for Positive words Ended <br/>";
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]