Python 测验 - 如何接受大部分正确的答案

1 投票
1 回答
1032 浏览
提问于 2025-04-17 14:34

我正在写一个程序,让用户可以设置个人的测验(就像记忆卡片的系统)。在做测验的时候,用户会对每个问题进行计时。不过,答案不是选择题,而是用户自己输入的。

我想知道有没有办法可以接受那些不完整的答案,也就是用户在设置测验时输入的答案不需要完全一致。

举个例子

问:“苏格拉底是谁?”

答:“一个希腊哲学家。”


我考虑过使用一些方法:

if input in answer:
    print "That's correct."

但这样根本不行。

有没有可能做到这一点?或者有什么接近的办法。

---更新---

我最近发现了一个很棒的Python模块,能很好地做到这一点,叫做FuzzyWuzzy,这里有一个链接,介绍它的功能和用法 http://seatgeek.com/blog/dev/fuzzywuzzy-fuzzy-string-matching-in-python

1 个回答

5

这要看你具体想做什么。你提到的尝试听起来像是想匹配“一个希腊哲学家”的任何子字符串,所以“ee”算是一个正确答案,但这听起来不太对。

你可以为每个问题准备一组可能的正确答案。比如在你的例子中,可能只接受“哲学家”这个答案。

如果你想忽略拼写错误,可以检查输入的内容与已知的正确答案有多“接近”。这需要一个函数来计算匹配的接近程度。一个常用的方法是使用“莱文斯坦距离”。你可以看看这些链接:

http://en.wikipedia.org/wiki/Levenshtein_distance
http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance
http://code.activestate.com/recipes/576874-levenshtein-distance/
http://pypi.python.org/pypi/python-Levenshtein/

更新

莱文斯坦距离适合用来处理不准确的拼写。但如果你想接受不同的短语,比如“来自古希腊的哲学家”,那就需要另一种方法。如果你真的有兴趣,可以尝试使用NLTK,Python的自然语言工具包来实现一种模糊短语匹配的方法,试着匹配词性而不是完全匹配提供的短语。要注意,这并不简单

撰写回答