Python利用FlashText算法实现替换字符串


Posted in Python onMarch 31, 2022

前言

Python利用FlashText算法实现替换字符串

FlashText 算法是由 Vikash Singh 于2017年发表的大规模关键词替换算法,这个算法的时间复杂度仅由文本长度(N)决定,算法时间复杂度为O(N)。

而对于正则表达式的替换,算法时间复杂度还需要考虑被替换的关键词数量(M),因此时间复杂度为O(MxN)。

简而言之,基于FlashText算法的字符串替换比正则表达式替换快M倍以上,这个M是需要替换的关键词数量,关键词越多,FlashText算法的优势就越明显。

下面就给大家介绍如何在 Python 中基于 flashtext 模块使用 FlashText 算法进行字符串查找和替换,如果觉得对你的项目团队很有帮助,请记得帮作者转发一下哦。

1.准备

请选择以下任一种方式输入命令安装依赖

1. Windows 环境 打开 Cmd (开始-运行-CMD)。

2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。

3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.

pip install flashtext

2.基本使用

提取关键词

一个最基本的提取关键词的例子如下:

from flashtext import KeywordProcessor
# 1. 初始化关键字处理器
keyword_processor = KeywordProcessor()
# 2. 添加关键词
keyword_processor.add_keyword('Big Apple', 'New York')
keyword_processor.add_keyword('Bay Area')
# 3. 处理目标句子并提取相应关键词
keywords_found = keyword_processor.extract_keywords('I love Big Apple and Bay Area.')
# 4. 结果
print(keywords_found)
# ['New York', 'Bay Area']

其中 add_keyword 的第一个参数代表需要被查找的关键词,第二个参数是给这个关键词一个别名,如果找到了则以别名显示。

替换关键词

如果你想要替换关键词,只需要调用处理器的 replace_keywords 函数:

from flashtext import KeywordProcessor
# 1. 初始化关键字处理器
keyword_processor = KeywordProcessor()
# 2. 添加关键词
keyword_processor.add_keyword('New Delhi', 'NCR region')
# 3. 替换关键词
new_sentence = keyword_processor.replace_keywords('I love Big Apple and new delhi.')
# 4. 结果
print(new_sentence)
# 'I love New York and NCR region.'

关键词大小写敏感

如果你需要精确提取,识别大小写字母,那么你可以在处理器初始化的时候设定 sensitive 参数:

from flashtext import KeywordProcessor
# 1. 初始化关键字处理器, 注意设置大小写敏感(case_sensitive)为TRUE
keyword_processor = KeywordProcessor(case_sensitive=True)
# 2. 添加关键词
keyword_processor.add_keyword('Big Apple', 'New York')
keyword_processor.add_keyword('Bay Area')
# 3. 处理目标句子并提取相应关键词
keywords_found = keyword_processor.extract_keywords('I love big Apple and Bay Area.')
# 4. 结果
print(keywords_found)
# ['Bay Area']

标记关键词位置

如果你需要获取关键词在句子中的位置,在 extract_keywords 的时候添加 span_info=True 参数即可:

from flashtext import KeywordProcessor
# 1. 初始化关键字处理器
keyword_processor = KeywordProcessor()
# 2. 添加关键词
keyword_processor.add_keyword('Big Apple', 'New York')
keyword_processor.add_keyword('Bay Area')
# 3. 处理目标句子并提取相应关键词, 并标记关键词的起始、终止位置
keywords_found = keyword_processor.extract_keywords('I love big Apple and Bay Area.', span_info=True)
# 4. 结果
print(keywords_found)
# [('New York', 7, 16), ('Bay Area', 21, 29)]

获取目前所有的关键词

如果你需要获取当前已经添加的所有关键词,只需要调用处理器的 get_all_keywords 函数:

from flashtext import KeywordProcessor
# 1. 初始化关键字处理器
keyword_processor = KeywordProcessor()
# 2. 添加关键词
keyword_processor.add_keyword('j2ee', 'Java')
keyword_processor.add_keyword('colour', 'color')
# 3. 获取所有关键词
keyword_processor.get_all_keywords()
# output: {'colour': 'color', 'j2ee': 'Java'}

批量添加关键词

批量添加关键词有两种方法,一种是通过词典,一种是通过数组:

from flashtext import KeywordProcessor
# 1. 初始化关键字处理器
keyword_processor = KeywordProcessor()
# 2. (第一种)通过字典批量添加关键词
keyword_dict = {
    "java": ["java_2e", "java programing"],
    "product management": ["PM", "product manager"]
}
keyword_processor.add_keywords_from_dict(keyword_dict)
# 2. (第二种)通过数组批量添加关键词
keyword_processor.add_keywords_from_list(["java", "python"])
# 3. 第一种的提取效果如下
keyword_processor.extract_keywords('I am a product manager for a java_2e platform')
# output ['product management', 'java']

单一或批量删除关键词

删除关键词也非常简单,和添加类似:

from flashtext import KeywordProcessor
# 1. 初始化关键字处理器
keyword_processor = KeywordProcessor()
# 2. 通过字典批量添加关键词
keyword_dict = {
    "java": ["java_2e", "java programing"],
    "product management": ["PM", "product manager"]
}
keyword_processor.add_keywords_from_dict(keyword_dict)
# 3. 提取效果如下
print(keyword_processor.extract_keywords('I am a product manager for a java_2e platform'))
# ['product management', 'java']
# 4. 单个删除关键词
keyword_processor.remove_keyword('java_2e')
# 5. 批量删除关键词,也是可以通过词典或者数组的形式
keyword_processor.remove_keywords_from_dict({"product management": ["PM"]})
keyword_processor.remove_keywords_from_list(["java programing"])
# 6. 删除了java programing关键词后的效果如下
keyword_processor.extract_keywords('I am a product manager for a java_2e platform')
# ['product management']

3.高级使用

支持额外信息

前面提到在添加关键词的时候第二个参数为其别名,其实你不仅可以指示别名,还可以将额外信息放到第二个参数中:

from flashtext import KeywordProcessor
# 1. 初始化关键字处理器
kp = KeywordProcessor()
# 2. 添加关键词并附带额外信息
kp.add_keyword('Taj Mahal', ('Monument', 'Taj Mahal'))
kp.add_keyword('Delhi', ('Location', 'Delhi'))
# 3. 效果如下
kp.extract_keywords('Taj Mahal is in Delhi.')
# [('Monument', 'Taj Mahal'), ('Location', 'Delhi')]

这样,在提取关键词的时候,你还能拿到其他一些你想要在得到此关键词时输出的信息。

支持特殊单词边界

Flashtext 检测的单词边界一般局限于 \w [A-Za-z0-9_] 外的任意字符,但是如果你想添加某些特殊字符作为单词的一部分也是可以实现的:

from flashtext import KeywordProcessor
# 1. 初始化关键字处理器
keyword_processor = KeywordProcessor()
# 2. 添加关键词
keyword_processor.add_keyword('Big Apple')
# 3. 正常效果
print(keyword_processor.extract_keywords('I love Big Apple/Bay Area.'))
# ['Big Apple']
# 4. 将 '/' 作为单词一部分
keyword_processor.add_non_word_boundary('/')
# 5. 优化后的效果
print(keyword_processor.extract_keywords('I love Big Apple/Bay Area.'))
# []

4.结尾

个人认为这个模块已经满足我们的基本使用了,如果你有一些该模块提供的功能之外的使用需求,可以给 flashtext 贡献代码

附 FlashText 与正则相比 查询关键词 所花费的时间之比:

Python利用FlashText算法实现替换字符串

到此这篇关于Python利用FlashText算法实现替换字符串的文章就介绍到这了,更多相关Python替换字符串内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python制作最美应用的爬虫
Oct 28 Python
老生常谈python的私有公有属性(必看篇)
Jun 09 Python
Python面向对象编程基础解析(二)
Oct 26 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
Python对HTML转义字符进行反转义的实现方法
Apr 28 Python
django中forms组件的使用与注意
Jul 08 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
Python requests模块session代码实例
Apr 14 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
Python基于httpx模块实现发送请求
Jul 07 Python
详解Python flask的前后端交互
Mar 31 #Python
ubuntu安装jupyter并设置远程访问的实现
Python中time与datetime模块使用方法详解
Mar 31 #Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 #Python
Python利用zhdate模块实现农历日期处理
Mar 31 #Python
详解Python中__new__方法的作用
Mar 31 #Python
利用Python将list列表写入文件并读取的方法汇总
Mar 25 #Python
You might like
关于PHP5 Session生命周期介绍
2010/03/02 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
学习ExtJS Panel常用方法
2009/10/07 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
vue实现评价星星功能
2020/06/30 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
Django密码系统实现过程详解
2019/07/19 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
专科毕业生求职简历的自我评价
2013/10/12 职场文书
实习生自荐信范文分享
2013/11/27 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
跑吧孩子观后感
2015/06/10 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
Pygame Rect区域位置的使用(图文)
2021/11/17 Python