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. (・ ㅂ ・) و
■ 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 |
■ 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.
■ 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.
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.
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))
[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
"""
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
"""
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)
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
■ 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
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.
Algorithme du système de recommandation J'ai implémenté le filtrage coopératif (recommandation) avec redis et python
Recommended Posts