今天在找资料的时候无意间查找一个跟眼下工作不太相关但是一眼看到就很感兴趣的内容,讲解的是文本中数据的查找替换等的一个操作工具。之前做了比较多的相关的工作是网页html处理的工作,这里经常替换或者查找指定文本字符串的时候我们都是采用正则表达式的方法来完成的,书写相对来说也是比较灵活的,直到今天发现了flashtext,我才意识到原来同样的事情可以用不一样的方式提高很多的效率也更加便捷了。
鉴于工作时间的限制这里没有太多时间去分析原算法作者的思路,这里先给出来原作者论文地址:
Replace or Retrieve Keywords In Documents At Scale
如果对这方面感兴趣的话可以下载来看看,论文也是比较简洁的,但是这丝毫不妨碍flashtext的强大。
在Github社区已经有flashtext的实现,具体可以看这里。
对于flashtext的介绍可以看这篇博客。
我今天主要是依据官网文档的介绍简单的使用一下,因为接下来的工作里很可能就会使用到,所以先学会实用为主。
下面是具体的实践,相应地注释都已经加上了。
#!usr/bin/env python
# encoding:utf-8
'''
__Author__:沂水寒城
功能: flashText 学习使用
地址: https://github.com/yishuihanhan/flashtext
介绍: 在文本处理工作中,经常会遇上要替换一些字符串我们使用re正则
表达式或者是其他方法都可以完成这项工作,但是处理时间会随着
数据量的增大而增大,flashText提供了一种新颖的解决思路,可以
保证无论数据量多大处理的时间都是不变的(突显数据结构和算
法的强大)
'''
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
from flashtext import KeywordProcessor
def extractKW(one_str):
'''
关键词抽取
'''
kw_list=['Baby','Honest','APPLE','orange','Banana']
keyword_processor=KeywordProcessor()
for one_kw in kw_list:
keyword_processor.add_keyword(one_kw)
keywords_found=keyword_processor.extract_keywords(one_str)
print 'keywords_found: '
print keywords_found
def replaceKW(one_str):
'''
关键词替换
'''
kw_list=['Baby','Honest','APPLE','orange','Banana']
keyword_processor=KeywordProcessor()
for one_kw in kw_list:
keyword_processor.add_keyword(one_kw)
#第一个参数是原有的关键词,第二个参数是新指定替换的关键词
keyword_processor.add_keyword('apple','Basketball')
keyword_processor.add_keyword('orange','tennis')
new_sentence=keyword_processor.replace_keywords(one_str)
print 'old_sentence: '
print one_str
print 'new_sentence: '
print new_sentence
def IgnoreKW(one_str):
'''
忽略指定关键词
'''
keyword_processor=KeywordProcessor(case_sensitive=True)
keyword_processor.add_keyword('Apple','HUAWEI')
keyword_processor.add_keyword('orange')
keywords_found=keyword_processor.extract_keywords(one_str)
print 'keywords_found: '
print keywords_found
print '——|'*10
keyword_processor=KeywordProcessor(case_sensitive=False)
keyword_processor.add_keyword('Apple','HUAWEI')
keyword_processor.add_keyword('orange')
keywords_found=keyword_processor.extract_keywords(one_str)
print 'keywords_found: '
print keywords_found
def spanKW(one_str):
'''
跨度关键词抽取,即:返回结果中不仅包含关键词,还包含关键词的起、止位置索引信息
'''
keyword_processor=KeywordProcessor()
keyword_processor.add_keyword('Apple','HUAWEI')
keyword_processor.add_keyword('orange')
keywords_found=keyword_processor.extract_keywords(one_str,span_info=True)
print 'keywords_found: '
print keywords_found
def extraInfo():
'''
基于关键词抽取获取额外的信息
'''
keyword_processor=KeywordProcessor()
keyword_processor.add_keyword('Taj Mahal', ('Monument', 'Taj Mahal'))
keyword_processor.add_keyword('Delhi', ('Location', 'Delhi'))
res=keyword_processor.extract_keywords('Taj Mahal is in Delhi.')
print 'res: '
print res
def cleanKW(one_str):
'''
No clean name for Keywords
官方文档的解释,没看出来跟直接抽取有什么不同
'''
keyword_processor=KeywordProcessor()
keyword_processor.add_keyword('Apple')
keyword_processor.add_keyword('orange')
keywords_found = keyword_processor.extract_keywords(one_str)
print 'keywords_found: '
print keywords_found
def addMoreKWs():
'''
一次性添加多个关键词
'''
keyword_processor=KeywordProcessor()
keyword_dict={
"fruit": ["apple", "banana","orange","watermelon"],
"ball": ["tennis", "basketball","football"]
}
keyword_processor.add_keywords_from_dict(keyword_dict)
keyword_processor.add_keywords_from_list(["apple", "banana"])
res=keyword_processor.extract_keywords('I like apple and watermelon but football')
print 'res:'
print res
def removeKW():
'''
移除关键词
'''
keyword_processor = KeywordProcessor()
keyword_dict={
"fruit": ["apple", "banana","orange","watermelon"],
"ball": ["tennis", "basketball","football"]
}
keyword_processor.add_keywords_from_dict(keyword_dict)
print(keyword_processor.extract_keywords('I like apple and watermelon'))
keyword_processor.remove_keyword('banana')
keyword_processor.remove_keywords_from_dict({"food": ["bread"]})
keyword_processor.remove_keywords_from_list(["basketball"])
res=keyword_processor.extract_keywords('I am a basketball player and like orange')
print 'res:'
print res
def countNUM():
'''
计数
'''
keyword_processor=KeywordProcessor()
keyword_dict={
"fruit": ["apple", "banana","orange","watermelon"],
"ball": ["tennis", "basketball","football"]
}
keyword_processor.add_keywords_from_dict(keyword_dict)
print 'kw_nums: '
print len(keyword_processor)
def checkExists():
'''
检查当前处理器中指定关键词是否存在
'''
keyword_processor = KeywordProcessor()
keyword_processor.add_keyword('BABY', 'LOVE')
print 'LOVE' in keyword_processor
keyword_processor.get_keyword('apple')
keyword_processor['orange']='orange'
print keyword_processor['orange']
def getAllKW():
'''
获取处理器中所有的关键词
'''
keyword_processor = KeywordProcessor()
keyword_processor.add_keyword('BABY', 'LOVE')
keyword_processor.add_keyword('apple', 'orange')
keyword_processor.add_keyword('big', 'small')
print keyword_processor.get_all_keywords()
def changeKW():
'''
设置或添加字符作为单词字符的一部分,即:改变原有的关键词
'''
keyword_processor=KeywordProcessor()
keyword_processor.add_keyword('Apple')
before_kw=keyword_processor.extract_keywords('I love Apple/And orange.')
keyword_processor.add_non_word_boundary('/')
after_kw=keyword_processor.extract_keywords('I love Apple/And orange.')
print 'before_kw: '
print before_kw
print 'after_kw: '
print after_kw
if __name__=='__main__':
one_str="BABY,I like apple,do you like orange?"
extractKW(one_str)
print '-*'*50
replaceKW(one_str)
print '-*'*50
IgnoreKW(one_str)
print '-*'*50
spanKW(one_str)
print '-*'*50
extraInfo()
print '-*'*50
cleanKW(one_str)
print '-*'*50
addMoreKWs()
print '-*'*50
removeKW()
print '-*'*50
countNUM()
print '-*'*50
checkExists()
print '-*'*50
getAllKW()
print '-*'*50
changeKW()
print '-*'*50
结果如下:
keywords_found:
['Baby', 'APPLE', 'orange']
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
old_sentence:
BABY,I like apple,do you like orange?
new_sentence:
Baby,I like Basketball,do you like tennis?
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
keywords_found:
['orange']
——|——|——|——|——|——|——|——|——|——|
keywords_found:
['HUAWEI', 'orange']
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
keywords_found:
[('HUAWEI', 12, 17), ('orange', 30, 36)]
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
res:
[('Monument', 'Taj Mahal'), ('Location', 'Delhi')]
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
keywords_found:
['Apple', 'orange']
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
res:
['apple', 'fruit', 'ball']
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
['fruit', 'fruit']
res:
['fruit']
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
kw_nums:
7
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
False
orange
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
{'baby': 'LOVE', 'big': 'small', 'apple': 'orange'}
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
before_kw:
['Apple']
after_kw:
[]
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
[Finished in 0.1s]
觉得还是蛮不错的,之后有时间继续研究学习。