[PYTHON] [Recommandation] Résumé des avantages et des inconvénients de la méthode de filtrage / mise en œuvre basée sur le contenu et coopérative

Il s'agit d'un mémo d'apprentissage qui résume les avantages, les inconvénients et les méthodes de mise en œuvre de chacun des filtrages coopératifs et basés sur le contenu (basés sur le contenu) de l'algorithme recommandé. J'ai déjà développé le moteur de recommandation de filtrage coopératif, je voudrais donc développer un moteur de recommandation basé sur le contenu. (・ ㅂ ・) و

Avantages et inconvénients du filtrage basé sur le contenu et du co-filtrage

■ Liste des forces et faiblesses

Classification Filtrage coopératif Base de contenu
La diversité o x
Connaissance du domaine o x
Problème de démarrage x
nombre d'utilisateurs x o
Couverture x o
Objets similaires x o
Un petit nombre d'utilisateurs x o

Description de l'algorithme

■ Qu'est-ce que le filtrage coopératif? C'est une méthode à recommander en fonction de l'historique des actions de l'utilisateur de l'élément. La fonction "Les personnes qui ont acheté ce produit ont également ce produit" d'Amazon est célèbre. La recommandation par co-filtrage est une méthode de recommandation basée sur le comportement de l'utilisateur.

■ Qu'est-ce que le filtrage basé sur le contenu (basé sur le contenu)? C'est une méthode pour trier et recommander la similitude par le vecteur de caractéristique de l'élément. Ceci s'applique lorsque les boutiques associées au mot-clé "Shinjuku / Cuisine ethnique" saisi par l'utilisateur sur le site gastronomique sont affichées. Les recommandations basées sur le contenu sont une méthode pour faire des recommandations basées sur les caractéristiques de l'élément.

À propos des détails des caractéristiques

■ Diversité Collaboration: o Basé sur le contenu: x Les informations qui ne sont pas décrites dans le contenu du produit ne sont pas recommandées sur la base du contenu, mais le co-filtrage recommande des informations via d'autres utilisateurs, vous pouvez donc recommander des informations que vous ne connaissez pas.

■ Connaissance du domaine Collaboration: o Basé sur le contenu: x Le filtrage coopératif vous permet de faire des recommandations à travers l'historique du comportement des autres utilisateurs sans aucune information ou connaissance de l'élément cible. D'un autre côté, la conception basée sur le contenu est essentielle pour convertir les caractéristiques des éléments en vecteurs de caractéristiques.

■ Problème de démarrage Coopération: x Base de contenu: △ Le filtrage coopératif ne peut pas être utilisé dans des situations où il n'y a pas d'autres utilisateurs dans le nouveau système ou lorsqu'il est difficile d'obtenir un profil d'utilisateur. Sur la base du contenu, il est possible de faire des recommandations même dans des situations où il n'est pas possible d'obtenir un profil d'utilisateur tant que les caractéristiques de l'article peuvent être obtenues.

■ Nombre d'utilisateurs Coopération: x Base de contenu: o Le co-filtrage ne vous permet pas de noter des éléments que personne n'a encore évalués. En revanche, sur la base du contenu, des recommandations peuvent être faites en fonction des caractéristiques même s'il n'y a pas d'utilisateurs.

■ Couverture Coopération: x Base de contenu: o Comme pour le nombre d'utilisateurs, le co-filtrage ne peut pas évaluer les éléments que personne n'a encore évalués, il n'est donc pas possible de faire des recommandations pour tous les produits.

■ Articles similaires Coopération: x Base de contenu: o Le filtrage coopératif qui ne tient pas du tout compte des caractéristiques des articles ne peut pas distinguer, par exemple, différentes couleurs de tasses. Vous pouvez éviter le problème des couleurs différentes en coupant les éléments qui sont trop similaires sur la base du contenu.

■ Utilisateurs minoritaires Coopération: x Base de contenu: o Sur une base collaborative, si le nombre d'utilisateurs d'un élément particulier est extrêmement faible, des éléments similaires ne peuvent pas être prédits et ne peuvent pas être recommandés. Sur la base du contenu, vous pouvez faire des recommandations en fonction des caractéristiques de l'élément.

Méthode de calcul de la similarité de filtrage basée sur le contenu

Une fois que les caractéristiques de l'élément sont extraites et vectorisées, la similitude peut être calculée par similarité cosinus. Si vous calculez la similitude entre les produits X et les produits A-F et que vous les triez, vous pouvez faire des recommandations par filtrage basé sur le contenu.

cosine.png Réimprimé: Implémentation des cinq mesures de similarité les plus populaires en python

CosineSimilarity


# -*- coding: utf-8 -*-
from math import sqrt


def similarity(tfidf1, tfidf2):
    """
    Get Cosine Similarity
    cosθ =UN B/|A||B|
    :param tfidf1: list[list[str, float]]
    :param tfidf2: list[list[str, float]]
    :rtype : float
    """
    tfidf2_dict = {key: value for key, value in tfidf2}

    ab = 0  #UN B
    for key, value in tfidf1:
        value2 = tfidf2_dict.get(key)
        if value2:
            ab += float(value * value2)

    # |A| and |B|
    a = sqrt(sum([v ** 2 for k, v in tfidf1]))
    b = sqrt(sum([v ** 2 for k, v in tfidf2]))

    return float(ab / (a * b))

Comment mettre en œuvre le filtrage basé sur le contenu

[J'y vais maintenant](https://ja.wikipedia.org/wiki/%E4%BB%8A%E3%81%84%E3%81%8F%E3%82%88%E3%83%BB % E3% 81% 8F% E3% 82% 8B% E3% 82% 88) Maître et [Korokoro Chiki Chiki Peppers](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83% AD% E3% 82% B3% E3% 83% AD% E3% 83% 81% E3% 82% AD% E3% 83% 81% E3% 82% AD% E3% 83% 9A% E3% 83% 83% E3% 83% 91% E3% 83% BC% E3% 82% BA) analyse morphologique a été effectuée pour extraire la nomenclature, et le nombre de nomenclature fréquente / nombre total de nomenclature a été utilisé comme vecteur de caractéristiques. Cette méthode s'appelle TF-IDF.

# -*- coding: utf-8 -*-
from math import sqrt


def similarity(tfidf1, tfidf2):
    """
    Get Cosine Similarity
    cosθ =UN B/|A||B|
    :param tfidf1: list[list[str, float]]
    :param tfidf2: list[list[str, float]]
    :rtype : float
    """
    tfidf2_dict = {key: value for key, value in tfidf2}

    ab = 0  #UN B
    for key, value in tfidf1:
        value2 = tfidf2_dict.get(key)
        if value2:
            ab += float(value * value2)

    # |A| and |B|
    a = sqrt(sum([v ** 2 for k, v in tfidf1]))
    b = sqrt(sum([v ** 2 for k, v in tfidf2]))

    return float(ab / (a * b))

#Je pars maintenant, Kuruyo Master
ikuyo_kuruyo = [
    ['Kyoto', 0.131578947369],
    ['Mansai', 0.122807017544],
    ['la comédie', 0.122807017544],
    ['radio', 0.105263157894],
    ['Yoshimoto Kogyo', 0.09649122807],
    ['Artiste', 0.09649122807],
    ['j'y vais', 0.0701754385966],
    ['combinaison', 0.0701754385966],
    ['Osaka', 0.0526315789474],
    ['Maître', 0.0438596491229],
    ['Vers le haut', 0.0438596491229],
    ['Kao', 0.0438596491229],
]


#Korochiki
chikichiki = [
    ['la comédie', 0.169014084507],
    ['Nishino', 0.12676056338],
    ['Osaka', 0.112676056338],
    ['Nadal', 0.0845070422536],
    ['combinaison', 0.0845070422536],
    ['Gagnant', 0.0704225352114],
    ['Piments Korokoro Chiki Chiki', 0.0704225352114],
    ['Neta', 0.0704225352114],
    ['Artiste', 0.056338028169],
    ['Yoshimoto Kogyo', 0.056338028169],
    ['Mansai', 0.056338028169],
    ['Roi de Conte', 0.0422535211267],
]

#Calcul de la similitude
print similarity(ikuyo_kuruyo, chikichiki)

"""
>>>Résultat d'exécution
0.521405857242
"""

Avantages de la mise en œuvre du filtrage basé sur le contenu avec la similarité cosinus

Si vous implémentez un filtrage basé sur le contenu avec des vecteurs d'entités, vous pouvez facilement le refléter en ajoutant un vecteur lorsque vous souhaitez modifier la pondération, ce qui permet un fonctionnement flexible. Par exemple, ajoutons 20% de la fonctionnalité "DVD" pour augmenter la similitude.


#Je pars maintenant, Kuruyo Master
ikuyo_kuruyo = [
    ['DVD', 0.2],
    ['Kyoto', 0.131578947369],
    ['Mansai', 0.122807017544],
...
]


#Korochiki
chikichiki = [
    ['DVD', 0.2],
    ['la comédie', 0.169014084507],
    ['Nishino', 0.12676056338],
...
]

#Calcul de la similitude
print similarity(ikuyo_kuruyo, chikichiki)

"""
>>>Résultat d'exécution
0.661462974013
"""

Il y a une bibliothèque

PyPi a publié une bibliothèque simple_tfidf_japanese qui calcule le nombre de nomen avec la fonction TF-IDF qui analyse morphologiquement les phrases sur le Web et calcule la similarité cosinus. .. Étant donné que l'implémentation fait 142 lignes, vous pouvez lire le Code source en peu de temps.

simple_tfidf_Mis en œuvre avec le japonais


# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
from simple_tfidf_japanese.tfidf import TFIDF

ikuyo_wikipedia_url = 'https://ja.wikipedia.org/wiki/%E4%BB%8A%E3%81%84%E3%81%8F%E3%82%88%E3%83%BB%E3%81%8F%E3%82%8B%E3%82%88'
korochiki_wikipedia_url = 'https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AD%E3%82%B3%E3%83%AD%E3%83%81%E3%82%AD%E3%83%81%E3%82%AD%E3%83%9A%E3%83%83%E3%83%91%E3%83%BC%E3%82%BA'
ikuyo_tfidf = TFIDF.gen_web(ikuyo_wikipedia_url)
chiki_tfidf = TFIDF.gen_web(korochiki_wikipedia_url)

#Calcul de similarité
print TFIDF.similarity(ikuyo_tfidf, chiki_tfidf)

Méthode de calcul de similarité et méthode de mise en œuvre du co-filtrage

Il existe plusieurs façons de calculer la similitude du co-filtrage. Cette fois, je présenterai un exemple d'utilisation de la cooccurrence et de l'indice de Jackard.

■ Exemples de données 48141a77-bff7-cac8-fea7-c6b6333cbe3e.png

■ Coop Calculé en fonction du nombre d'autres produits achetés par le client ayant acheté le produit X. Il est moins précis que l'indice Jackard, mais il est facile à calculer. Par exemple, si vous calculez la valeur de co-occurrence du produit X et du produit A, la valeur de co-occurrence est "1" car seul le client E achète les deux produits. La particularité est que le temps de calcul est un peu court.

■ Comment calculer l'indice Jackard

スクリーンショット 2015-11-12 18.12.15.png

Calculez le nombre par co-occurrence et jacking


# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals
from collections import defaultdict


def jaccard(e1, e2):
    """
Calculer l'indice Jackard
    :param e1: list of int
    :param e2: list of int
    :rtype: float
    """
    set_e1 = set(e1)
    set_e2 = set(e2)
    return float(len(set_e1 & set_e2)) / float(len(set_e1 | set_e2))

#Le numéro client ayant acheté le produit X est 1,3,5
product_x = [1, 3, 5]
product_a = [2, 4, 5]
product_b = [1, 2, 3]
product_c = [2, 3, 4, 7]
product_d = [3]
product_e = [4, 6, 7]

#Données du produit
products = {
    'A': product_a,
    'B': product_b,
    'C': product_c,
    'D': product_d,
    'E': product_e,
}

#Calculer la valeur de cooccurrence avec X
print "Coopérative"
r = defaultdict(int)

for key in products:
    overlap = list(set(product_x) & set(products[key]))
    r[key] = len(overlap)
print r

#Calculer l'indice Jackard avec X
print "Indice Jackard"
r2 = defaultdict(float)
for key in products:
    r2[key] = jaccard(product_x, products[key])
print r2

Résultat d'exécution


"""
>>> python cf.py
Coopérative
defaultdict(<type 'int'>, {u'A': 1, u'C': 1, u'B': 2, u'E': 0, u'D': 1})
Indice Jackard
defaultdict(<type 'float'>, {u'A': 0.2, u'C': 0.16666666666666666, u'B': 0.5, u'E': 0.0, u'D': 0.3333333333333333})
"""


■ Résumé des résultats Par rapport à la cooccurrence, l'indice Jackard peut calculer la similitude entre le produit X et les produits A, C et D plus en détail. Le coût de calcul est élevé en conséquence. スクリーンショット 2015-11-12 18.48.21.png

référence

Algorithme du système de recommandation J'ai implémenté le filtrage coopératif (recommandation) avec redis et python

Recommended Posts

[Recommandation] Résumé des avantages et des inconvénients de la méthode de filtrage / mise en œuvre basée sur le contenu et coopérative
[Recommandation] Filtrage basé sur le contenu et filtrage coopératif
Mise en œuvre et expérience de la méthode de clustering convexe
Avantages et inconvénients de la méthode d'estimation la plus probable
Recommandation de film utilisant le co-filtrage de Spark MLlib
J'ai essayé de mettre en œuvre le co-filtrage (recommandation) avec redis et python
Résumé de la méthode d'essai
[Deep Learning from scratch] Implémentation de la méthode Momentum et de la méthode AdaGrad
Vérification et mise en œuvre de la méthode de reconstruction vidéo en utilisant GRU et Autoencoder
Explication et mise en œuvre de SocialFoceModel
[Recommandation] Filtrage basé sur le contenu et filtrage coopératif
Implémentation de la méthode de gradient 1
Résumé de l'implémentation de la coroutine empilée
Résumé de la méthode d'essai
Résumé de l'implémentation de l'interpréteur 7 lignes
Résumé de la méthode du noyau de Kaggle [Image]
[Recommandation] Résumé des avantages et des inconvénients de la méthode de filtrage / mise en œuvre basée sur le contenu et coopérative
[Linux] [C / C ++] Résumé de la méthode d'acquisition des traces
Résumé de l'implémentation de base par PyTorch
Implémentation Einsum de la méthode d'itération de valeur
Résumé de l'implémentation de scratch 1D-CNN, 2D-CNN par Pytorch
Introduction à la détection des anomalies et résumé des méthodes
[Python] Implémentation de la méthode Nelder – Mead et sauvegarde des images GIF par matplotlib
Résumé des avantages (inconvénients) lors du passage de CUnit à Google Test
Explication et mise en œuvre de PRML Chapitre 4
Introduction et mise en œuvre de JoCoR-Loss (CVPR2020)
Explication et implémentation de l'algorithme ESIM
Introduction et mise en œuvre de la fonction d'activation
Résumé de l'implémentation de base par PyTorch
Implémentation Einsum de la méthode d'itération de valeur
Explication et mise en œuvre du perceptron simple
Introduction à la détection des anomalies et résumé des méthodes