Benature / WordReview

📚 背单词网页 Django + MySQL + Pug + JS
https://benature.github.io/WordReview/
GNU Lesser General Public License v3.0
576 stars 72 forks source link

list最後一個單詞點擊下一步之後 ,出現 '你怕是还没背过这个List' #36

Closed xuminxi closed 11 months ago

xuminxi commented 11 months ago

views.py

if rate == 0: status = 404 msg = '你怕是还没背过这个List' continue

似乎是計算準確率。但是理論上應該不會是零啊

Benature commented 11 months ago

可能需要看下你数据库中那个 List 的 rate 的值来看下什么情况?

https://github.com/Benature/WordReview/blob/6c09f06960cbe1f1f22791398593d93f4a65e1f7/WordReview/apps/review/views.py#L116-L118

https://github.com/Benature/WordReview/blob/6c09f06960cbe1f1f22791398593d93f4a65e1f7/WordReview/apps/review/models.py#L19-L20

xuminxi commented 11 months ago

这个应该是只要有一个单词被标记rate之后,rate的判断就不会为0吧。这个是review里面的数据,前100个不会出现这个问题,到第二个list就出现这个报错 1-200.txt

Benature commented 11 months ago

这个应该是只要有一个单词被标记rate之后,rate的判断就不会为0吧。

是的。那应该是第二个list的rate都是0,都还没背过?(没有一个单词点过「我记得」/「不认识」)

如果上述猜测不对,你可以考虑只select出第二个list的的单词来看看,或者不介意的话把sqlite3文件发给我看看?

xuminxi commented 11 months ago

感谢兄弟回复那么快,我上面的附件里面有review的text文件,筛选了0-200两个list的单词,如果需要完整的db文件再和我说,我从mysql里面导出来

Benature commented 11 months ago

到第二个list就出现这个报错

我看下,"第二个list" 指的是 LIST==1 的对吧

xuminxi commented 11 months ago

是的

Benature commented 11 months ago

我大概知道了,你应该是因为整个list都做了简单标记

试试把 view.py 中 rate 的计算换成下面的代码。如果没问题我就更新下代码

        # 背过的单词进度
        rate = (len([r[0] for r in ld.values_list('rate') if r[0] != -1]) +
                len(ld_pass)) / L_db.word_num
        rate = 1 - rate if rate != 0.0 else 0

https://github.com/Benature/WordReview/blob/6c09f06960cbe1f1f22791398593d93f4a65e1f7/WordReview/apps/review/views.py#L116-L118

Benature commented 11 months ago

点错了不好意思...

xuminxi commented 11 months ago

image 似乎还是不行。。

Benature commented 11 months ago

print下这几个看看什么情况

print(len(ld), len(ld_pass), rate)
xuminxi commented 11 months ago

最初的代码应该是没有问题的,当我改成第二版的时候第一个list也出现了问题。 初始代码: list0: 2 98 0.013334 list1: 0 100 0.0

新代码: list0: 0 100 0.0 list1: 0 100 0.0

Benature commented 11 months ago

哦... 试试换成这样

        # 背过的单词进度
        rate = (len([r[0] for r in ld.values_list('rate') if r[0] != -1]) +
                len(ld_pass)) / L_db.word_num
        print(len(ld), len(ld_pass), rate)
        if rate == 0:
            status = 404
            msg = '你好像还没背过这个 List 诶 😳'
            continue
        rate = 1 - rate if rate != 0.0 else 0
xuminxi commented 11 months ago

Hi bro, 问题在于 ld.values_list('rate') 这个set是空的,所以rate值总是空的 ld = Review.objects.filter( BOOK=BOOK, LIST=LIST, flaglt=1) 这里面的参数 flaglt=1 是什么意思呢,我看到LIST的输出是1应该没问题,book因为第一个list没问题,应该也ok

xuminxi commented 11 months ago

看命名规则似乎是less than的意思,逻辑也没问题,但是如果去掉这条filter问题就全部消失了。

Benature commented 11 months ago

lt 是 less than 的意思,查询的是flag小于1的值。flag是单词是否简单的标记。你的list应该是全部都标记简单了,所以 ld 是空的,但这样 ld_pass 肯定是不空的,所以我才改了 rate 的赋值。

Benature commented 11 months ago

哦... 试试换成这样

        # 背过的单词进度
        rate = (len([r[0] for r in ld.values_list('rate') if r[0] != -1]) +
                len(ld_pass)) / L_db.word_num
        print(len(ld), len(ld_pass), rate)
        if rate == 0:
            status = 404
            msg = '你好像还没背过这个 List 诶 😳'
            continue
        rate = 1 - rate if rate != 0.0 else 0

你试过这个没有呢

xuminxi commented 11 months ago

我懂了,可能是我第一遍把看过的单词都标记为掌握来区分是否看过(绿色圆点)?那么我考虑下次把不认识的标为重难。 新的也试过了,但是continue后面是不是就直接跳出循环了。

Benature commented 11 months ago
if rate == 0 and len(ld) > 0:

我 if 多个判断吧,之前没碰到过整个 list 都打简答标签的情况。如果我没记错的话,这个 rate 是看还不熟悉的单词的比重(年代太久远了),所以才要在查询的时候区分flag来取数。

continue就不对这个list作后续处理了,所以要是把if判断条件补充一下逻辑应该就对了。

本身continue跳出是防止在list中一直「下一个」直接把整个list「下一个」完了的情况。

xuminxi commented 11 months ago

帅,解决了。