PHP-реализация байесовского классификатора: назначение тем текстам

В моем проекте страницы новостей у меня есть таблица базы данных news со следующей структурой:

 - id: [integer] unique number identifying the news entry, e.g.: *1983*
 - title: [string] title of the text, e.g.: *New Life in America No Longer Means a New Name*
 - topic: [string] category which should be chosen by the classificator, e.g: *Sports*

Кроме того, есть таблица bayes с информацией о частотах слов:

 - word: [string] a word which the frequencies are given for, e.g.: *real estate*
 - topic: [string] same content as "topic" field above, e.h. *Economics*
 - count: [integer] number of occurrences of "word" in "topic" (incremented when new documents go to "topic"), e.g: *100*

Теперь я хочу, чтобы мой PHP-скрипт классифицировал все записи новостей и назначал им одну из нескольких возможных категорий (тем).

Это правильная реализация? Можете ли вы его улучшить?

<?php
include 'mysqlLogin.php';
$get1 = "SELECT id, title FROM ".$prefix."news WHERE topic = '' LIMIT 0, 150";
$get2 = mysql_abfrage($get1);
// pTOPICS BEGIN
$pTopics1 = "SELECT topic, SUM(count) AS count FROM ".$prefix."bayes WHERE topic != '' GROUP BY topic";
$pTopics2 = mysql_abfrage($pTopics1);
$pTopics = array();
while ($pTopics3 = mysql_fetch_assoc($pTopics2)) {
    $pTopics[$pTopics3['topic']] = $pTopics3['count'];
}
// pTOPICS END
// pWORDS BEGIN
$pWords1 = "SELECT word, topic, count FROM ".$prefix."bayes";
$pWords2 = mysql_abfrage($pWords1);
$pWords = array();
while ($pWords3 = mysql_fetch_assoc($pWords2)) {
    if (!isset($pWords[$pWords3['topic']])) {
        $pWords[$pWords3['topic']] = array();
    }
    $pWords[$pWords3['topic']][$pWords3['word']] = $pWords3['count'];
}
// pWORDS END
while ($get3 = mysql_fetch_assoc($get2)) {
    $pTextInTopics = array();
    $tokens = tokenizer($get3['title']);
    foreach ($pTopics as $topic=>$documentsInTopic) {
        if (!isset($pTextInTopics[$topic])) { $pTextInTopics[$topic] = 1; }
        foreach ($tokens as $token) {
            echo '....'.$token;
            if (isset($pWords[$topic][$token])) {
                $pTextInTopics[$topic] *= $pWords[$topic][$token]/array_sum($pWords[$topic]);
            }
        }
        $pTextInTopics[$topic] *= $pTopics[$topic]/array_sum($pTopics); // #documentsInTopic / #allDocuments
    }
    asort($pTextInTopics); // pick topic with lowest value
    if ($chosenTopic = each($pTextInTopics)) {
        echo '<p>The text belongs to topic '.$chosenTopic['key'].' with a likelihood of '.$chosenTopic['value'].'</p>';
    }
}
?>

Обучение проводится вручную, в этот код оно не входит. Если текст «Можно заработать, если продаешь недвижимость» отнесен к категории / теме «Экономика», то все слова (you, can, make, ...) вставляются в таблицу bayes с «Экономикой» в качестве темы и 1 в качестве стандартного подсчета. Если слово уже присутствует в той же теме, счет увеличивается.

Примеры обучающих данных:

количество слов, тем

kaczynski Политика 1

sony Technology 1

bank Economics 1

phone Technology 1

sony Economics 3

ericsson Technology 2

Пример вывода / результата:

Название текста: Тест телефона Sony Ericsson Aspen - чувствительный к Winberry

Политика

.... телефон .... тест .... сони .... эрикссон .... осина .... чувствительность .... винберри

Технологии

.... телефон НАЙДЕН .... тест .... sony FOUND .... ericsson FOUND .... aspen .... чувствительный .... винберри

Экономика

.... телефон .... тест .... sony FOUND .... ericsson .... aspen .... чувствительный .... winberry

Результат: текст относится к теме Технологии с вероятностью 0,013888888888889

Заранее большое спасибо!

6
задан caw 27 August 2010 в 14:36
поделиться