Элемент-элемент матрицы разреженных данных с рабочими пандами или csr_matrix - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь настроить матрицу элемент-элемент для системы совместной фильтрации.У меня есть система просмотра фильмов, поэтому я хочу матрицу, в которой столбцы - это фильмы (названия или идентификаторы), а строки - рецензенты.

Итак, я попытался повернуть кадр панд с этой информацией, и это сработало, нос небольшим количеством данных.У меня около 4500000 обзоров, и поворот панд не поддерживает столько данных.Итак, я изменил свой подход и попытался создать разреженную матрицу с помощью scipy.sparse csr_matrix.И проблема здесь в том, что мои идентификаторы фильмов и идентификаторы рецензентов являются строками, а рейтинги двойные, и я получаю ошибку, что Сципи пытался преобразовать эти значения в 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'])]

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())

Итак, я застрял и не знаю, как решить эту проблему.Панды находятся вне стола с поворотом, если нет другого решения с пандами, которого я не нашел.И матрица csr может работать, если есть способ, которым я могу связать рецензента 'X953D' или фильм с целым числом (которого я еще не нашел)

1 Ответ

0 голосов
/ 24 апреля 2019

Вы можете использовать словарь из двух слов, один для фильма, заголовок, один для рецензентов, использовать python dict для сохранения строки и возврата значения int. Это похоже на словарь для встраивания слов

...