Поведение пользователей при тегировании — это форма текущего контента, созданного пользователями, и оно также используется в качестве функции в текущем сценарии рекомендаций.В то же время тегирование пользователей — это также абстрактная форма портретов пользователей, что очень полезно. Для системы маркировки на ее основе будет рекомендательный алгоритм. В этой статье будут рассмотрены алгоритмы рекомендаций на основе тегов: SimpleTagBased, NormalTagBased и TagBased-TFIDF.
1. Роль системы маркировки
Шиладс Виланд Сен из GroupLen провел исследование по тегированию анкет в системе рекомендаций фильмов MoveLens. Результаты показывают, что пользователи получают следующую обратную связь при пометке фильмов:
- выражать: Система тегов помогает мне выразить свое мнение о товаре. (30% пользователей согласны.)
- организация: теги помогают мне систематизировать мои любимые фильмы. (23% пользователей согласны.)
- учиться: Маркировка помогла мне лучше понять фильм. (27% пользователей согласны.)
- Находить: система тегов упрощает поиск моих любимых фильмов. (19% пользователей согласны.)
- принятие решения: система тегов помогает мне решить, стоит ли смотреть определенный фильм. (14% пользователей согласны.)
Мотивация для тегов
Зимой, когда пользователи отмечают, это можно обсуждать с двух сторон. Во-первых, это социальный аспект.Некоторые пользовательские аннотации используются теми, кто загружает контент (чтобы помочь загрузчику организовать свою собственную информацию), в то время как некоторые пользовательские аннотации используются большинством пользователей (чтобы помочь другим пользователям найти информацию). Другим измерением является функциональное измерение.Некоторые аннотации используются для лучшей организации контента и облегчения поиска пользователями в будущем, в то время как другие аннотации используются для передачи определенной информации, например, когда и где была сделана фотография.
как пользователи отмечают
В Интернете, хотя поведение каждого пользователя кажется случайным, за этим, казалось бы, случайным поведением стоит множество законов. Распределения активности пользователей и популярности элементов в наборе данных о поведении пользователей следуют распределению с длинным хвостом (распределение по степенному закону). Поэтому сначала смотрим на распределение популярности хэштегов. Тег, который мы определяем, используется пользователем в элементе, и его популярность увеличивается на единицу.
содержание этикетки
Когда пользователь видит элемент, мы надеемся, что тег, который он будет использовать, является ключевым словом, которое может точно описать содержание и атрибуты элемента, но пользователи часто не следуют нашим идеям, а могут маркировать элемент всевозможными странными метками. .
- указать, что это за предмет: Например, если это птица, будет метка со словом «птица», если это домашняя страница Douban, будет метка со словом «птица». Ярлык называется «Douban»; если это домашняя страница Джобса, будет ярлык «Вакансии».
- Укажите тип элемента: Например, в закладках Delicious теги, представляющие категорию веб-страницы, включают article (статья), blog (блог), book (книга) и т. д.
- Укажите, кому принадлежит предмет: например, теги многих блогов будут включать такую информацию, как автор блога.
- выражать мнение пользователя: например, если пользователь считает веб-страницу интересной, он назовет ее смешной и посчитает скучной. Будет отмечен меткой скучно (скучно).
- Теги, связанные с пользователем: например, мой любимый (мой любимый), мой комментарий (мой комментарий) и т. д.
- Задача пользователя: например, читать (чтение о том, что будет прочитано), поиск работы (найти работу) и т. д.
Рекомендуемые теги для пользователей
когда пользователь u дает элементРекомендации и предметы могут быть даны пользователям при пометкеСвязанные теги, как показано ниже:
- Способ 1: ПользователюРекомендовать самые популярные теги в системе
- Способ 2: ПользователюСамые популярные теги на рекомендуемых товарах i
- Способ 3: ПользователюРекомендует свои часто используемые теги
- Взвешенное слияние методов 2 и 3 для получения окончательного результата рекомендации по этикетке
2. Алгоритм персонализированных рекомендаций на основе тегов
Набор данных о поведении пользователей, назначающих метки, обычно представлен набором троек, где запись (u, i, b) указывает, что пользователь u пометил элемент i меткой b. Конечно, реальные данные о поведении тега пользователя намного сложнее, чем данные, представленные тройками, такими как время тегирования пользователя, данные атрибутов пользователя и данные атрибутов элемента.
2.1 SimpleTagBased
- Подсчитайте общие теги для каждого пользователя
- Для каждого тега подсчитайте продукты, которые чаще всего встречались с этим тегом.
- Для конкретного пользователя найдите его наиболее часто используемые теги и порекомендуйте ему самые популярные элементы этих тегов.
- Сортировать рекомендацию
Формула ранжирования выглядит следующим образом:
впредставляет пользователяиспользуемые тегиколичество раз,Указывает на продуктбыл отмеченколичество раз.
2.2 NormTagBased
Этот алгоритм предназначен для нормализации оценки алгоритма SimpleTagBased:
2.3 TagBased-TFIDF
Если тег очень популярен, это приведет кбольшой, так что даже еслимало, это также приведет кОн очень большой, поэтому пользователям будут рекомендовать популярные элементы, тем самым уменьшая новизну рекомендуемых результатов. Кроме того, эта формула моделирует интересы пользователей с помощью вектора тегов пользователя, где каждый тег — это тег, который использовал пользователь, а вес тега — это количество раз, когда пользователь использовал тег. Недостатком этого метода моделирования является то, что он придает слишком большое значение популярным тегам, которые не могут отражать персонализированные интересы пользователей. Здесь мы можем извлечь уроки из идеи TF-IDF и улучшить эту формулу, используяУказывает на этикеткуИспользуется сколькими разными пользователями:
3. Практика алгоритма SimpleTagBased
Шаги алгоритма:
- Импортируйте набор данных и сохраните его в словаре в формате {user:{item:tag}}.
- Разделите тренировочный набор и тестовый набор;
- Подсчитайте оценку для пользователя 1. Оценка рассчитывается как n в {user1:{tag:n}} (то есть количество раз, когда пользователь использует тег n) и m в {tag:{item:m}} (т. е. элемент попал Умножьте число раз m) на метку, score=n*m, отсортируйте от большего к меньшему, возьмите topn;
- Используйте тестовый набор для оценки
#使用SimpleTagBased算法对Delicious数据集进行推荐
#原始数据集:https://grouplens.org/datasets/hetrec-2011/
# 数据格式:userID bookmarkID tagID timestamp
import pandas as pd
import warnings
import math
import random
import operator
warnings.filterwarnings('ignore')
file_path = 'user_taggedbookmarks-timestamps.dat'
#采用字典格式,保存user对item的tag,{user:{item1:[tag1,rag2]...}...}
records = {}
#训练集、测试集
train_data = {}
test_data = {}
#用户标签,商品标签
user_tags = dict()
user_items = dict()
tag_items = dict()
#数据加载
def load_data():
print('数据正在加载中...')
df = pd.read_csv(file_path,sep = '\t')
#将df放入设定的字典格式中
for i in range(len(df)):
#for i in range(10):
uid = df['userID'][i]
iid = df['bookmarkID'][i]
tag = df['tagID'][i]
#setdefault将uid设置为字典,iid设置为[]
records.setdefault(uid,{})
records[uid].setdefault(iid,[])
records[uid][iid].append(tag)
#print(records)
print('数据集大小为:%d.' %len(df))
print('设置tag的人数:%d.' %len(records))
print('数据加载完成\n')
#将数据集拆分为训练集及测试集,ratio为测试集划分比例
def train_test_split(ratio,seed = 100):
random.seed(seed)
for u in records.keys():
for i in records[u].keys():
#ratio为设置的比例
if random.random()<ratio:
test_data.setdefault(u,{})
test_data[u].setdefault(i,[])
for t in records[u][i]:
test_data[u][i].append(t)
else:
train_data.setdefault(u,{})
train_data[u].setdefault(i,[])
for t in records[u][i]:
train_data[u][i].append(t)
print("训练集user数为:%d,测试机user数为:%d." % (len(train_data),len(test_data)))
#设置矩阵mat[index,item],来储存index与item 的关系, = {index:{item:n}},n为样本个数
def addValueToMat(mat,index,item,value = 1):
if index not in mat:
mat.setdefault(index,{})
mat[index].setdefault(item,value)
else:
if item not in mat[index]:
mat[index].setdefault(item,value)
else:
mat[index][item] +=value
#使用训练集,初始化user_tags,user_items,tag_items,/user_tags为{user1:{tags1:n}}
#{user1:{tags2:n}}...{user2:{tags1:n}},{user2:{tags2:n}}....n为样本个数等
# user_items为{user1:{items1:n}}......原理同上
# tag_items为{tag1:{items1:n}}......原理同上
def initStat():
records = train_data
for u,items in records.items():
for i,tags in records[u].items():
for tag in tags:
#users和tag的关系矩阵
addValueToMat(user_tags,u,tag,1)
#users和item的关系
addValueToMat(user_items,u,i,1)
#tag和item的关系
addValueToMat(tag_items,tag,i,1)
print('user_tags,user_items,tag_items初始化完成.')
#对某一用户user进行topN推荐
def recommend(user,N):
recommend_item = dict()
tagged_items = user_items[user]
for tag,utn in user_tags[user].items():
for item,tin in tag_items[tag].items():
#如果某一user已经给某一item打过标签,则不推荐
if item in tagged_items:
continue
if item not in recommend_item:
recommend_item[item] = utn * tin
else:
recommend_item[item] = recommend_item[item]+utn*tin
#按value值,从大到小排序
return sorted(recommend_item.items(), key=operator.itemgetter(1), reverse=True)[0:N]
#使用测试集,计算准确率和召回率
def precisionAndRecall(N):
hit = 0
h_recall = 0
h_precision = 0
for user,items in test_data.items():
if user not in train_data:
continue
rank = recommend(user,N)
for item,rui in rank:
if item in items:
hit = hit+1
h_recall = h_recall +len(items)
h_precision = h_precision+N
#返回准确率和召回率
return (hit/(h_precision*1.0)), (hit/(h_recall*1.0))
#使用test_data对推荐结果进行评估
def testRecommend():
print('推荐结果评估如下:')
print("%3s %10s %10s" % ('N', "精确率", '召回率'))
for n in [5,10,20,40,60,80,100]:
precision,recall = precisionAndRecall(n)
print("%3d %10.3f%% %10.3f%%" % (n, precision * 100, recall * 100))
load_data()
train_test_split(0.2)
initStat()
testRecommend()