python - 使用 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 矩阵可以工作
解决方案
请看这篇文章(如果问题仍然是最新的)。基本上,不需要转换为 np.array。你需要做的就是
row = reviews.reviewerID.astype(pd.api.types.CategoricalDtype(categories = reviews_u)).cat.codes
推荐阅读
- c++ - 列表循环检测
- r - R中的一个人如何在矩阵上应用带有“if”语句的“for”函数来创建平滑函数
- python - 如何在流式查询中使用 MLlib 模型(因“字段“功能”不存在而失败。”)?
- sql - 在 BigQuery 中按数组的第一个元素分组
- django - Django 2:如何在应用程序初始化时运行一次代码?
- java - 在 javax Validator 中使用 @Value
- casting - 从 CArchive 读取 WORD 变量并同时转换为 int
- python-3.x - 如何从图像中提取背景图像和文本
- windows - 如何在 Select-Object 中选择名称/值对?
- shell - 如何在 ant build.xml 中将 linux 机器完全限定的主机名设置为环境变量