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

比正则表达式快N倍!这图书馆简直太香了!

时间:2023-03-20 16:13:15 科技观察

FlashText算法是VikashSingh于2017年发表的大规模关键词替换算法。该算法的时间复杂度仅由文本长度(N)决定,算法时间复杂度为O(N)。对于正则表达式的替换,算法的时间复杂度还需要考虑要替换的关键字个数(M),所以时间复杂度为O(MxN)。总之,基于FlashText算法的字符串替换比正则表达式替换快M倍以上。这个M就是需要替换的关键字的个数。关键字越多,FlashText算法的优势越明显。下面将介绍如何基于flashtext模块在Python中使用FlashText算法进行字符串查找和替换。如果您觉得对您的项目团队有帮助,请记得转发给作者。1.在开始之前,您需要确保您的计算机上已经成功安装了Python和pip。如果没有,可以访问这篇文章:超详细的Python安装指南进行安装。(可选1)如果使用Python进行数据分析,可以直接安装Anaconda:Anaconda,Python数据分析和挖掘的好帮手,内置Python和pip。(可选2)另外,推荐大家使用VSCode编辑器,它有很多优点:Python编程的最佳拍档——VSCode详解指南。请选择以下方式之一输入命令安装依赖项:Windows环境打开Cmd(开始-运行-CMD)。MacOS环境打开Terminal(command+空格进入Terminal)。如果您使用的是VSCode编辑器或Pycharm,则可以直接使用界面底部的Terminal。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.resultprint(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.结果print(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。对目标句子进行处理,提取对应的关键词keywords_found=keyword_processor.extract_keywords('IlovebigAppleandBayArea.')#4.Resultprint(keywords_found)#['BayArea']标记关键词位置如果需要获取关键词在句子中的位置,将span_info=True参数添加到extract_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'}批量添加关键字批量添加关键字有两种方式,一种是通过字典,另一种是另一个是通过数组:fromflashtextimportKeywordProcessor#1。初始化关键字处理器keyword_processor=KeywordProcessor()#2。(第一种)通过字典批量添加关键词keyword_dict={"java":["java_2e","javaprograming"],"productmanagement":["PM","productmanager"]}keyword_processor.add_keywords_from_dict(keyword_dict)#2.(二)通过数组keyword_processor.add_keywords_from_list([“Java”,“蟒蛇”])#3。第一种提取效果如下keyword_processor.extract_keywords('Iamaproductmanagerforajava_2eplatform')#output['productmanagement','java']单个或批量删除关键字也很简单,类似于添加:fromflashtextimportKeywordProcessor#1。初始化关键字处理器keyword_processor=KeywordProcessor()#2。通过字典批量添加关键词keyword_dict={"java":["java_2e","javaprograming"],"productmanagement":["PM","productmanager"]}keyword_processor.add_keywords_from_dict(keyword_dict)#3.提取效果如下print(keyword_processor.extract_keywords('Iamaproductmanagerforajava_2eplatform'))#['productmanagement','java']#4。单个删除关键字keyword_processor.remove_keyword('java_2e')#5。也可以通过字典或数组的形式批量删除关键字keyword_processor.remove_keywords_from_dict({"productmanagement":["PM"]})keyword_processor.remove_keywords_from_list(["javaprograming"])#6.删除javaprograming关键字后的效果如下keyword_processor.extract_keywords('Iamaproductmanagerforjava_2eplatform')#['productmanagement']3.高级使用支持附加信息。前面说过,在添加关键字的时候,第二个参数就是它的别名。实际上,您不仅可以指明别名,还可以将附加信息放入第二个参数中。中间:fromflashtextimportKeywordProcessor#1。初始化关键字处理器kp=KeywordProcessor()#2。添加带有附加信息的关键字kp.add_keyword('TajMahal',('Monument','TajMahal'))kp.add_keyword('Delhi',('Location','Delhi'))#3。效果如下kp.extract_keywords('TajMahalisinDelhi.')#[('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中替换关键字所需的时间比率: