python简易版猜单词游戏_python项目实战1.3节:基于英文分词的猜单词游戏-薯条老师的官方博客...

基于英文分词的猜单词游戏

在1.2节实现了一个进阶版的猜姓名游戏,在本节程序实战中请同学们按照以下需求实现一个基于英文分词的猜单词游戏:① 对某一篇英文文章进行分词,以获取一个英语词典

② 如果用户输入的单词在词典中,则提示"你是个猜单词天才,请收下我的膝盖"

③ 如果用户的输入前缀匹配第一个字母,则提示"不错,有点接近了",前缀匹配前面两个字母,则提示"厉害,比较接近了"

需要对英语词典构造一个词典树的结构进行单词查找,单词查找树的数据结构如下图所示:

779b9db4fffc8564e41b4aabff2a1ab5.png

红色节点表示从根节点到当前节点的最短路径中的所有字母可组成一个单词。比如在上图所示的结构中,an是一个单词,and也是一个单词。

程序难点分析

实现该程序的难点在于如何对英文文章进行分词。我们都知道英文文章中的单词是以空格,逗号等进行分隔的,利用这样的特性,可以很容易地对英文文章进行分词:在遍历的过程中记录非分隔符的起始位置,然后当遍历出的字符为分隔符时就进行单词拆分。

算法逻辑如下:

① 定义一个布尔类型的标记变量,初始情况下为True,表示已完成单词的拆分

② 遍历英文字符串,如果当前字符为分隔符且尚未切分,则开始分词:将起始位置的索引与分隔符位置之前的所有字符进行拆分

③ 如果当前字符不是分隔符且已拆分,则将标记变量更新为False, 同时更新拆分的起始位置

60ec6fd88df23dbc13d1acdf8300b981.png

程序完整源码# __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()

程序的输出界面

253e1a536b8a519c8ac7e29acf19f40d.png

项目扩展

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值