项目链接:https://github.com/vi3k6i5/flashtext
原文:资源 | 十五分钟完成Regex五天任务:FastText,语料库数据快速清理利器

与一些其他的库进行对比:python | 关键词快速匹配检索小工具 pyahocorasick / ahocorapy

感觉,速度好像还是pyahocorasick 更快

安装:

pip install flashtext

文章目录

  • 1 flashText介绍
  • 2 性能
  • 4 函数解读
    • 4.1 新增与关键词查询
    • 4.2 查询与检索
    • 4.3 删除关键词
    • 4.4 KeywordProcessor的一些属性
    • 5 使用案例
  • 6 关键词匹配与pyahocorasick进行对比

1 flashText介绍

参考:Flashtext:大规模数据清洗的利器

正则表达式在一个 10k 的词库中查找 15k 个关键词的时间差不多是 0.165 秒。但是对于 Flashtext 而言只需要 0.002 秒。因此,在这个问题上 Flashtext 的速度大约比正则表达式快 82 倍。

随着我们需要处理的字符越来越多,正则表达式的处理速度几乎都是线性增加的。然而,Flashtext 几乎是一个常量。在本文中,我们将着重讨论正则表达式与 Flashtext 之间的性能区别。我们还将详细的描述 Flashtext 算法及其工作原理,和一些基准测试。

Flashtext 是一种基于 Trie 字典数据结构和 Aho Corasick 的算法。它的工作方式是,首先它将所有相关的关键字作为输入。使用这些关键字建立一个 trie 字典,如下图3所示:

start 和 eot 是两个特殊的字符,用来定义词的边界,这和我们上面提到的正则表达式是一样的。这个 trie 字典就是我们后面要用来搜索和替换的数据结构。

2 性能


4 函数解读

4.1 新增与关键词查询

Flashtext 算法那主要分为三部分,我们接下来将对每一部分进行单独分析:

  • 构建 Trie 字典 KeywordProcessor
  • 新增关键词 add_keyword
  • 关键词抽取 extract_keywords
from flashtext import KeywordProcessor
keyword_processor=KeywordProcessor(case_sensitive=False)
keyword_processor.add_keyword(one_kw,)
keywords_found=keyword_processor.extract_keywords(one_str,span_info=True)
>>> ('健康', 6, 8)

其中:

  • case_sensitive,是否对大小写敏感
  • span_info,是否要返回位置信息

当然,新增关键词还有很多招数:

匹配词归类

add_keyword(word,key) word就会被归类到key,就像{'key':'word'} ,所以匹配到word,会直接显示key

keyword_processor.add_keyword('Taj Mahal', {1:1,2:2})
keyword_processor.add_keyword('Delhi', ('Location', 'Delhi'))
keyword_processor.add_keyword('Delhi', ['Location', 'Delhi'])

与字典一样的新增方式

keyword_processor['apple']='fruits'

可以与字典一样的新增,而与add_keyword(word,key) 一样的效果

批量新增 —— 字典和列表

keyword_dict={"fruit": ["apple", "banana","orange","watermelon"], "ball": ["tennis", "basketball","football"]}
keyword_processor.add_keywords_from_dict(keyword_dict)         # 可以添加dict
keyword_processor.add_keywords_from_list(["fruit", "banana"])  # 可以添加list

add_keywords_from_dictadd_keyword(word,key) 一样,如果匹配到values,则会返回key

4.2 查询与检索

一般用的是:extract_keywords还可以使用replace_keywords

keywords_found=keyword_processor.extract_keywords(one_str,span_info=True)

extract_keywords返回的是匹配到的关键词,而replace_keywords是直接返回一整个句子,相当于关键词定位 + 替换:

# 加载
kw_list=['健康','美味']
keyword_processor=KeywordProcessor()
for kl in kw_list:keyword_processor.add_keyword(kl)
keyword_processor.add_keyword('健康','建康')
# 查询
text="这个菜,真是健康又美味,很健康"
new_sentence=keyword_processor.replace_keywords(text)   # 替换式查询
print(new_sentence)
new_sentence=keyword_processor.extract_keywords(text)   # 关键词检索
print(new_sentence)>>> 这个菜,真是建康又美味,很建康
>>> ['建康', '美味', '建康']

4.3 删除关键词

'''
移除关键词
'''
keyword_processor.remove_keyword('banana')
keyword_processor.remove_keywords_from_dict({"food": ["bread"]})
keyword_processor.remove_keywords_from_list(["basketball"])

4.4 KeywordProcessor的一些属性

KeywordProcessor是trie树,可以:

len(keyword_processor)  # 关键词长度
'LOVE' in keyword_processor  # 判断关键词Love是否在词表中
keyword_processor.get_keyword('apple') # 与dict一样,看apple的key是啥
keyword_processor.get_all_keywords() # 所有的字符,一次性遍历出来

5 使用案例

参考:
Flashtext:大规模数据清洗的利器
超大规模文本数据清洗、查找、匹配神器之python模块flashtext学习使用

关键字提取

>>> from flashtext import KeywordProcessor
>>> keyword_processor = KeywordProcessor()
>>> # keyword_processor.add_keyword(<unclean name>, <standardised name>)
>>> keyword_processor.add_keyword('Big Apple', 'New York')
>>> keyword_processor.add_keyword('Bay Area')
>>> keywords_found = keyword_processor.extract_keywords('I love Big Apple and Bay Area.')
>>> keywords_found
>>> # ['New York', 'Bay Area']

区分大小写字母

>>> from flashtext import KeywordProcessor
>>> keyword_processor = KeywordProcessor(case_sensitive=True)
>>> keyword_processor.add_keyword('Big Apple', 'New York')
>>> keyword_processor.add_keyword('Bay Area')
>>> keywords_found = keyword_processor.extract_keywords('I love big Apple and Bay Area.')
>>> keywords_found
>>> # ['Bay Area']

关键字不清晰

>>> from flashtext import KeywordProcessor
>>> keyword_processor = KeywordProcessor()
>>> keyword_processor.add_keyword('Big Apple')
>>> keyword_processor.add_keyword('Bay Area')
>>> keywords_found = keyword_processor.extract_keywords('I love big Apple and Bay Area.')
>>> keywords_found
>>> # ['Big Apple', 'Bay Area']

同时添加多个关键词

>>> from flashtext import KeywordProcessor
>>> keyword_processor = KeywordProcessor()
>>> keyword_dict = {>>>     "java": ["java_2e", "java programing"],
>>>     "product management": ["PM", "product manager"]
>>> }
>>> # {'clean_name': ['list of unclean names']}
>>> keyword_processor.add_keywords_from_dict(keyword_dict)
>>> # Or add keywords from a list:
>>> keyword_processor.add_keywords_from_list(["java", "python"])
>>> keyword_processor.extract_keywords('I am a product manager for a java_2e platform')
>>> # output ['product management', 'java']

删除关键字

>>> from flashtext import KeywordProcessor
>>> keyword_processor = KeywordProcessor()
>>> keyword_dict = {>>>     "java": ["java_2e", "java programing"],
>>>     "product management": ["PM", "product manager"]
>>> }
>>> keyword_processor.add_keywords_from_dict(keyword_dict)
>>> print(keyword_processor.extract_keywords('I am a product manager for a java_2e platform'))
>>> # output ['product management', 'java']
>>> keyword_processor.remove_keyword('java_2e')
>>> # you can also remove keywords from a list/ dictionary
>>> keyword_processor.remove_keywords_from_dict({"product management": ["PM"]})
>>> keyword_processor.remove_keywords_from_list(["java programing"])
>>> keyword_processor.extract_keywords('I am a product manager for a java_2e platform')
>>> # output ['product management']

6 关键词匹配与pyahocorasick进行对比

import ahocorasick
def build_actree(wordlist):'''AC自动机进行关键词匹配构造AC trie'''actree = ahocorasick.Automaton()         # 初始化trie树for index, word in enumerate(wordlist):actree.add_word(word, (index, word))     # 向trie树中添加单词actree.make_automaton()    # 将trie树转化为Aho-Corasick自动机#self.actree = actreereturn actreedef ac_detect(actree,text):'''AC自动机进行关键词匹配文本匹配'''region_wds = []for w1 in actree.iter(text):if len(w1) > 0:region_wds.append(w1[1][1])return region_wdswordlist = ['健康','减肥']
text = '今天你减肥了吗,今天你健康了吗,减肥 = 健康!'
actree = build_actree(wordlist)
%time ac_detect(actree,text)>>> CPU times: user 10 µs, sys: 3 µs, total: 13 µs
>>> Wall time: 17.4 µs
>>> ['减肥', '健康', '减肥', '健康']

与flashtext进行对比:

from flashtext import KeywordProcessordef build_actree(wordlist):'''AC自动机进行关键词匹配构造AC trie'''actree = KeywordProcessor()for index, word in enumerate(wordlist):actree.add_keyword(word)     # 向trie树中添加单词#self.actree = actreereturn actreedef ac_detect(actree,text,span_info = True):'''AC自动机进行关键词匹配文本匹配'''region_wds = []for w1 in actree.extract_keywords(text,span_info = span_info):if len(w1) > 0:region_wds.append(w1[0])return region_wdswordlist = ['健康','减肥']
text = '今天你减肥了吗,今天你健康了吗,减肥 = 健康!'
actree = build_actree(wordlist)
%time ac_detect(actree,text)>>> CPU times: user 41 µs, sys: 0 ns, total: 41 µs
>>> Wall time: 47.2 µs
>>> ['减肥', '健康', '减肥', '健康']

python︱flashtext高效关键词查找与替换相关推荐

  1. 大量的数据做字符串匹配_Python Flashtext 实现大数据集下高效的关键词查找和替换...

    通常,我们使用Python 在文本中进行关键词查找或替换时,会使用 re 模块以正则的形式实现.在文本数量.文本内容.关键词数量较小时,该方法能够满足我们程序的功能.性能需要.但当在大规模的文本或者对 ...

  2. 用Python在Excel中查找并替换数据

    目录标题 说明 为什么要用python操作 开始操作 openpyxl中文文档 点击直接资料领取 说明 不熟悉基本语法的可以练练基础教程:链接 本文来自:趣学python+python办公 为什么要用 ...

  3. 使用python使用正则表达式进行查找和替换re.sub方法

    前言: 上一篇呢博主大致写了一下python的正则表达式,其余正则呢还可以实现替换删除. re.sub方法 re.sub(pattern, repl, string, count=0 pattern ...

  4. Word处理控件Aspose.Words功能演示:使用 Python 查找和替换 Word 文档中的文本

    很多时候,您需要替换 Word 文档中的特定文本或短语.MS Word 具有针对此类情况的内置功能,您可以一键替换所需的文本.在本文中,您将学习如何使用 Python 以编程方式查找和替换 Word ...

  5. python中文模糊关键词提取 flashtext_python关键词匹配利器FlashText

    在实际开发工作中经常遇到,根据词表或映射表,查找或替换文本中内容,比较简单处理方法就是逐词匹配,这种处理方式不是高效的,而且代码写起来也会感觉很啰嗦,使用FlashText能够很好的帮助我们解决这个问 ...

  6. 在Python中查找和替换文本,玩转Python正则

    最简单的查找替换 在Python中查找和替换非常简单,如果当前对象是一个字符串str时,你可以使用该类型提供的find() 或者index() 方法查找指定的字符,如果能找到则会返回字符第一次出现的索 ...

  7. python字符串之查找与替换_Python字符串操作(查找,替换,分割和连接)方法及其使用...

    str 提供了如下常用的执行查找.替换等操作的方法: startswith():判断字符串是否以指定子串开头. endswith():判断字符串是否以指定子串结尾. find():查找指定子串在字符串 ...

  8. Python 实用技巧之正则表达式查找和替换文本的操作方法

    1.需求 我们想对字符串中的文本做查找和替换. 2.解决方案 对于简单的文本模式,使用str.replace()即可. 例如: 学习python中有什么不懂的地方,小编这里推荐加小编的python学习 ...

  9. python docx 替换文字_在.docx文件-Python中查找和替换文本

    我一直在寻找一种方法来查找和替换docx文件中的文本,但运气不好.我试过docx模块,但没能成功.最后,我使用zipfile模块并替换docx存档中的document.xml文件,得出了下面描述的方法 ...

最新文章

  1. 三、概念数据模型CDM(Conceptual Database Model )
  2. java se 与j2se_关于java:J2EE和J2SE项目之间的区别
  3. SAP 客供料管理初探
  4. android 购物车小美的店,[转载]【小美教程】买菜累啊有木有?购物车用的购物袋教程来啦.........
  5. 从一个实例,一窥docker进程管理
  6. mysql数据库元表_mysql中元数据库information_schema学习之TABLES表
  7. 联想rd650怎么装系统win7_Lenovo g50重装win7系统|U盘重装联想g50笔记本系统
  8. 【原创】利用typeface实现不同字体的调用显示及String转换为Unicode
  9. C#(数据结构):1.顺序表结构(3)
  10. 软件质量管理体系 type:pdf_制造型企业构建完整的质量管理体系的思路要点
  11. [论文评析] ArXiv-2021,Pyramid Vision Transformer A Versatile Backbone for Dense Prediction without Convo
  12. JavaWeb学习(二)Maven
  13. 2003 -服务器没有响应,PowerPoint2003
  14. 使用Uchihash处理恶意软件中的嵌入式哈希
  15. 浙江利捷分析报告(0607)
  16. 操作系统原理(一)操作系统的认识
  17. Scrum板与Kanban如何抉择?ivhbyfphe板与按照drpxcj
  18. focal loss详解
  19. Tensorflow物体检测(Object Detection)
  20. 手机耗电统计app_Android O 新特性:精确统计 APP 电量消耗

热门文章

  1. BZOJ 1607 [Usaco2008 Dec]Patting Heads 轻拍牛头:统计 + 筛法【调和级数】
  2. c++ queue类
  3. mybatis 高级映射 - 一对多查询 - collection
  4. 【转】ARM汇编伪指令介绍
  5. error C2265: 'Unknown' : reference to a zero-sized array is illegal
  6. go语言 Accept error: accept tcp [::]:5551: too many open files;
  7. Linux(CentOS6.4、CentOS6.3)下安装、配置PostgreSQL9.2
  8. 项目管理方面的几个.NET开源项目
  9. 对“流形”最好的讲解在维基
  10. 问题二十六:C++全局变量的使用实例