通常,我们使用Python 在文本中进行关键词查找或替换时,会使用 re 模块以正则的形式实现。在文本数量、文本内容、关键词数量较小时,该方法能够满足我们程序的功能、性能需要。但当在大规模的文本或者对大量关键词语料查找或者替换,re 实现方案的性能将成为瓶颈,本文我们将介绍一种新的关键词搜索和替换的算法:Flashtext 算法,它是一个高效的字符搜索和替换算法。
有多高效呢?如下,是通过随机生方式生成10000个单词组成的文本,我们分别在该文本中查找由 0, 500, 1000, 5000, 10000, 50000, 100000, 200000, 400000 个关键词组成的关键词库,我们来感受一下两者的性能差异:
我们发现随着关键词查询数量的增加,Flashtext 与 re 的时间消耗存在百倍乃至千倍以上的差异 。
为何存在这么大的差异呢?Flashtext 算法的时间复杂度不依赖于查找或替换的字符的数量。如,对于一个文档有 N 个字符,和一个有 M 个词的关键词库,那么时间复杂度就是 O(N) 。而正则匹配的时间复杂度是 O(M * N) 。这也是两者在性能上的差异随着关键词数量增多而拉大的原因。
因此,在一些大数据下的内容检索和替换,我们更倾向于选择 Flashtext 算法 ,比如,自然语言处理领域中数据清洗是一项必须的操作。经常涉及使用标准的关键词替换一些非标准的词,如,将Javascript替换成JavaScript。或者我们需要判断文本中是否存在JavaScript 关键词等等。
接下来,就让我们了解一下,如何使用Flashtext 实现关键词的查找和替换。
FlashText
Flashtext 算法主要分为三部分,我们接下来将对每一部分进行单独分析:
- 构建 Trie 字典
- 关键词搜索
- 关键词替换
构建 Trie 字典 (这部分不理解不影响我们使用Flashtext )
Flashtext 是一种基于 Trie