详解Python中的数据清洗工具flashtext
作者:Python?集中营 发布时间:2021-10-05 01:59:47
在平常的一些的小规模的数据的过滤、清洗过程中使用最多的就是正则表达式,但是随着数据规模的增大,正则表达式就显得有些心有余力不足了。
正则表达式在一个 10k 的词库中查找 15k 个关键词的时间差不多是 0.165 秒。但是对于 Flashtext 而言只需要 0.002 秒。因此,在这个问题上 Flashtext的速度大约比正则表达式快 82 倍。
从上面的示例图的性能对比中,可以发现随着我们需要处理的字符越来越多,正则表达式的处理速度几乎都是线性增加的。然而,Flashtext 几乎是一个常量。
1、准备flashtext环境
通过pip的方式来安装flashtext,或是其他的方式也是可以的,这里默认使用的是清华大学的镜像站。
pip install flashtext -i https://pypi.tuna.tsinghua.edu.cn/simple
在准备好flashtext环境以后,来看一下flashtext重要的使用过程,帮助我们能更好的完成数据清洗操作。
2、添加关键词
这里添加关键词时是通过单个关键词的来添加到关键词词库中,使用add_keyword函数来添加。第一次参数表示需要添加的关键词,第二个参数则表示为第一个关键词的别名,如果关键词被找到了则显示为别名的形式,若是没有使用第二个参数作为别名则还是显示原有的名称。
from flashtext import KeywordProcessor
# 初始化关键词库处理器
processor = KeywordProcessor()
# 常规方式添加关键词
processor.add_keyword('Python')
# 别名方式添加关键词
processor.add_keyword('Scala', 'Java')
这样分别使用两种方式已经将需要的关键词添加到词库处理器中了。
3、提取关键词
通过上一步添加关键词,现在词库处理器中已经存在有关键词的信息了,再使用extract_keywords将关键词提取出来即可。
# 在一个字符串中提取出关键词信息
found = processor.extract_keywords('I like Python and Scala.')
# 结果
print(found)
# ['Python', 'Java']
结果出来了,跟我们预想的是一样的,并Scala也显示为了Java。
4、替换关键词
替换关键词使用的是replace_keywords函数,前提是词库中拥有别名的词才能被替换,就像上面的Scala被显示成了的Java一样。
替换一个字符串中的Scala关键词,由于Scala对应的别名是Java,所以一个字符串中的Scala应该被替换为Java。
replaced = processor.replace_keywords('I like Scala.')
# 结果
print(replaced)
# I like Java.
# Scala 果真就被替换为了Java。
5、获取所有关键词
有些时候,在KeywordProcessor词库处理器中添加了哪些关键词可能自己都记不清楚了,这个时候可以使用get_all_keywords函数来获取当前的所有关键词。
all_keywords = processor.get_all_keywords()
# 结果
print(all_keywords)
# {'python': 'Python', 'scala': 'Java'}
6、批量的添加关键词
当关键词库需要更多的关键词的时候,可以通过列表或是字典的方式来进行批量的添加。对应的函数分别是add_keywords_from_list、add_keywords_from_dict函数。
# 初始化一个字典通过用来做批量添加
dict_ = {
'java': ['java_ee', 'java_se', 'java_me'],
'python': ['pandas', 'all']
}
# 通过字典的方式来批量添加关键词
processor.add_keywords_from_dict(dict_)
# 从批量添加的关键词中匹配关键词
result = processor.extract_keywords('looking for java_ee and pandas.')
# 结果
print(result)
# ['java', 'python']
# 通过列表的方式批量添加关键词
processor.add_keywords_from_list(['scala', 'python', 'scala', 'go'])
# 通过get_all_keywords查看一下所有关键词
all_keywords = processor.get_all_keywords()
# 结果
print(all_keywords)
# {'python': 'python', 'pandas': 'python', 'scala': 'scala', 'java_ee': 'java', 'java_se': 'java', 'java_me': 'java', 'all': 'python', 'go': 'go'}
发现所有的关键词已经添加到词库处理器中,并且重复的不会再次添加。
7、批量删除关键词
批量删除词库处理器中的关键词同样是有两种方式,一个是列表、另一个是字典。对应的函数分别是remove_keywords_from_list、remove_keywords_from_dict函数。
# 批量移除列表中的关键词
processor.remove_keywords_from_list(['python','java_ee','java_me'])
# 批量移除字典中的关键词
processor.remove_keywords_from_dict({'python': ['pandas','all']})
# 通过get_all_keywords查看一下所有关键词
all_keywords = processor.get_all_keywords()
# 结果
print(all_keywords)
# {'scala': 'scala', 'java_se': 'java', 'go': 'go'}
发现需要移除的关键词已经被全部移除了。
8、执行效率对比
为了更可观的展示效果,找了两个flashtext在搜索和替换关键词过程中的效率对比图可以一目了然。
flashtext、正则表达式搜索效率对比
flashtext、正则表达式搜索替换对比
来源:https://www.cnblogs.com/lwsbc/p/16414467.html


猜你喜欢
- SQL Server 平台修改自增列值由于之前处理过sql server数据库的迁移工作,尝试过其自增列值的变更,但是通过SQL 语句修改自
- 本文实例为大家分享了用户登录系统python实现代码,供大家参考,具体内容如 * 意事项: 1、使用python3执行程序。按提示输入1或2,
- 之前折磨了很久,想在Mysql命令行下导出数据库,但就是每天提示不那个错误,后来才知道其实mysqldump不是mysql命令,因此不能在M
- 前言今天我的 PyCharm 突然间就死掉了,双击图标,等半天没有反应,也没有抛出什么错误。打开任务管理器,发现双击时启动了一个PyChar
- 本文介绍了python同时替换多个字符串方法示例,分享给大家,具体如下:import rewords = ''' &
- 本文实例为大家分享了python感知机实现的具体代码,供大家参考,具体内容如下一、实现例子李航《统计学方法》p29 例2.1正例:x1=(3
- 惊现!表面下的隐藏信息——浅谈信息可视化1910年,病卧床上的魏格那(德国气象学家,以“大陆漂移学说”闻名),无意地注视着墙上的世界地图……
- package 的导入语法写 Go 代码的时经常用到 import 这个命令用来导入包,参考如下:import( "f
- 本文实例讲述了Python通过poll实现异步IO的方法。分享给大家供大家参考。具体分析如下:在使用poll()后返回轮询对象,该对象支持以
- 在日常的python编程中使用这几个函数来简化我们的编程工作,经常使用能使编程效率大大地提高。1. Map 函数map函数可以使用另外一个函
- 准备工作我们需要把秒杀的商品加入购物车,因为脚本点击的是全选,所以不需要的商品要移出购物车。过程分析1.打开某宝网站;pq = webdri
- 本文实例讲述了JavaScript使用indexOf()实现数组去重的方法。分享给大家供大家参考,具体如下:数组去重方法有多中,这里列举出自
- <?php 02 if(!function_exists('get_headers')){ 03&
- 这里会讨论令Oracle停机时间最小化的步骤。各种形式的停机--计划的或者是非计划的--总是不断地发生,一个DBA应该有正确的备份策略,这样
- 有一个古老的争论,是关于在哪里存储应用程序业务逻辑的:是在应用程序本身的业务逻辑层中还是在数据库层中。应用程序逻辑层的绝对支持者提出,数据库
- 1. 前言最近有点时间,就随便找点东西弄弄,倒也碰到了一些问题,在此记录下2. 环境Python3.11.3 + selenium4.9.1
- 对于那些需要在登录环境下进行的爬虫操作,模拟登陆或伪装已登录状态是一个刚需。分析了网上关于模拟登录的例子,很多都基于用户名/密码发起一个po
- 一、MySQL中如何表示当前时间?其实,表达方式还是蛮多的,汇总如下:CURRENT_TIMESTAMPCURRENT_TIMESTAMP(
- 减少HTTP请求,是可以提高网站速度的,把所有的背景图像都放到一个图片文件中,然后通过CSS的background-image和backgr
- 导航设计是结构层面设计中的主要工作之一,在软件中,导航设计的好坏,直接关系到用户使用是否能够流畅。面对较复杂的导航,我们第一反应是将其简化。