Skip to content

Latest commit

 

History

History
169 lines (109 loc) · 8.87 KB

building-a-recommendation-system-with-hugging-face-transformers.md

File metadata and controls

169 lines (109 loc) · 8.87 KB

使用 Hugging Face Transformers 构建推荐系统

原文:www.kdnuggets.com/building-a-recommendation-system-with-hugging-face-transformers

使用 Hugging Face Transformers 构建推荐系统

图像由 jcomp 提供,来源于 Freepik

在现代时代,我们依赖手机和计算机上的软件。许多应用程序,如电子商务、电影流媒体、游戏平台等,改变了我们的生活,因为这些应用程序使事情变得更加简单。为了更进一步,企业通常会提供能够根据数据进行推荐的功能。


我们的前三个课程推荐

1. Google 网络安全证书 - 快速进入网络安全职业生涯。

2. Google 数据分析专业证书 - 提升您的数据分析技能

3. Google IT 支持专业证书 - 支持您组织的 IT


推荐系统的基础是根据输入预测用户可能感兴趣的内容。系统将根据项目之间的相似性(基于内容的过滤)或行为(协作过滤)提供最接近的项目。

有许多推荐系统架构的方法,我们可以使用Hugging Face Transformers包。如果你不知道,Hugging Face Transformers 是一个开源的 Python 包,允许 API 轻松访问所有支持文本处理、生成等任务的预训练 NLP 模型。

本文将使用 Hugging Face Transformers 包基于嵌入相似度开发一个简单的推荐系统。让我们开始吧。

使用 Hugging Face Transformers 开发推荐系统

在开始教程之前,我们需要安装所需的包。为此,您可以使用以下code

pip install transformers torch pandas scikit-learn

您可以通过他们的网站选择适合您环境的版本进行Torch安装。

至于数据集示例,我们将使用来自Kaggle的动漫推荐数据集示例。

一旦环境和数据集准备好,我们将开始教程。首先,我们需要读取数据集并进行准备。

import pandas as pd

df = pd.read_csv('anime.csv')

df = df.dropna()
df['description'] = df['name'] +' '+ df['genre'] + ' ' +df['type']+' episodes: '+ df['episodes']

在上述代码中,我们使用 Pandas 读取数据集并删除了所有缺失的数据。然后,我们创建了一个名为“description”的特征,其中包含了可用数据中的所有信息,如名称、类型、类别和集数。这个新列将成为我们推荐系统的基础。如果能有更完整的信息,例如动漫情节和概要,会更好,但我们暂时就用这个吧。

接下来,我们将使用 Hugging Face Transformers 加载嵌入模型并将文本转换为数值向量。具体来说,我们将使用句子嵌入来转换整个句子。

推荐系统将基于我们将要执行的所有动漫“描述”的嵌入。我们将使用余弦相似度方法,它衡量两个向量的相似度。通过测量动漫“描述”嵌入与用户查询输入嵌入之间的相似度,我们可以获得精准的推荐项目。

嵌入相似度方法听起来简单,但与经典的推荐系统模型相比,它可能更为强大,因为它能够捕捉词语之间的语义关系,为推荐过程提供上下文意义。

在本教程中,我们将使用 Hugging Face 的嵌入模型句子变换器。为了将句子转换为嵌入,我们将使用以下代码。

from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F

def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output[0] #First element of model_output contains all token embeddings
    input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)

tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/all-MiniLM-L6-v2')
model = AutoModel.from_pretrained('sentence-transformers/all-MiniLM-L6-v2')

def get_embeddings(sentences):
  encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')

  with torch.no_grad():
      model_output = model(**encoded_input)

  sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask'])

  sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1)

  return sentence_embeddings

尝试嵌入过程,并用以下代码查看向量结果。不过,我不会展示输出,因为它相当长。

sentences = ['Some great movie', 'Another funny movie']
result = get_embeddings(sentences)
print("Sentence embeddings:")
print(result)

为了简化操作,Hugging Face 维护了一个用于嵌入句子变换器的 Python 包,这将把整个转换过程缩减到 3 行代码。请使用以下代码安装必要的包。

pip install -U sentence-transformers

然后,我们可以用以下代码将整个动漫“描述”转换为嵌入。

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')

anime_embeddings = model.encode(df['description'].tolist())

当嵌入数据库准备好后,我们会创建一个函数来接收用户输入并执行余弦相似度,以作为推荐系统。

from sklearn.metrics.pairwise import cosine_similarity

def get_recommendations(query, embeddings, df, top_n=5):
    query_embedding = model.encode([query])
    similarities = cosine_similarity(query_embedding, embeddings)
    top_indices = similarities[0].argsort()[-top_n:][::-1]
    return df.iloc[top_indices]

现在一切准备就绪,我们可以尝试推荐系统。以下是从用户输入查询中获取前五个动漫推荐的示例。

query = "Funny anime I can watch with friends"
recommendations = get_recommendations(query, anime_embeddings, df)
print(recommendations[['name', 'genre']])
Output>>
                                         name  \
7363  Sentou Yousei Shoujo Tasukete! Mave-chan   
8140            Anime TV de Hakken! Tamagotchi   
4294      SKET Dance: SD Character Flash Anime   
1061                        Isshuukan Friends.   
2850                       Oshiete! Galko-chan   

                                             genre  
7363  Comedy, Parody, Sci-Fi, Shounen, Super Power  
8140          Comedy, Fantasy, Kids, Slice of Life  
4294                       Comedy, School, Shounen  
1061        Comedy, School, Shounen, Slice of Life  
2850                 Comedy, School, Slice of Life 

结果是所有的喜剧动漫,因为我们想要搞笑的动漫。它们大多数也包括了适合与朋友一起观看的类型。当然,如果我们有更详细的信息,推荐会更好。

结论

推荐系统是一种根据输入预测用户可能感兴趣内容的工具。使用 Hugging Face Transformers,我们可以构建一个利用嵌入和余弦相似度方法的推荐系统。嵌入方法非常强大,因为它能够考虑文本的语义关系和上下文意义。

Cornellius Yudha Wijaya**** 是一名数据科学助理经理和数据撰稿人。在全职工作于 Allianz Indonesia 的同时,他喜欢通过社交媒体和写作媒体分享 Python 和数据的技巧。Cornellius 在各种 AI 和机器学习主题上进行撰写。

更多相关主题