Python轮子:文本查找替代高效工具~flashtext

原文链接:http://www.juzicode.com/python-module-flashtext

今天给大家介绍一款比正则表达式更高效的文本查找、替换工具:flashtext。

安装和导入

安装仍然是老规矩,pip安装:

pip install flashtext

安装后可以通过pip list查看版本,桔子菌当前安装的是2.7版本:

pip list
......
flashtext                 2.7
......

用法入门

1、查找关键词

首先导入KeywordProcessor类并初始化,然后使用add_keyword()方法添加关键词,最后用extract_keywords()方法搜索关键词,如果找到关键词则会在返回的列表中给出:

#juzicode.com/VX公众号:juzicode

# 导入
from flashtext import KeywordProcessor

# 初始化实例:KeywordProcessor
key_proc = KeywordProcessor()
 
# 在生成的实例中添加关键词
key_proc.add_keyword('python')
key_proc.add_keyword('编程')
key_proc.add_keyword('C++')
 
# extract_keywords()方法搜索关键词,如果找到关键词则会在返回的列表中给出
text = "在juzicode.com可以找到很多有关Python的编程信息."
found = key_proc.extract_keywords(text)

print('text:', text)
print('found:', found)

运行结果:

text: 在juzicode.com可以找到很多有关Python的编程信息.
found: ['python', '编程']

从这个例子可看出,text字符串中存在的’Python’和’编程’ 等关键词在返回结果中,不存在的’C++’没有在返回结果中。

2、对关键词进行替换

如果要查找出关键词并进行替换,则在用add_keyword()方法添加关键词的时候,第2个参数传入替换后的字符串,再使用replace_keywords()方法替换。

#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
 
key_proc = KeywordProcessor()
 
# 添加关键词和替换词
key_proc.add_keyword('Python', 'C++')
key_proc.add_keyword('VX:桔子code', 'VX:juzicode')
 
# 替换关键词
text = "在juzicode.com可以找到很多有关Python的编程信息."
new_text = key_proc.replace_keywords(text)

print('text:', text)
print('new_text:', new_text)

运行结果:

text: 在juzicode.com可以找到很多有关Python的编程信息.
new_text: 在juzicode.com可以找到很多有关C++的编程信息.

 

进阶用法

1、使用列表方式添加关键词

add_keyword()方法每次只能添加一个关键词,如果将关键词组成一个list,再用add_keywords_from_list()方法就可以一次添加多个关键词。

#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
 
key_proc = KeywordProcessor()
 
# 添加关键词
keywords = ['python', '编程', 'VX:桔子code']   
key_proc.add_keywords_from_list(keywords)
# 搜索关键词
text = "在juzicode.com可以找到很多有关Python的编程信息."
found = key_proc.extract_keywords(text)

print('text:', text)
print('found:', found)

运行结果:

text: 在juzicode.com可以找到很多有关Python的编程信息.
found: ['python', '编程']

 2、使用字典方式添加关键词

查找关键词可以用列表的方式一次性添加,如果要替换关键词我们可以使用字典方式一次性构建关键词。

不过这里有个不太符合习惯的地方, 在字典中的key-value组合,其中value是替换前的对象,必须是list类型,既然作为list就可以实现多种字符串替换成一种目标字符串;key则作为替代后的字符串。比如下面的例子中’Python3’和’Python2’是要查找的对象,‘py’则是替代后的对象。这时使用add_keywords_from_dict()方法添加关键词。

#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
key_proc = KeywordProcessor()
 
# 批量添加关键词
keywords = {'py': ['Python3','Python2'], '用户友好': ['强大',], 'cpp': ['C++',]}
key_proc.add_keywords_from_dict(keywords)
 
# 替换关键词
text = "Python3和Python2是一种强大的编程语言."
new_text = key_proc.replace_keywords(text)

print('text:', text)
print('new_text:', new_text)

# 获取所有关键词
print(key_proc.get_all_keywords())

运行结果:

text: Python3和Python2是一种强大的编程语言.
new_text: py和py是一种用户友好的编程语言.
{'python3': 'py', 'python2': 'py', '强大': '用户友好', 'c++': 'cpp'}

3、从文件中添加关键词

使用add_keyword_from_file()方法可以从文件加载关键词列表或者字典,调用该方法时传入保存了关键词的文件路径,默认使用utf8编码读出文件。使用替换方式的文件格式如下,用 => 指明替代关系(如果只是查找关键词则不需要使用=>映射替代关系):

Python3=>py
Python2=>py
强大=>用户友好
C++=>cpp

从文件读出关键词并替换的例子:

#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
key_proc = KeywordProcessor()
 
# 文件方式添加关键词
key_proc.add_keyword_from_file('keywords.txt')
 
# 替换关键词
text = "Python3和Python2是一种强大的编程语言."
new_text = key_proc.replace_keywords(text)

print('text:', text)
print('new_text:', new_text)

# 获取所有关键词
print(key_proc.get_all_keywords())

运行结果:

text: Python3和Python2是一种强大的编程语言.
new_text: py和py是一种用户友好的编程语言.
{'python3': 'py', 'python2': 'py', '强大': '用户友好', 'c++': 'cpp'}

 4、大小写敏感查找

在初始化KeywordProcessor()实例时,传入case_sensitive=True可以实现大小写敏感方式查找关键词。下面的例子中构建了key_proc和key_proc2的2个实例,分别对应了不区分和区分大小写的2种情况。

#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor
 
# 初始化,不区分大小写
key_proc = KeywordProcessor(case_sensitive=False)
key_proc.add_keyword('python')
key_proc.add_keyword('编程')
key_proc.add_keyword('VX:桔子code')
  
# 初始化,区分大小写
key_proc2 = KeywordProcessor(case_sensitive=True)
key_proc2.add_keyword('python')
key_proc2.add_keyword('编程')
key_proc2.add_keyword('VX:桔子CODE')

# extract_keywords()方法搜索关键词
text = "Python是一种强大的编程语言."
found = key_proc.extract_keywords(text)
found2 = key_proc2.extract_keywords(text)
print('text  :', text)
print('found :', found)
print('found2:', found2)
 
print('key_proc关键词  :',key_proc.get_all_keywords())
print('key_proc2关键词 :',key_proc2.get_all_keywords())

运行结果:

text  : Python是一种强大的编程语言.
found : ['python', '编程']
found2: ['编程']
key_proc关键词  : {'python': 'python', '编程': '编程', 'vx:桔子code': 'VX:桔子code'}
key_proc2关键词 : {'python': 'python', '编程': '编程', 'VX:桔子CODE': 'VX:桔子CODE'}

从这个例子可以看出,在初始化KeywordProcessor()实例时如果设置case_sensitive=True,将会按照大小写敏感的方式查找关键词。上例中的key_proc2设置了大小写敏感,所以结果中没有找到全小写的’python’的关键词。

从get_all_keywords()方法返回的关键词字典也可以看到,如果不区分大小写,关键词字典的key值经过了lower()处理。

5、返回关键词的位置

#juzicode.com/VX公众号:juzicode
from flashtext import KeywordProcessor

# 初始化实例:KeywordProcessor
key_proc = KeywordProcessor()
# 在生成的实例中添加关键词
key_proc.add_keyword('python')
key_proc.add_keyword('编程')
key_proc.add_keyword('C++')
 
# extract_keywords()方法搜索关键词
text = "在juzicode.com可以找到很多有关Python的编程信息."
found = key_proc.extract_keywords(text, span_info=True)

print('text:', text)
print('found:', found)

#通过返回字符串位置
for f in found:
    print(f)
    print(text[f[1]:f[2]])  # 第1和第2个元素为返回字符串的起始、结束位置

运行结果:


text: 在juzicode.com可以找到很多有关Python的编程信息.
found: [('python', 21, 27), ('编程', 28, 30)]
('python', 21, 27)
Python
('编程', 28, 30)
编程

 

 

扩展阅读:

  1.  FlashText’s documentation! — FlashText 1.0 documentation

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注