Почему не работает мой тестовый скрипт (PHP)?

#php #testing #tweets

#php #тестирование #твиты

Вопрос:

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

Для проверки точности классификации (количество твитов, классифицированных компьютером так же, как я это делал вручную, разделенное на общее количество), был написан скрипт.

Однако я столкнулся с проблемой с этим PHP-скриптом. При его запуске выдает ошибку «Деление на ноль в C:wampand-so-on ‘. Вероятно, это связано с тем, что счетчик не обновляется. Кроме того, количество «правильных классов», похоже, также не обновляется. Эти две части важны, поскольку формула точности такова: «правильные классы», разделенные на «счетчик».

Мой вопрос таков: в чем, по вашему мнению, проблема при просмотре скрипта? И как я мог бы потенциально это исправить?

Скрипт для тестирования:

 $test_array = array();
$counter = 0;

$timer1 = microtime(true);
$right_classes = 0;

foreach ($test_set as $test_item) {

$tweet_id = $test_item['tweet_id'];
$class_id_shouldbe = $test_item['class_id'];

$tweet = Tweets::loadOne($tweet_id);

// # Preprocess if not done already
// $steps->processTweet($tweet_id, $tweet);
// $tweet = Tweets::loadOne($tweet_id);

if ((int) $tweet['classified'] > 0 || !$tweet['valid']) continue;

if (strlen($tweet['processed_text']) == 0) {

    $steps->processTweet($tweet_id, $tweet);
    $tweet = Tweets::loadOne($tweet_id);
    if (strlen($tweet['processed_text']) == 0) {
        echo "Kon tweet '$tweet_id' niet processen. <br>";          
        continue;
    } 
}

$class_id = $classifier->classify($tweet['processed_text']);

# Add tweets in database
// Tweets::addClassId($tweet_id, $class_id_shouldbe);

$test_array[$tweet_id] = array(
    'what_human_said' => $class_id_shouldbe,
    'what_classifier_said' => $class_id,        
);

if ($class_id_shouldbe == $class_id) $right_classes  ;

$counter  ;

if ($counter > 936) break;

echo "$tweet_id,$class_id_shouldbe,$class_id<br>"; 
}

$timer2 = microtime(true);

echo '<br><br>klaar in '.round($timer2-$timer1, 3).' sec<br>';
echo ($right_classes/$counter)*100 .' %'; 

exit();
  

Комментарии:

1. Кроме того, раньше $timer2 = microtime(true) у вас, похоже, была неправильная скобка } .

2. Ах, у тебя там foreach скрывается. Пожалуйста, пожалуйста, всегда используйте отступ — это полезно для вашего редактора и позволяет читать вопросы и здесь.

3. Спасибо за ваш комментарий. В следующий раз я постараюсь сделать вопрос более читабельным.

4. Вы все еще можете отредактировать его сейчас — вопросы предназначены для широкой будущей аудитории, а не только для их постера. Вы бы отредактировали? Спасибо!

Ответ №1:

прежде всего просто исправьте ошибку, а затем попробуйте проверить, почему $counter равно нулю. Чтобы исправить $counter просто проверьте перед разделением:

 if($counter!=0) echo ($right_classes/$counter)*100 .' %'; else echo '0 %';
  

Затем, просматривая свой код, вы используете continue для получения следующего элемента в, foreach тогда это не гарантируется, что $counter достигнуто, и тогда вы получаете Division by zero ошибку.

Надеюсь, это поможет!

Комментарии:

1. Спасибо ZeroWorks! Это работает благодаря удалению частей кода ‘continue’. Отличный совет!