当前位置: 首页 > 后端技术 > Python

它比正则表达式快M倍以上,Python替换字符串的新姿势

时间:2023-03-26 19:38:04 Python

FlashText算法是VikashSingh在2017年发表的大规模关键词替换算法,该算法的时间复杂度仅由文本长度(N)决定。该算法的时间复杂度为O(N)。对于正则表达式的替换,算法的时间复杂度还需要考虑要替换的关键字个数(M),所以时间复杂度为O(MxN)。总之,基于FlashText算法的字符串替换比正则表达式替换快M倍以上。这个M就是需要替换的关键字的个数。关键字越多,FlashText算法的优势越明显。下面将介绍如何基于flashtext模块在Python中使用FlashText算法进行字符串查找和替换。如果您觉得对您的项目团队有很大帮助,请记得转发给作者。1.在开始之前,您需要确保您的计算机上已经成功安装了Python和pip。(方案一)如果使用Python进行数据分析,可以直接安装Anaconda,Anaconda内置了Python和pip。(方案二)另外,推荐大家使用VSCode编辑器,优点很多。请选择以下方式之一输入命令安装依赖项:Windows环境打开Cmd(开始-运行-CMD)。MacOS环境打开Terminal(command+空格进入Terminal)。如果您使用的是VSCode编辑器或Pycharm,则可以直接使用界面底部的Terminal。pip安装flashtext2。提取关键词的基本使用提取关键词的基本示例如下:fromflashtextimportKeywordProcessor#1.初始化关键词处理器keyword_processor=KeywordProcessor()#2.添加关键词keyword_processor.add_keyword('BigApple','NewYork')keyword_processor.add_keyword('BayArea')#3.处理目标句子并提取对应的关键词keywords_found=keyword_processor.extract_keywords('IloveBigAppleandBayArea.')#4.结果print(keywords_found)#['NewYork','BayArea']其中add_keyword的第一个参数代表要搜索的关键字,第二个参数是给关键字起一个别名,如果找到了,就会显示为别名。替换关键字如果要替换关键字,调用处理器的replace_keywords函数即可:fromflashtextimportKeywordProcessor#1.初始化关键字处理器keyword_processor=KeywordProcessor()#2.添加关键字keyword_processor.add_keyword('NewDelhi','NCRregion')#3.替换关键字new_sentence=keyword_processor.replace_keywords('IloveBigAppleandnewdelhi.')#4.Resultprint(new_sentence)#'IloveNewYorkandNCRregion.'keyWordcasesensitivity如果需要准确提取和识别大小写字母,那么可以在处理器初始化时设置敏感参数:fromflashtextimportKeywordProcessor#1.初始化关键字处理器,注意设置case_sensitive为TRUEkeyword_processor=KeywordProcessor(case_sensitive=True)#2.添加关键词keyword_processor.add_keyword('BigApple','NewYork')keyword_processor.add_keyword('BayArea')#3.处理目标语句并提取对应的关键词keywords_found=keyword_processor.extract_keywords('IlovebigAppleandBayArea.')#4.Resultprint(keywords_found)#['BayArea']markkeywordposition如果需要获取关键词在句子中的位置,在extract_keywords中加上参数span_info即可=True:fromflashtextimportKeywordProcessor#1.初始化关键字处理器keyword_processor=KeywordProcessor()#2.添加关键词keyword_processor.add_keyword('BigApple','NewYork')keyword_processor.add_keyword('BayArea')#3.对目标语句进行处理并提取出对应的关键词,标记开头keywords开始和结束位置keywords_found=keyword_processor.extract_keywords('IlovebigAppleandBayArea.',span_info=True)#4.结果print(keywords_found)#[('NewYork',7,16),('BayArea',21,29)]获取当前所有关键字如果需要获取所有已经添加的关键字,调用处理器的get_all_keywords函数即可:fromflashtextimportKeywordProcessor#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'}批量添加关键字有两种方式,一种是通过字典,另一种是r是通过数组:fromflashtextimportKeywordProcessor#1.初始化关键字处理器keyword_processor=KeywordProcessor()#2.(类型1)通过字典批量添加关键字keyword_dict={"java":["java_2e","java编程"],"产品管理":["PM","productmanager"]}keyword_processor.add_keywords_from_dict(keyword_dict)#2.(二)通过数组批量添加关键词keyword_processor.add_keywords_from_list(["java","python"])#3.第一种方法提取效果为如下keyword_processor.extract_keywords('我是java_2e平台的产品经理')#output['productmanagement','java']单次或批量删除关键词也很简单,类似于添加:fromflashtextimportKeywordProcessor#1.初始化关键字处理器keyword_processor=KeywordProcessor()#2.通过字典批量添加关键字keyword_dict={"java":["java_2e","javaprogramming"],"productmanagement":["PM","productmanager"]}keyword_processor.add_keywords_from_dict(keyword_dict)#3.提取效果如下print(keyword_processor.extract_keywords('我是java_2e平台的产品经理'))#['productmanagement','java']#4.单个删除关键字keyword_processor.remove_keyword('java_2e')#5.批量删除关键词也可以是字典或数组的形式keyword_processor.remove_keywords_from_dict({"productmanagement":["PM"]})keyword_processor.remove_keywords_from_list(["javaprogramming"])#6.删除javaprogramming关键字后的效果如下keyword_processor.extract_keywords('我是一个java_2e平台的产品经理')#['产品管理']3。高级使用支持附加信息。前面说过,在添加关键字的时候,第二个参数就是它的别名。实际上,您不仅可以指明别名,还可以将附加信息放入第二个参数中。:fromflashtextimportKeywordProcessor#1.初始化关键字处理器kp=KeywordProcessor()#2.添加带有附加信息的关键字kp.add_keyword('TajMahal',('Monument','TajMahal'))kp.add_keyword('Delhi',('Location','Delhi'))#3.效果如下kp.extract_keywords('泰姬陵在德里。')#[('Monument','TajMahal'),('Location','Delhi')]这样在提取关键词的时候,还可以得到一些其他的信息,在获取到这个关键词的时候想要输出支持特殊字边界Flashtext检测的字边界一般限制为除\w[A-Za-z0-9_]以外的任何字符,但是如果你想添加一些特殊字符作为字的一部分,也是可以的:fromflashtextimportKeywordProcessor#1.初始化关键字处理器keyword_processor=KeywordProcessor()#2.添加关键字keyword_processor.add_keyword('BigApple')#3.正常效果print(keyword_processor.extract_keywords('IloveBigApple/BayArea.'))#['BigApple']#4.使用'/'作为单词的一部分keyword_processor.add_non_word_boundary('/')#5.优化后的效果print(keyword_processor.extract_keywords('IloveBigApple/BayArea.'))#[]4.最后,个人认为这个模块已经满足了我们的基本需求。如果您在本模块提供的功能之外还有一些使用需求,可以向flashtext贡献代码。附上查询关键字与FlashText和正则表达式的耗时比:FlashText中替换关键字与正则表达式的耗时比:如果觉得文章还不错,欢迎关注公众号:Python编程学习圈,或者去编程学习网学习更多的编程技术知识,还有大量的干货学习资料!