基于英文分词的猜单词游戏
在1.2节实现了一个进阶版的猜姓名游戏,在本节程序实战中请同学们按照以下需求实现一个基于英文分词的猜单词游戏:
① 对某一篇英文文章进行分词,以获取一个英语词典
② 如果用户输入的单词在词典中,则提示"你是个猜单词天才,请收下我的膝盖"③ 如果用户的输入前缀匹配第一个字母,则提示"不错,有点接近了",前缀匹配前面两个字母,则提示"厉害,比较接近了"
需要对英语词典构造一个词典树的结构进行单词查找,单词查找树的数据结构如下图所示:
红色节点表示从根节点到当前节点的最短路径中的所有字母可组成一个单词。比如在上图所示的结构中,an是一个单词,and也是一个单词。
程序难点分析
实现该程序的难点在于如何对英文文章进行分词。我们都知道英文文章中的单词是以空格,逗号等进行分隔的,利用这样的特性,就可以很容易地对英文文章进行分词:在遍历的过程中记录非分隔符的起始位置,然后当遍历出的字符为分隔符时就进行单词拆分。
算法逻辑如下:
① 定义一个布尔类型的标记变量,初始情况下为True,表示已完成单词的拆分
② 遍历英文字符串,如果当前字符为分隔符且尚未切分,则开始分词:将起始位置的索引与分隔符位置之前的所有字符进行拆分③ 如果当前字符不是分隔符且已拆分,则将标记变量更新为False, 同时更新拆分的起始位置
程序完整源码
# __author__ = 薯条老师 # __referrer__ = http://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 < end else index else: break print(messages[index]) if __name__ == "__main__": guess_words()
程序的输出界面
项目扩展
实现一个基于中文分词的猜姓名游戏
最具实力的小班培训
来这里参加Python和Java小班培训的学员大部分都找到了很好的工作,平均月薪有11K,学得好的同学,拿到的会更高。由于是小班教学,所以薯条老师有精力把每位学员都教好。打算参加线下小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。
(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪11K-20K, 免费领取课程大纲
(4) Python大数据分析,量化投资就业班,月薪12K-25K,免费领取课程大纲
扫码免费领取学习资料: