目录
引言
说起字符串分割,我们第一反应会是字符串中的split方法,如果给定了关键词去分割一个字符串,该怎么操作呢?最近写到了一个很有意思的题目,分享给大家:
一、题目描述
题目看起来很简单:
- 假设有一个字典,其中包括:“大数据”、“互联网”、“技术”、“数据”、“结构化”、“处理”、“难点”、“分析”、“很大”、“合适”、“平台”。
- 用关键词对输入的句子用进行词汇切分。
- 例如输入句子是“互联网大数据技术与分析平台”,按关键词分割
- 输出:互联网/大数据/技术/与/分析/平台。
其他例子如下:
二、题目分析:
这道题看起来不难啊,这个字典其实就是个关键词字符串构成的列表。第一想法是用in关键字,把输入的句子先按两个两个切割,用in的关键字去和列表判断,再三三判断。可是这样有一个问题:比如输入的互联网大数据技术与分析平台,这里的“与”不在列表里面,是要单独分割出来的,如果用in关键字与其他混为一谈就没办法判断了。并且,“大数据”和“数据”应该切分为两个词,即“大数据”不可切分为“大”“数据”。
所以,想到了另一种做法:
- 先将字符串“互联网大数据技术与分析平台”这个整体与列表匹配,匹配不上的话,删去字符串最右边的字符,变成“互联网大数据技术与分析平”
- 再去匹配,匹配不上再删去最右边的字符,变成“互联网大数据技术与分析”
- 再去匹配……不断重复这个过程,直达匹配上“互联网”为止 。
- 将原字符串减去第一次匹配到的字符串,即“互联网大数据技术与分析平台”减去“互联网”变为“大数据技术与分析”。
- 得到的结果再进行循环,再进行匹配,并且把每一次的最终匹配结果存在一个列表里面。
- 缝合列表,输出结果。
这里要注意:以上述例子为例,这里的“也”由于在列表里匹配不到,会报索引的错误,需要捕获异常,这个功能在func_2函数中有所说明。
三、代码
代码如下:
import copy
dic_list = ["大数据", "互联网", "技术", "数据", "结构化", "处理", "难点", "分析", "很大", "合适", "平台"]
str_input = input("请输入一个句子:")
str_list = list(str_input)
str_input_2 = copy.copy(str_input)
fin_list = []
fin_list_2 = []
def func_1(str_input):
while True:
if len(str_input) != 1:
if str_input not in dic_list:
str_input = str_input[:-1:1]
else:
return str_input
else:
return str_input
def func_2():
global str_input
while True:
try:
fin_list_2.append(func_1(str_input))
length = len(func_1(str_input))
str_input = str_input[length::1]
if len("".join(fin_list_2)) == len(str_input_2):
break
except IndexError:
fin_list_2.append(str_input[0])
str_input = str_input.replace(str_input[0],"")
if len("".join(fin_list_2)) == len(str_input_2):
break
fin_str = "/".join(fin_list_2)
return fin_str
print("原句子是:",str_input_2)
print("切分结果是",func_2())
四、输出结果:
五、总结:
1、这里的字典其实就是一个关键词字符串构成的列表。
2、删除字符串最右边一位用字符串的切片方法:str_input = str_input[:-1:1]
3、在输入的字符串删除初步匹配的结果:
length =len(func_1(str_input))
str_input =str_input[length::1]
4、func_1函数的作用是,你只要输入一个句子,他能返回第一个词(如果第一个词不在列表里面,会报索引错误)
5、fun_2函数的作用是,在原来输入的字符串中不断缩减,提取出来关键词,并且捕获异常。捕获异常的关键代码,即把那个字给提取出来:
6、简单来说,func_1算是造了一个工具,func_2一直在调用这个工具,不断产生结果,并且他还有捕获异常的功能。
7、“\”.join(fin_list)将列表缝合起来,返回最终结果。
好啦,就分享到这里啦,感兴趣的小伙伴欢迎评论区交流!