如何按评论而不是按平均评论对书进行排序?

时间:2020-04-27 14:36:16

标签: python sorting

首先,我没有背景,我是这种科学的新手。

这是我的问题。我有一个带有读者评论的书籍清单(假设用户可以给这些书籍加1到5颗星)。

现在,根据评论,我想将书籍从最好到最坏进行排序,但是对评论进行平均似乎是错误的,因为单篇评论为5星的书会比一本书更好有4星和5星的许多评论。

我在这里有什么选择,是否有任何特定于python的库来完成?

谢谢!

2 个答案:

答案 0 :(得分:1)

除了一般的客户评论之外,您还可以使用“最受欢迎”的更抽象的选择?亚马逊通过“亚马逊之选”解决了您所描述的问题,即人们必须假定该商品是平均评价最好并且销售了很多产品的商品

一种查看方法是考虑某物有多少“点”,以及它有多少得分机会。如果一项已被评论十次,并且最高分是5,则它有机会获得50分。您可以通过这种方式设置一个阈值,也就是说,只有那些必须有机会得分的项目,例如“最受欢迎”排序方法中包含100点。对于最终用户来说,这可能是一个抽象的概念,毕竟我们不知道为什么会是“亚马逊的精选商品”,但是当您使用他们的网站时,这似乎是有道理的。

就此编码而言,最简单的方法是仅以“最受欢迎”的排序方式包括至少x条评论的图书

答案 1 :(得分:0)

这是一个使用“伪评论”(如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()调用会在致电mean()之前添加3条虚假的3星级评论,目的是将带有少量评论的书籍偏向3条,但是稍后在显示评论时会使用没有假条目的“真实”平均评分。