/** * @see IDSequence::increaseId() * * @param int $inc * @return int */ public function increaseId($inc = 1) { try { $this->dbhelper->startTransaction(); $sql = "select current_value from id_sequence where id_key='%s' for update"; $current_value = $this->dbhelper->getOne($sql, $this->table_name); if (empty($current_value)) { $sql = "insert into id_sequence (id_key,current_value)values('%s',%d)"; $this->dbhelper->execute($sql, $this->table_name, $inc); $next_id = $inc; } else { $sql = "update id_sequence set current_value = current_value + %d where id_key = '%s'"; $this->dbhelper->execute($sql, $inc, $this->table_name); $next_id = $current_value + $inc; } $this->dbhelper->commit(); } catch (Exception $e) { $this->dbhelper->rollback(); throw $e; } return $next_id; }
/** * Dokonuje bezpo¶redniej aktualizacji zbioru cech. * * @param array $comment Tablica asocjacyjna (wyraz => liczba wyst±pieñ). * @param bool $positive Zbiór cech pozytywnych lub negatywnych? */ protected function updateVector(array $comment, $positive) { if ($positive) { $pn = 'p'; } else { $pn = 'n'; } // uaktualnij i pobierz Nk $sql = "UPDATE `datavect_{$this->idc}-4o` SET Nk{$pn} = Nk{$pn}+1"; $this->dbconn->query($sql); $sql = "SELECT Nkp, Nkn FROM `datavect_{$this->idc}-4o`"; list($Nkp, $Nkn) = DBHelper::getRow($this->dbconn, $sql); if ($positive) { $logNk = log($Nkp + 1, 2); } else { $logNk = log($Nkn + 1, 2); } $NkSum = $Nkp + $Nkn; $oneDivLogNK = 1 / $logNk; // aktualizacja istniej±cych dfikp i dodanie nowych wyrazów $sql = "INSERT INTO `datavect_{$this->idc}-4f` (word,dfikp,dfikn,WCikp,WCikn,CCi,idf) VALUES "; $sql .= "(?, "; $sql .= $positive ? "1, 0, ?, 0" : "0, 1, 0, ?"; $sql .= ", 2, 1)"; $sql .= "ON DUPLICATE KEY UPDATE dfik{$pn} = dfik{$pn} + 1"; $stmt = $this->dbconn->prepare($sql); $stmt->bind_param("sd", $k, $oneDivLogNK); foreach ($comment as $k => $v) { $stmt->execute(); } $stmt->close(); // uaktualnij zmienne statystyczne dla wszystkich wyrazów $sql = "UPDATE `datavect_{$this->idc}-4f`\n SET WCik{$pn} = LOG2(dfik{$pn}+1)/{$logNk},\n CCi = 2 * LOG2((2 * GREATEST(dfikp,dfikn)) / (dfikp + dfikn)),\n idf = LOG({$NkSum}/(dfikp+dfikn));"; $this->dbconn->query($sql); // pobierz wyliczone informacje statystyczne dla dodawanego komentarza $comment_words = array(); $dbcom = "('" . implode("','", array_keys($comment)) . "')"; $sql = "SELECT word, CCi, idf FROM `datavect_{$this->idc}-4f` WHERE word IN {$dbcom}"; $res = $this->dbconn->query($sql); while ($row = $res->fetch_row()) { list($word, $CCi, $idf) = $row; $comment_words[$word]['idf'] = $idf; $comment_words[$word]['CCi'] = $CCi; } $res->free(); // Na podstawie zebranych danych wylicz wagi i znormalizuj warto¶ci dokum. $sum = 0.0; foreach ($comment as $k => &$v) { $v = log($v + 0.5) * $comment_words[$k]['idf'] * $comment_words[$k]['CCi']; if ($v == 0.0) { $v = log($v + 0.5) * $comment_words[$k]['idf'] * 0.01; } $sum += $v; } if ($sum == 0.0) { $sum = 1.0; } $mul = 1 / $sum; foreach ($comment as $k => &$v) { $v *= $mul; } unset($comment_words); // dodaj nowy komentarz $sql = "INSERT INTO `datavect_{$this->idc}-4s` (pn, last_act) VALUES ('{$pn}', 0)"; $this->dbconn->query($sql); $sql = "INSERT INTO `datavect_{$this->idc}-4p` (subcat, word, weight) VALUES "; $subcat = $this->dbconn->insert_id; foreach ($comment as $k => $v) { $sql .= "({$subcat}, '{$k}', {$v}),"; } $sql[strlen($sql) - 1] = ' '; $this->dbconn->query($sql); // usuñ najdawniej nieu¿ywan± grupê, je¶li liczba grup // jest wiêksza od $this->maxComments $sql = "SELECT COUNT(subcat) FROM `datavect_{$this->idc}-4s`"; $count = DBHelper::getOne($this->dbconn, $sql); if ($count <= $this->maxComments) { return; } // wybierz najdawniej nieu¿ywan± grupê $sql = "SELECT subcat FROM `datavect_{$this->idc}-4s` ORDER BY last_act DESC LIMIT 1"; $subcat = DBHelper::getOne($this->dbconn, $sql); // usuñ z³±czane grupy, które wchodz± w sk³ad nowej grupy g³ównej $sql = "DELETE `datavect_{$this->idc}-4s` WHERE subcat = {$subcat}"; $this->dbconn->query($sql); $sql = "DELETE `datavect_{$this->idc}-4p` WHERE subcat = {$subcat}"; $this->dbconn->query($sql); }
/** * Dokonuje bezpo¶redniej aktualizacji zbioru cech. * * @param array $comment Tablica asocjacyjna (wyraz => waga po log.). * @param bool $positive Zbiór cech pozytywnych lub negatywnych? */ protected function updateVector(array $comment, $positive) { if ($positive) { $pn = 'p'; } else { $pn = 'n'; } // uaktualnij i pobierz Nk $sql = "UPDATE `datavect_{$this->idc}-2o` SET Nk{$pn} = Nk{$pn}+1"; $this->dbconn->query($sql); $sql = "SELECT Nk{$pn} FROM `datavect_{$this->idc}-2o`"; $Nk = DBHelper::getOne($this->dbconn, $sql); $logNk = log($Nk + 1, 2); $oneDivLogNK = 1 / $logNk; // aktualizacja istniej±cych i dodanie nowych $sql = "INSERT INTO `datavect_{$this->idc}-2` (word,dfikp,dfikn,WCikp,WCikn,CCi,widp,widn) VALUES "; $sql .= "(?, "; $sql .= $positive ? "1, 0, ?, 0" : "0, 1, 0, ?"; $sql .= ", LOG2(dfik{$pn}), "; $sql .= $positive ? "?, 0" : "0, ?"; $sql .= ") "; $sql .= "ON DUPLICATE KEY UPDATE dfik{$pn} = dfik{$pn} + 1, wid{$pn} = wid{$pn} + ?"; $stmt = $this->dbconn->prepare($sql); $stmt->bind_param("sddd", $k, $oneDivLogNK, $v, $v); foreach ($comment as $k => $v) { $stmt->execute(); } $stmt->close(); // Aktualizacja elementów globalnych (dotycz±cych wszystkich wyrazów). $sql = "UPDATE `datavect_{$this->idc}-2` SET WCik{$pn} = LOG2(dfik{$pn}+1)/{$logNk}, CCi = LOG2((2 * GREATEST(dfikp,dfikn)) / (dfikp + dfikn))"; $this->dbconn->query($sql); }