Hãy tưởng tượng vấn đề sau đây:Thuật toán phân cụm tốt nhất? (Chỉ cần giải thích)
- Bạn có một cơ sở dữ liệu chứa khoảng 20.000 văn bản trong một bảng gọi là "bài báo"
- Bạn muốn kết nối những người có liên quan đến sử dụng một thuật toán phân nhóm để hiển thị bài viết liên quan cùng
- thuật toán nên làm clustering phẳng (không phân cấp)
- các bài viết liên quan nên được chèn vào bảng "liên quan"
- thuật toán phân nhóm nên quyết định xem hai hoặc mor bài báo điện tử có liên quan hay không dựa trên các văn bản
- Tôi muốn viết mã trong PHP nhưng ví dụ với mã giả hoặc các ngôn ngữ lập trình khác là ok, quá
Tôi đã mã hóa một dự thảo đầu tiên với một tấm séc function () cung cấp cho "true" nếu hai bài viết đầu vào có liên quan và "sai" nếu không. Phần còn lại của mã (chọn các bài báo từ cơ sở dữ liệu, chọn bài viết để so sánh, chèn các bài liên quan) cũng đã hoàn thành. Có lẽ bạn cũng có thể cải thiện phần còn lại. Nhưng điểm chính quan trọng đối với tôi là kiểm tra hàm(). Vì vậy, nó sẽ là tuyệt vời nếu bạn có thể đăng một số cải tiến hoặc phương pháp tiếp cận hoàn toàn khác nhau.
TIẾP CẬN 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);
}
}
}
}
?>
TIẾP CẬN 2 [chỉ kiểm tra()]
<?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;
}
}
?>
Tôi cũng muốn nói rằng tôi biết rằng có rất nhiều thuật toán cho clustering nhưng trên mọi trang web chỉ có mô tả toán học hơi khó hiểu đối với tôi. Vì vậy, các ví dụ mã hóa trong (giả) mã sẽ là tuyệt vời.
Tôi hy vọng bạn có thể giúp tôi. Cảm ơn trước!
Có các plugin WordPress (có, yuck, tôi biết, tha cho tôi) làm một công việc đáng kinh ngạc ở đây, họ thực sự thực hiện phân cụm hợp lý (thường là TF-IDF với các từ bằng k-means hoặc cái gì đó như thế) và bạn có thể sử dụng chúng để truyền cảm hứng (một số trong số đó là nguồn mở theo MIT). –
Tôi nghĩ Anony-Mousse là đúng: phân cụm không phải là công cụ lý tưởng ở đây. Nếu mỗi tài liệu thuộc về 1 cụm, thì bạn có vấn đề về tài liệu gần ranh giới của cụm đang * tương tự hơn * đối với tài liệu trong các cụm lân cận khác so với hầu hết các tài liệu trong cụm của riêng chúng. –