数值和文本值组合之间的余弦相似度

Cosine similarity between a combination of numerical and text values

我正尝试在 Yelp 数据集上使用有关餐馆的数据做一个简单的基于内容的过滤模型。
我有一个这种格式的 DataFrame

>>> business_df.dtypes
address          object
attributes       object
business_id      object
categories       object
city             object
hours            object
is_open          object
latitude        float64
longitude       float64
name             object
postal_code      object
review_count      int64
stars           float64
state            object

现在我正在尝试构建一个基于内容的协同过滤模型,我正在回答“给定一家餐厅,推荐类似的餐厅”这个问题

我正在尝试在此处实现 Content-Based Recommender 下给出的模型 - https://www.datacamp.com/community/tutorials/recommender-systems-python

基本上,他们使用一些文本字段来构建计数向量矩阵,然后对行进行余弦相似度计算以获得电影之间的相似度。

他们后来说

Introduce a popularity filter: this recommender would take the 30 most similar movies, calculate the weighted ratings (using the IMDB formula from above), sort movies based on this rating, and return the top 10 movies.

我正在尝试使用类别、属性、纬度和经度(用于距离)、星级和评论计数(根据评论计数加权的星级 - 评论数量越多,星级的权重越高)来构建类似型号。

但我不知道如何将数字列合并到此处的模型中。我确定我无法将数字列传递到计数向量化器中。

我可以构建 2 个模型 -- 1 个带有文本字段,另一个通过简单地计算数字列之间的余弦相似度(或 Pearson 相关性)来构建 - 并将这 2 个模型组合起来吗?如果是,我该怎么做?

或者我可以遵循 Data camp 模型并在模型中创建文本字段,然后使用公式来合并评级吗?如果是,我仍然无法根据经纬度

做距离

让我们假设 CountVectorizer 为您提供形状为 (N, m) 的矩阵 C,其中 N = 餐厅数量,m = 特征数量(此处字数)。

既然你想添加数值特征,假设你有k这样的特征。您可以简单地为每部电影计算这些特征并将它们连接到矩阵 C。因此,对于现在的每部电影,您将拥有 (m+k) 个功能。 C 的形状现在将变为 (N, m+k)。您可以使用 pandas 来连接。

现在您可以使用此矩阵简单地计算余弦相似度,这样您就可以同时考虑文本特征和数字特征

但是,我强烈建议您对这些值进行归一化,因为某些数值特征可能具有较大的量级,这可能会导致结果不佳。此外,代替 CountVectorizer,TFIDF 矩阵甚至词嵌入可能会给您带来更好的结果