详解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
猜你喜欢
- CAPTCHA,全称为“Completely Automated Public Turing test to tell Computers
- 我们在浏览网页的时候偶尔会遇到一些陌生的网页交互行为,通常情况下它们并不会影响你的正常使用,之所以出现情况往往是因为,设计师在设计某个交互方
- 我们平常在网页上显示的字体最小一般是12PX,当小于10PX时,显示的效果就大打折扣了,因为中文默认的字体是宋体,当小于12PX时的效果如下
- 用python操作ms sqlserver,有好几种方法:(1)利用pymssql (2)利用pyodbc这里讲import&nb
- 本文实例讲述了ASP.NET中MVC从后台控制器传递数据到前台视图的方式。分享给大家供大家参考。具体分析如下:数据存储模型Model:pub
- 一、安装go get github.com/sirupsen/logrus二、使用1、当做标准库使用logrus实现了标准库log的方法,可
- UPDATE语句的速度更新查询的优化同SELECT查询一样,需要额外的写开销。写速度依赖于更新的数据大小和更新的索引的数量。没有更改的索引不
- Symfony2是一个基于PHP语言的Web开发框架,有着开发速度快、性能高等特点。本文以一个程序示例的实现过程详细叙述了Symfony2框
- SQL Server 2005相对于SQL Server 2000做了很大的改进,许些新特性是非常实用的。本文中将通过几个具体示例进行详细的
- 人们很容易忽视图像img标签的alt属性。然而,它的重要性也无法体现出来,它是有利于网页的accessibility and&nb
- 一、测试模型下面这部分来自于某书籍资料,拿过来,按需参考一下:测试模型(1)线性测试1、概念:通过录制或编写对应应用程序的操作步骤产生的线性
- 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,可以用if语句
- location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.hre
- 为了把事情变成简单化,我在多个Oracle数据上建立统一的检查数据库账户,并且账户只能访问特定的几个视图(需要查询的sql已生成视图),具体
- 为什么是三谈为什么是三谈呢?一是因为这真的是一个被说烂的话题,二是因为太师傅在n年前就写过这篇再谈iframe自适应高度。之所以再提该问题,
- 本文实例讲述了thinkPHP框架通过Redis实现增删改查操作的方法。分享给大家供大家参考,具体如下:一、概述Redis是一个NoSQL数
- 导言在前面的两篇教程中,我们看到了如何在单一页面中显示主/从报表, 它使用DropDownList显示主记录,使用GridView或Deta
- 目录什么是引用计数怎么查看引用计数?对象的引用计数数组的引用计数关于内存泄露需要注意的地方总结什么是引用计数在PHP的数据结构中,引用计数就
- 我的朋友没在服务器上设置DSN,可他一样访问数据库,他是怎样做到的? 其实,只要我们知道数据库文件名(比如Access、Parad
- 问一下谁知道如何用 javascript 获取硬盘信息1.获得硬盘当前有几个盘符.2.每个盘符的 大小,已经使用的大小,和没有使用的大小原理