#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’. Отличный совет!