Как я могу отсортировать книги по обзору, но не по среднему обзору? - PullRequest
0 голосов
/ 27 апреля 2020

Прежде всего, у меня нет опыта, и я новичок в такой науке.

Вот моя проблема. У меня есть список книг с рецензиями читателей (скажем, пользователь может дать книгам от 1 до 5 звезд).

Теперь я хотел бы отсортировать книги от лучших к худшим, согласно рецензии, но усреднение рецензий кажется неправильным, потому что книга с одним обзором из 5 звезд будет считаться лучше, чем книга со многими рецензиями из 4 и 5 звезд.

Какие у меня варианты здесь и есть ли python специфицированные c библиотеки для этого?

Спасибо!

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

В отличие от среднего отзыва клиентов, у вас также может быть более абстрактная опция «самый популярный»? Amazon решает проблему, которую вы описываете, имея «выбор Amazon» для того, что нужно считать продуктом с лучшими средними отзывами и продав много единиц

Один из способов взглянуть на это - подумать о том, как сколько «очков» у чего-то есть, и сколько «очков» у него было возможности набрать. Если предмет был просмотрен десять раз, а максимальный балл был 5, то у него была возможность набрать 50 баллов. Таким образом, вы можете установить порог, чтобы сказать, что в метод сортировки для «самых популярных» включаются только те предметы, которые имели возможность набрать, например, 100 баллов. Это может быть абстрактным понятием для конечного пользователя, в конце концов, мы не знаем точно, почему что-то является «Amazon's Pick», но, кажется, имеет смысл использовать их веб-сайт.

С точки зрения кодирования этого, самый простой способ - включить в ваш «самый популярный» метод сортировки только те книги, которые имеют не менее x отзывов

0 голосов
/ 27 апреля 2020

Вот простой пример использования «псевдообзоров» (как описано в https://stats.stackexchange.com/questions/173683/sorting-products-by-reviews-considering-the-number-of-reviews) для сортировки списка:

from statistics import mean
from typing import List, NamedTuple


class Book(NamedTuple):
    title: str
    reviews: List[int]
    # other useful info might go here?


books = [
    Book("The Big Orange Splot", [5, 5]),
    Book("Lizard Music", [5, 5, 5, 5, 4, 5]),
    Book("Young Adult Novel", [2, 2, 5, 5, 5, 5, 5, 5]),
    Book("Fishwhistle", [4, 4, 5, 4, 5]),
    Book("The Davinci Code", [2, 2, 5, 2, 3, 4, 2, 1])
]

books.sort(
    key=lambda book: mean(book.reviews + [3, 3, 3]),
    reverse=True
)

for book in books:
    print(
        f"{book.title}: "
        f"{mean(book.reviews):.1f} stars "
        f"({len(book.reviews)} reviews)"
    )
Lizard Music: 4.8 stars (6 reviews)
Young Adult Novel: 4.2 stars (8 reviews)
Fishwhistle: 4.4 stars (5 reviews)
The Big Orange Splot: 5.0 stars (2 reviews)
The Davinci Code: 2.6 stars (8 reviews)

Обратите внимание, что sort() call добавляет 3 поддельных 3-звездочных отзыва перед тем, как позвонить mean() с целью перекосить книги с небольшим количеством отзывов к 3, но позже, когда мы отображаем отзывы, мы используем «реальный» средний рейтинг без поддельных записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...