Inhaltsverzeichnis
Algorithmusauswahl
Spezifische Empfehlungsideen
Implementierungsprozess
Erhalten der ersten TAGS
Speicherung der zweiten TAGS
Spezifische Kodierung
1. Rufen Sie die TAGID ab, die allen Artikeln entspricht
Heim Datenbank MySQL-Tutorial Methode zur Implementierung von Inhaltsempfehlungen basierend auf Tags (Code)

Methode zur Implementierung von Inhaltsempfehlungen basierend auf Tags (Code)

Sep 14, 2018 pm 02:11 PM
mysql php 搜索引擎 算法 缓存

In diesem Artikel geht es um die Methode (den Code) zur Implementierung von Inhaltsempfehlungen auf der Grundlage von Tags. Ich hoffe, dass er für Freunde in Not hilfreich ist.

Es stellt sich heraus, dass die relevanten Inhaltsempfehlungen für die Artikelseiten auf meiner kleinen Website der Einfachheit und Bequemlichkeit halber darin bestehen, Daten zufällig aus der Datenbank zu extrahieren, um eine Liste zu füllen, sodass überhaupt keine Korrelation besteht , und es gibt keine Möglichkeit, Benutzer zum Zugriff auf die Empfehlungsinhalte zu führen.

Algorithmusauswahl

Wie können wir ähnliche Inhalte empfehlen? Da die kleine Website noch auf einem virtuellen Host läuft (ja, sie hat nicht einmal einen vollständig steuerbaren Server), gibt es sie also Es gibt nicht viele Möglichkeiten, sich das vorzustellen, und die Bedingungen beschränken sich auf die Verwendung von PHP+MySql. Daher kam mir die Idee, Tags zu verwenden, um ähnliche Artikel für Empfehlungen zuzuordnen. Wenn die TAGS von zwei Artikeln ähnlich sind

Zum Beispiel: Die TAGS von Artikel A lauten: [A,B,C,D,E]
Die TAGS von Artikel B lauten: [A,D,E,F ,G]
Die TAGS von Artikel C sind: [C,H,I,J,K]

Mit unseren Augen können wir leicht erkennen, dass Artikel B und Artikel A ähnlicher sind, weil sie drei gleiche Schlüsselwörter haben: : [A, D, E], wie verwendet man einen Computer, um ihre Ähnlichkeit zu bestimmen? Hier verwenden wir die grundlegendste Anwendung der Jaccard-Ähnlichkeit , um ihre Ähnlichkeit

Jaccard-Ähnlichkeit zu berechnen

Gegeben zwei Mengen A und B ist der Jaccard-Koeffizient als das Verhältnis der Größe des Schnittpunkts von A und B zur Größe der Vereinigung von A und B definiert, definiert wie folgt:

Methode zur Implementierung von Inhaltsempfehlungen basierend auf Tags (Code)

Der Schnittpunkt von Artikel A und Artikel B ist [A,D,E], die Größe ist 3 und die Vereinigung ist [A,B ,C,D, E, F, G], die Größe ist 7, 3/7=0,4285...
Der Schnittpunkt von Artikel A und Artikel C ist [C], die Größe ist 1 und die Vereinigung ist [A, B, C, D, E, H, I, J, K], die Größe beträgt 9, 1/9=0,11111...

Auf diese Weise kann geschlossen werden, dass Artikel A und B sind ähnlicher als die Artikel A und C. Mit diesen Algorithmen können Computer die Ähnlichkeit zweier Artikel bestimmen.

Spezifische Empfehlungsideen

Ermitteln Sie anhand eines Artikels die Schlüsselwort-TAGS des Artikels und vergleichen Sie dann mit dem obigen Algorithmus die Ähnlichkeit aller Artikel in der Datenbank, um die ähnlichsten N Artikel zu erhalten Artikel werden empfohlen.

Implementierungsprozess

Erhalten der ersten TAGS

Die TAGS des Artikels bestehen darin, hochfrequente Wörter im Artikel über den TF-IDF-Algorithmus zu extrahieren und N als auszuwählen TAGS. Chinesische Artikel beinhalten auch ein Problem der chinesischen Wortsegmentierung. Ich habe Python (warum Python verwenden, Jieba-Wortsegmentierung, so lecker) verwendet, um lokal ein Programm zu schreiben, das die Wortsegmentierung aller Artikel vervollständigt. Worthäufigkeitsstatistiken erstellen, TAGS generieren und in die Datenbank des Servers zurückschreiben. Da es in diesem Artikel um das Schreiben empfohlener Algorithmen geht, werden die Teile der Wortsegmentierung und der Einrichtung von TAGS nicht im Detail besprochen, und verschiedene Systeme verfügen über unterschiedliche Methoden zur Einrichtung von TAGS.

Speicherung der zweiten TAGS

Erstellen Sie zwei Tabellen zum Speichern von TAGS
Tags, die zum Speichern der Namen aller Tags verwendet werden

+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| tag   | text       | YES  |     | NULL    |       |
| count | bigint(20) | YES  |     | NULL    |       |
| tagid | int(11)    | NO   | PRI | 0       |       |
+-------+------------+------+-----+---------+-------+
Nach dem Login kopieren

tag_map zum Erstellen von Tags und Artikelreflexion Beziehung.

+-----------+------------+------+-----+---------+-------+
| Field     | Type       | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+-------+
| id        | bigint(20) | NO   | PRI | 0       |       |
| articleid | bigint(20) | YES  |     | NULL    |       |
| tagid     | int(11)    | YES  |     | NULL    |       |
+-----------+------------+------+-----+---------+-------+
Nach dem Login kopieren

Die in tag_map gespeicherten Daten ähneln den folgenden:

+----+-----------+-------+
| id | articleid | tagid |
+----+-----------+-------+
|  1 |       776 |   589 |
|  2 |       776 |   471 |
|  3 |       776 |  1455 |
|  4 |       776 |  1287 |
|  5 |       776 |    52 |
|  6 |       777 |  1386 |
|  7 |       777 |   588 |
|  8 |       777 |   109 |
|  9 |       777 |   603 |
| 10 |       777 |  1299 |
+----+-----------+-------+
Nach dem Login kopieren

Tatsächlich müssen Sie bei ähnlichen Empfehlungen nur die tag_map-Tabelle verwenden, da Tag-ID und Tag-Name in einem sind -zu-eins-Korrespondenz.

Spezifische Kodierung

1. Rufen Sie die TAGID ab, die allen Artikeln entspricht

mysql> select articleid, GROUP_CONCAT(tagid) as tags from tag_map GROUP BY articleid;
+-----------+--------------------------+
| articleid | tags                     |
+-----------+--------------------------+
|        12 | 1178,1067,49,693,1227    |
|        13 | 196,2004,2071,927,131    |
|        14 | 1945,713,1711,2024,49    |
|        15 | 35,119,9,1,1180          |
|        16 | 1182,1924,2200,181,1938  |
|        17 | 46,492,414,424,620       |
|        18 | 415,499,153,567,674      |
|        19 | 1602,805,691,1613,194    |
|        20 | 2070,1994,886,575,1149   |
|        21 | 1953,1961,1534,2038,1393 |
+-----------+--------------------------+
Nach dem Login kopieren

Mit dem oben genannten SQL können Sie alle Artikel und alle entsprechenden Tags gleichzeitig abfragen
In PHP können wir Tags in ein Array umwandeln.

public function getAllGroupByArticleId(){
        //缓存查询数据,因为这个是全表数据,而且不更新文章不会变化,便是每次推荐都要从数据库里获取一次数据,对性能肯定会有影响,所以做个缓存。
        if($cache = CacheHelper::getCache()){
            return $cache;
        }
        $query_result = $this->query('select articleid, GROUP_CONCAT(tagid) as tags from tag_map GROUP BY articleid');

        $result = [];
        foreach($query_result as $key => $value){
            //用articleid 做key ,值是该id下的所有tagID数组。
            $result[$value['articleid']] = explode(",",$value['tags']);
        }

        CacheHelper::setCache($result, 86400);

        return $result;

    }
Nach dem Login kopieren

Mit diesem Rückgabeergebnis ist es einfacher zu handhaben. Der nächste Schritt ist die Anwendung des Jaccard-Ähnlichkeitsalgorithmus.

/**
     * [更据指定文章返回相似的文章推荐]
     * @param  $articleid 指定的文章ID
     * @param  $top       要返回的推荐条数
     * @return Array      推荐条目数组
     */
function getArticleRecommend($articleid, $top = 5){
        if($cache = CacheHelper::getCache()){
            return $cache;
        }
        try{
            $articleid = intval($articleid);
            $m = new TagMapModel();
            $all_tags = $m->getAllGroupByArticleId();//调用上面的函数返回所有文章的tags
            $finded = $all_tags[$articleid];//因为上面是包含所有文章了,所以肯定包含了当前文章。

            unset($all_tags[$articleid]);//把当前文章从数组中删除,不然自己和自己肯定是相似度最高了。

            $jaccard_arr = []; //用于存相似度
            foreach ($all_tags as $key => $value) {
                $intersect =array_intersect($finded, $value); //计算交集
                $union = array_unique(array_merge($finded, $value)); //计算并集

                $jaccard_arr[$key] = (float)(count($intersect) / count($union));
            }

            arsort($jaccard_arr); //按相似度排序,最相似的排最前面

            $jaccard_keys = array_keys($jaccard_arr);//由于数组的key就是文章id,所以这里把key取出来就可以了
            array_splice($jaccard_keys, $top);//获取前N条推荐

            //到这里我们就已经得到了,最相似N篇文章的ID了,接下去的工作就是通过这几个ID,从数据库里把相关信息,查询出来就可以了
    
            $articleModels = new \Api\Model\ArticleModel();
            $recommendArticles = $articleModels->getRecommendByTag($jaccard_keys);
            CacheHelper::setCache($recommendArticles, 604800); //缓存7天
            return $recommendArticles;
        } catch (\Exception $e) {
            throw new \Exception("获取推荐文章错误");
        }
    }
Nach dem Login kopieren

Verwandte Empfehlungen:

So implementieren Sie einfach die Funktion „Ähnliche Artikelempfehlung“ in PHP

Das obige ist der detaillierte Inhalt vonMethode zur Implementierung von Inhaltsempfehlungen basierend auf Tags (Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian

CakePHP-Projektkonfiguration CakePHP-Projektkonfiguration Sep 10, 2024 pm 05:25 PM

CakePHP-Projektkonfiguration

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

CakePHP Datum und Uhrzeit

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

CakePHP-Datei hochladen

CakePHP-Routing CakePHP-Routing Sep 10, 2024 pm 05:25 PM

CakePHP-Routing

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

Besprechen Sie CakePHP

So beheben Sie den Fehler „mysql_native_password nicht geladen' unter MySQL 8.4 So beheben Sie den Fehler „mysql_native_password nicht geladen' unter MySQL 8.4 Dec 09, 2024 am 11:42 AM

So beheben Sie den Fehler „mysql_native_password nicht geladen' unter MySQL 8.4

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein

See all articles