告别正则表达式,这个Python库可以快M倍
FlashText 算法是由 Vikash Singh 于2017年发表的大规模关键词替换算法,这个算法的时间复杂度仅由文本长度(N)决定,算法时间复杂度为O(N)。
而对于正则表达式的替换,算法时间复杂度还需要考虑被替换的关键词数量(M),因此时间复杂度为O(MxN)。
简而言之, 基于FlashText算法的字符串替换比正则表达式替换快M倍以上,这个M是需要替换的关键词数量,关键词越多,FlashText算法的优势就越明显 。
下面就给大家介绍如何在 Python 中基于 flashtext 模块使用 FlashText 算法进行字符串查找和替换,如果觉得对你的项目团队很有帮助,请记得帮作者转发一下哦。
1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。
(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.
(可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南。
请选择以下任一种方式输入命令安装依赖 :
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 贡献代码:
https://github.com/vi3k6i5/flashtext
附 FlashText 与正则相比 查询关键词 所花费的时间之比:
附 FlashText 与正则相比 替换关键词 所花费的时间之比:
这篇文章如果对你有帮助的话,记得转发一下哦。
凤凰山凤岩古庙,建筑风采登上了深圳的另一座山峰凤凰山,不过只上到了次峰,没上到主峰。来一组华为Mate40Pro拍摄的片子,记录凤凰山上的风光,凤岩古庙的建筑很不错,庙前五星红旗迎风飘扬!凤凰山凤岩古庙,
西岸美术馆与蓬皮杜中心重磅呈献蓬皮杜中心典藏展继2019年开馆大展时间的形态后,西岸美术馆与蓬皮杜中心五年展陈合作将于2021年7月28日至2023年2月5日倾力呈现第二个常设大展万物的声音,以物贯穿叙事,溯源现当代主义史的发
五倍潜望式超长焦记录广州长隆野生动物的风采在穗多年,第一次去广州长隆野生动物世界,大熊猫,狮子,斑马,老虎,骆驼,大象,长颈鹿,獴哥,它的视场融合技术大大提升了3。04。6倍变焦的画质,爽!来自华为Mate40Pro五倍潜
信息可视化应用是提升使用体验的有效方式之一根据美国哈佛商学院有关研究人员的分析资料表明,人的大脑每天通过五种感官在接受外部信息的比例分别为味觉1触觉1。5嗅觉3。5听觉11以及视觉83。显然,通过产品信息可视化应用是能够有
飞利浦平板M9X夏日出新,去开启你的掌上世界近期,飞利浦平板系列产品正式推出M9X高性能兼优大屏的现代高性价安卓系平板。新品采用行业各高新技术及用材打造,搭载主流10。1英寸大屏,拥有超稳定高速虎贲T610引擎实力,能够高度
被称为非洲美国的利比里亚为何经济萧条战乱不断?说到利比里亚,大家有个说法,喜欢说它是非洲的美国。这个国家几乎照搬了美国的制度,并且在1959年就和美国人签了共同防御条约,可以说受到老大哥美利坚的贴心关注。并且这地方的环境也很棒
看这里,了解飞利浦PSE0550更多一些Q拍摄效果是否清晰?画质如何?答飞利浦PSE0550采用先进12。8英寸CMOS传感器以及高品质镜头,能够顺畅进行4K级超高清视频像素输出处理,同时设备具备灵敏的感光性及处理能力,
飞利浦PSE0540高质量线上会议,突破声音界限数字虚拟与现实世界无缝交接,视听感官界限被无限放大,在当代被千万高速网丝覆盖的信息空间里,每一个人都拥有着随时开展隔空对话的能力,而专为现代商务会议量身打造的高保真会议麦克风飞利浦
拉丁裔正在成为美国人的第二族群?一说起美国的少数族裔,大家可能首先想到的是非洲裔,毕竟年初BLM运动席卷全美,闹得沸沸扬扬。但是真正说的上美国最多的少数族裔的却不是非洲裔,而是拉丁裔。拉丁裔又叫做西班牙语裔,一般
PLC云网关,PLCHMI联网优选在工业控制领域,客户的行业和需求千差万别,对PLC网关要求也不尽相同。总体来说客户需求分为两类一类是需要远程调试和更新PLCHMI的程序一类是需要实时监控设备数据,用户需要PLC网
是正义还是生意?两伊战争沦为了美国人挣钱的戏码?两伊战争是中东世界两大产油国的一次激烈对抗,可以说打到几乎是家家带孝的悲惨局面。根据柯南道尔的石油大棋局下一个目标中国中的描述,战争造成超过150万人伤亡,数百万人流离失所。以死亡