指定关键词进行字符串切分

简介: 指定关键词进行字符串切分

引言

说起字符串分割,我们第一反应会是字符串中的split方法,如果给定了关键词去分割一个字符串,该怎么操作呢?最近写到了一个很有意思的题目,分享给大家:


一、题目描述

题目看起来很简单:

假设有一个字典,其中包括:“大数据”、“互联网”、“技术”、“数据”、“结构化”、“处理”、“难点”、“分析”、“很大”、“合适”、“平台”。

用关键词对输入的句子用进行词汇切分。

例如输入句子是“互联网大数据技术与分析平台”,按关键词分割

输出:互联网/大数据/技术/与/分析/平台。

其他例子如下:


二、题目分析:

这道题看起来不难啊,这个字典其实就是个关键词字符串构成的列表。第一想法是用in关键字,把输入的句子先按两个两个切割,用in的关键字去和列表判断,再三三判断。可是这样有一个问题:比如输入的互联网大数据技术与分析平台,这里的“与”不在列表里面,是要单独分割出来的,如果用in关键字与其他混为一谈就没办法判断了。并且,“大数据”和“数据”应该切分为两个词,即“大数据”不可切分为“大”“数据”。


所以,想到了另一种做法:

1. 先将字符串“互联网大数据技术与分析平台”这个整体与列表匹配,匹配不上的话,删去字符串最右边的字符,变成“互联网大数据技术与分析平”

1. 再去匹配,匹配不上再删去最右边的字符,变成“互联网大数据技术与分析”

1. 再去匹配……不断重复这个过程,直达匹配上“互联网”为止 。

1. 将原字符串减去第一次匹配到的字符串,即“互联网大数据技术与分析平台”减去“互联网”变为“大数据技术与分析”。

1. 得到的结果再进行循环,再进行匹配,并且把每一次的最终匹配结果存在一个列表里面。

1. 缝合列表,输出结果。

这里要注意:以上述例子为例,这里的“也”由于在列表里匹配不到,会报索引的错误,需要捕获异常,这个功能在func_2函数中有所说明。


三、代码

代码如下:

1. import copy
2. dic_list = ["大数据", "互联网", "技术", "数据", "结构化", "处理", "难点", "分析", "很大", "合适", "平台"]
3. str_input = input("请输入一个句子:")
4. str_list = list(str_input)
5. str_input_2 = copy.copy(str_input)
6. fin_list = []
7. fin_list_2 = []
8. def func_1(str_input):
9. while True:
10. if len(str_input) != 1:
11. if str_input not in dic_list:
12.                 str_input = str_input[:-1:1]
13. else:
14. return str_input
15. else:
16. return str_input
17. def func_2():
18. global str_input
19. while True:
20. try:
21.             fin_list_2.append(func_1(str_input))
22.             length = len(func_1(str_input))
23.             str_input = str_input[length::1]
24. if len("".join(fin_list_2)) == len(str_input_2):
25. break
26. except IndexError:
27.             fin_list_2.append(str_input[0])
28.             str_input = str_input.replace(str_input[0],"")
29. if len("".join(fin_list_2)) == len(str_input_2):
30. break
31.     fin_str = "/".join(fin_list_2)
32. return fin_str
33. print("原句子是:",str_input_2)
34. 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)将列表缝合起来,返回最终结果。



相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
32714 80
如何保证分布式文件系统的数据一致性
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17766 21
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36697 21
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24772 14
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36678 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29849 52

热门文章

最新文章

下一篇
开通oss服务