我正在尝试为协作式过滤系统建立一个项目-项目矩阵。我有一个电影评论系统,所以我想要一个矩阵,其中列是电影(标题或ID),行是评论者。
因此,我尝试使用这些信息来旋转熊猫框架,并且该框架可以工作,但是数据很少。我有大约450万条评论,而枢轴旋转的熊猫不支持那么多数据。因此,我改变了方法,尝试使用scipy.sparse csr_matrix创建一个稀疏矩阵。而且这里的问题是我的电影ID和审阅者ID是字符串,并且收视率是两倍,并且我得到了scipy尝试将这些值转换为int的错误。
熊猫方法: 总体上是评论者给出的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'])]
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())
csr矩阵方法:
doc.acceptance_letter = ''
所以,现在我被困住了,我不知道如何解决这个问题。大熊猫可以绕轴旋转,除非我没有找到其他解决办法。如果有一种方法可以将“ X953D”审阅者或电影与一个int编号(我尚未发现)相关联,则csr矩阵可以工作
答案 0 :(得分:0)
您可以使用两个单词的词典,一个用于电影标题,一个用于评论者id,使用python dict保存字符串并返回int值。它类似于单词嵌入词典
答案 1 :(得分:0)
请查看此post(如果问题仍然是最新的)。基本上,不需要进行到np.array的转换。您所需要做的就是
row = reviews.reviewerID.astype(pd.api.types.CategoricalDtype(categories = reviews_u)).cat.codes