首先,我没有背景,我是这种科学的新手。
这是我的问题。我有一个带有读者评论的书籍清单(假设用户可以给这些书籍加1到5颗星)。
现在,根据评论,我想将书籍从最好到最坏进行排序,但是对评论进行平均似乎是错误的,因为单篇评论为5星的书会比一本书更好有4星和5星的许多评论。
我在这里有什么选择,是否有任何特定于python的库来完成?
谢谢!
答案 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条,但是稍后在显示评论时会使用没有假条目的“真实”平均评分。