首页 > 解决方案 > 使用 pandas 或 csr_matrix 工作的项-项矩阵稀疏数据

问题描述

我正在尝试为协作过滤系统设置一个项目-项目矩阵。我有一个电影评论系统,所以我想要一个矩阵,其中列是电影(标题或 ID),行是评论者。

因此,我尝试使用这些信息旋转一个 pandas 框架,它可以工作,但数据很少。我有大约 4500000 条评论,而 pandas 旋转不支持那么多数据。因此,我改变了方法并尝试使用 scipy.sparse csr_matrix 创建一个稀疏矩阵。这里的问题是我的电影 id 和评论者 id 是字符串,并且收视率是双倍的,我收到一个错误,scipy 尝试将这些值转换为 int。

pandas方法:总体是审稿人给的5星评价

import pandas as pd 
import numpy as np

reviews = pd.read_json('reviews_Movies_and_TV.json', lines=True)
reviews = reviews[pd.notnull(reviews['reviewText'])]

movie_titles = pd.read_json('meta_Movies.json', lines=True)
reviews = pd.merge(reviews, movie_titles, on='asin')

ratings = pd.DataFrame(reviews.groupby('title')['overall'].mean())
ratings['number_of_ratings'] = reviews.groupby('title')['overall'].count()

movie_matrix = reviews.pivot_table(index='reviewerID', columns='title', values='overall').fillna(0)

csr矩阵方法:

import pandas as pd 
import numpy as np

reviews = pd.read_json('reviews_Movies_and_TV.json', lines=True)
reviews = reviews[pd.notnull(reviews['reviewText'])]
reviews = reviews.filter(['reviewerID', 'asin', 'overall'])

movie_titles = pd.read_json('meta_Movies_and_TV.json', lines=True)
movie_titles = movie_titles.filter(['asin', 'title'])
reviews = pd.merge(reviews, movie_titles, on='asin')

ratings = pd.DataFrame(reviews.groupby('title')['overall'].mean())
ratings['number_of_ratings'] = reviews.groupby('title')['overall'].count()

reviews_u = list(reviews.reviewerID.unique())
movie_titles_u = list(reviews.asin.unique())

data = np.array(reviews['overall'].tolist(),copy=False)
row = np.array(pd.Series(reviews.reviewerID).astype(pd.api.types.CategoricalDtype(categories = reviews_u)),copy=False)
col = np.array(pd.Series(reviews.asin).astype(pd.api.types.CategoricalDtype(categories = movie_titles_u)),copy=False)
sparse_matrix = csr_matrix((data, (row, col)), shape=(len(reviews_u), len(movie_titles_u)))

df = pd.DataFrame(sparse_matrix.toarray())

所以,现在我被卡住了,我不知道如何解决这个问题。除非我还没有找到其他的熊猫解决方案,否则熊猫不在桌面上。如果有一种方法可以将“X953D”评论者或电影与 int 编号相关联(我还没有找到),那么 csr 矩阵可以工作

标签: pythonpandasmachine-learningscipysparse-matrix

解决方案


请看这篇文章(如果问题仍然是最新的)。基本上,不需要转换为 np.array。你需要做的就是

row = reviews.reviewerID.astype(pd.api.types.CategoricalDtype(categories = reviews_u)).cat.codes


推荐阅读