Heim >Datenbank >MySQL-Tutorial >Methode zur Implementierung von Inhaltsempfehlungen basierend auf Tags (Code)

Methode zur Implementierung von Inhaltsempfehlungen basierend auf Tags (Code)

不言
不言Original
2018-09-14 14:11:422478Durchsuche

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       |       |
+-------+------------+------+-----+---------+-------+

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    |       |
+-----------+------------+------+-----+---------+-------+

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 |
+----+-----------+-------+

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 |
+-----------+--------------------------+

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;

    }

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("获取推荐文章错误");
        }
    }

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!

Stellungnahme:
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