基于英文分词的猜单词游戏
在1.2节实现了一个进阶版的猜姓名游戏,在本节程序实战中请同学们按照以下需求实现一个基于英文分词的猜单词游戏:① 对某一篇英文文章进行分词,以获取一个英语词典
② 如果用户输入的单词在词典中,则提示"你是个猜单词天才,请收下我的膝盖"
③ 如果用户的输入前缀匹配第一个字母,则提示"不错,有点接近了",前缀匹配前面两个字母,则提示"厉害,比较接近了"
需要对英语词典构造一个词典树的结构进行单词查找,单词查找树的数据结构如下图所示:
红色节点表示从根节点到当前节点的最短路径中的所有字母可组成一个单词。比如在上图所示的结构中,an是一个单词,and也是一个单词。
程序难点分析
实现该程序的难点在于如何对英文文章进行分词。我们都知道英文文章中的单词是以空格,逗号等进行分隔的,利用这样的特性,可以很容易地对英文文章进行分词:在遍历的过程中记录非分隔符的起始位置,然后当遍历出的字符为分隔符时就进行单词拆分。
算法逻辑如下:
① 定义一个布尔类型的标记变量,初始情况下为True,表示已完成单词的拆分
② 遍历英文字符串,如果当前字符为分隔符且尚未切分,则开始分词:将起始位置的索引与分隔符位置之前的所有字符进行拆分
③ 如果当前字符不是分隔符且已拆分,则将标记变量更新为False, 同时更新拆分的起始位置
程序完整源码# __author__ = 薯条老师
# __referrer__ = http://www.chipscoco.com/?cate=59
import time
def cut(content, language=0):
"""
:param content: 待分词的英文字符串,例如:"when a great dream shows up"
:param language: 0表示对英文进行分词
:return: 返回分词后的词典,是一个集合类型, 例如:{"an", "and"}
"""
dictionary = set()
length = len(content)
# 定义英文中的分隔符
stop_words = {";", " ", "\n", ".", "!"}
if language == 0:
begin = 0
# 标记变量,初始情况下表示已拆分
is_cutted = True
for index in range(length):
# 如果当前字符为分隔符
if content[index] in stop_words:
# 且未拆分
if not is_cutted:
dictionary.add(content[begin:index])
is_cutted = True
continue
elif is_cutted:
begin = index
is_cutted = False
return dictionary
def build_trie(dictionary):
"""
:param dictionary:英文词典集合
:return: 单词查找树,系字典对象
"""
trie = {"root": {}}
for word in dictionary:
next = trie["root"]
for char in word:
if char not in next:
next[char] = {}
next = next[char]
else:
next[0]=0
return trie
def countdown(seconds=3, message=""):
"""
:param seconds: 倒数的秒数
:param message: 倒计时结束后输出的提示信息
:return:
"""
for _ in range(seconds, 0, -1):
_, _ = print(_), time.sleep(1)
else:
print(message)
def guess_words():
content = "when a great dream shows up, grab it!"
dictionary = cut(content)
lookup_table = build_trie(dictionary)
countdown(3, "猜单词游戏开始,Go!!!")
messages = {0: "不要瞎猜好吗?", 1: "不错,有点接近了", 2: "厉害,比较接近了",
66: "哇塞,你是个猜单词天才,请收下我的膝盖"}
end = 2
while True:
word = input("请输入你要猜的单词:____\b\b\b\b")
if word in dictionary:
print(messages[66])
if input("按键盘任意键继续玩猜单词游戏或输入quit退出游戏:____\b\b\b\b").lower() == "quit":
break
else:
lookup_table_ = lookup_table["root"]
index = 0
for ch in word:
if ch in lookup_table_:
lookup_table_ = lookup_table_[ch]
index = index+1 if index
else:
break
print(messages[index])
if __name__ == "__main__":
guess_words()
程序的输出界面
项目扩展