当前位置: 首页 > 科技观察

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

时间:2023-03-16 19:37:16 科技观察

FlashText算法是VikashSingh在2017年发表的大规模关键词替换算法,该算法的时间复杂度仅由文本长度(N)决定,算法时间复杂度是O(N)。对于正则表达式的替换,算法的时间复杂度还需要考虑要替换的关键字个数(M),所以时间复杂度为O(MxN)。总之,基于FlashText算法的字符串替换比正则表达式替换快M倍以上。这个M就是需要替换的关键字的个数。关键字越多,FlashText算法的优势越明显。下面将介绍如何基于flashtext模块在Python中使用FlashText算法进行字符串查找和替换。如果您觉得对您的项目组有帮助,请记得转发。1.准备pipinstallflashtext2.提取关键字的基本使用提取关键字的基本示例如下: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.结果打印(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.'关键字大小写敏感如果需要准确提取和识别大小写字母,那么可以在处理器初始化时设置敏感参数:fromflashtextimportKeywordProcessor#1.初始化关键字处理器,注意设置大小写敏感(case_sensitive)为TRUEkeyword_processor=KeywordProcessor(case_sensitive=True)#2.添加关键词keyword_processor.add_keyword('BigApple','NewYork')keyword_processor.add_keyword('BayArea')#3.处理目标语句并提取对应的关键词Wordkeywords_found=keyword_processor.extract_keywords('IlovebigAppleandBayArea.')#4.Resultprint(keywords_found)#['BayArea']markkeywordposition如果需要获取关键词在句子中的位置,在添加span_info=trueparameterwhenextract_keywords: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.',span_info=True)#4.Resultprint(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'}批量添加关键字有两种方式,一种是通过字典,一种是通过array:fromflashtextimportKeywordProcessor#1.初始化关键字处理器keyword_processor=KeywordProcessor()#2.(第一种)通过字典批量添加关键字keyword_dict={"java":["java_2e","javaprogramming"],"产品管理":["PM","产品经理"]}keyword_processor.add_keywords_from_dict(keyword_dict)#2.(第二种)通过数组keyword_processor.add_keywords_from_list(["java","python"])#3.第一种抽取效果如下keyword_processor.extract_keywords('我是产品经理forajava_2eplatform')#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平台的产品经理'))#['产品管理','java']#4.单条删除关键字keyword_processor.remove_keyword('java_2e')#5.批量删除关键词也可以通过a的形式来完成字典或数组keyword_processor.remove_keywords_from_dict({"productmanagement":["PM"]})keyword_processor.remove_keywords_from_list(["javaprogramming"])#6.删除javaprogramming关键字后效果如下keyword_processor.extract_keywords('我是java_2e的产品经理platform')#['productmanagement']3.高级使用支持附加信息前面说了在添加关键词的时候,第二个参数是它的别名。其实不仅可以指明别名,还可以把附加信息放在第二个参数中:fromflashtextimportKeywordProcessor#1.初始化关键字处理器kp=KeywordProcessor()#2.添加带有附加信息的关键字kp.add_keyword('泰姬陵',('纪念碑','泰姬陵'))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贡献代码:https://github.com/vi3k6i5/flashtext附上FlashText查询关键词与正则表达式的耗时比:附FlashText中替换关键字与正则表达式的耗时比:如果这篇文章对你有帮助,记得转发哦。