Stellen Sie sich folgendes Problem:Best Clustering-Algorithmus? (Einfach erklärt)
- Sie haben eine Datenbank über 20.000 Texte in einer Tabelle mit dem Namen „Artikel“
- Sie mögen die diejenigen für eine Verbindung mit einem Cluster-Algorithmus, um anzuzeigen, Verwandte Artikel zusammen
- der Algorithmus flachen clustering (nicht hierarchisch)
- die zugehörigen Artikel eingefügt werden sollen, in die Tabelle „verwandten“
- der Cluster-Algorithmus, ob zwei oder mor entscheiden sollte tun soll e Artikel beziehen oder nicht, basierend auf den Texten
- ich in PHP codieren wollen, aber Beispiele mit Pseudo-Code oder anderen Programmiersprachen sind ok, auch
ich einen ersten Entwurf mit einer Funktionskontrolle codiert haben (), die "wahr" ergibt, wenn die zwei eingegebenen Artikel verwandt sind, und "falsch", wenn nicht. Der Rest des Codes (Auswahl der Artikel aus der Datenbank, Auswahl der zu vergleichenden Artikel, Einfügen der zugehörigen Artikel) ist ebenfalls abgeschlossen. Vielleicht kannst du auch den Rest verbessern. Aber der wichtigste Punkt, der mir wichtig ist, ist die Funktion check(). Es wäre also großartig, wenn Sie einige Verbesserungen oder ganz andere Ansätze veröffentlichen könnten.
ANSATZ 1
<?php
$zeit = time();
function check($str1, $str2){
$minprozent = 60;
similar_text($str1, $str2, $prozent);
$prozent = sprintf("%01.2f", $prozent);
if ($prozent > $minprozent) {
return TRUE;
}
else {
return FALSE;
}
}
$sql1 = "SELECT id, text FROM articles ORDER BY RAND() LIMIT 0, 20";
$sql2 = mysql_query($sql1);
while ($sql3 = mysql_fetch_assoc($sql2)) {
$rel1 = "SELECT id, text, MATCH (text) AGAINST ('".$sql3['text']."') AS score FROM articles WHERE MATCH (text) AGAINST ('".$sql3['text']."') AND id NOT LIKE ".$sql3['id']." LIMIT 0, 20";
$rel2 = mysql_query($rel1);
$rel2a = mysql_num_rows($rel2);
if ($rel2a > 0) {
while ($rel3 = mysql_fetch_assoc($rel2)) {
if (check($sql3['text'], $rel3['text']) == TRUE) {
$id_a = $sql3['id'];
$id_b = $rel3['id'];
$rein1 = "INSERT INTO related (article1, article2) VALUES ('".$id_a."', '".$id_b."')";
$rein2 = mysql_query($rein1);
$rein3 = "INSERT INTO related (article1, article2) VALUES ('".$id_b."', '".$id_a."')";
$rein4 = mysql_query($rein3);
}
}
}
}
?>
ANSATZ 2 [nur überprüfen()]
<?php
function square($number) {
$square = pow($number, 2);
return $square;
}
function check($text1, $text2) {
$words_sub = text_splitter($text2); // splits the text into single words
$words = text_splitter($text1); // splits the text into single words
// document 1 start
$document1 = array();
foreach ($words as $word) {
if (in_array($word, $words)) {
if (isset($document1[$word])) { $document1[$word]++; } else { $document1[$word] = 1; }
}
}
$rating1 = 0;
foreach ($document1 as $temp) {
$rating1 = $rating1+square($temp);
}
$rating1 = sqrt($rating1);
// document 1 end
// document 2 start
$document2 = array();
foreach ($words_sub as $word_sub) {
if (in_array($word_sub, $words)) {
if (isset($document2[$word_sub])) { $document2[$word_sub]++; } else { $document2[$word_sub] = 1; }
}
}
$rating2 = 0;
foreach ($document2 as $temp) {
$rating2 = $rating2+square($temp);
}
$rating2 = sqrt($rating2);
// document 2 end
$skalarprodukt = 0;
for ($m=0; $m<count($words)-1; $m++) {
$skalarprodukt = $skalarprodukt+(array_shift($document1)*array_shift($document2));
}
if (($rating1*$rating2) == 0) { continue; }
$kosinusmass = $skalarprodukt/($rating1*$rating2);
if ($kosinusmass < 0.7) {
return FALSE;
}
else {
return TRUE;
}
}
?>
Ich möchte auch sagen, dass ich weiß, dass es viele Algorithmen für das Clustering sind aber an jeder Stelle gibt es nur die mathematische Beschreibung, die für mich etwas schwierig zu verstehen ist. Codierungsbeispiele in (Pseudo-) Code wären also großartig.
Ich hoffe, Sie können mir helfen. Danke im Voraus!
Es gibt WordPress Plugins (ja, yuck, ich weiß, verschone mich das), die eine überraschend gute Arbeit bei diesem tun, sie führen tatsächlich vernünftige Clustering (in der Regel tun sie TF-IDF mit der Rückseite der Wörter mit k-Mittel oder etwas So können Sie sie für Inspirationen verwenden (einige davon sind Open Source unter MIT). –
Ich denke, Anony-Mousse hat Recht: Clustering ist hier nicht das ideale Werkzeug. Wenn jedes Dokument nur zu einem Cluster gehört, liegt das Problem darin, dass Dokumente nahe den Grenzen eines Clusters Dokumenten in anderen benachbarten Clustern ähnlicher sind als die meisten Dokumente in ihrem eigenen Cluster. –