在自然语言处理当中,经常对数据集进行一些数据字符的替换,表情的替换,以便在tokenizer的时候不被识别成[unk],造成信息的缺失
常规方法使用python自带的replace方法实现,但数据量很大时,效率显得低了
比如下面的代码,处理60000条数据需要3+小时
from tqdm.notebook import tqdm emoji_dict = {} with open('/Users/xinyuuliu/Desktop/data/emoji/emoji_map_full.txt') as f_emoji: emojilist = f_emoji.readlines() for em in emojilist: emoji,emoji_str = em.split(maxsplit=1) emoji_dict[emoji] = emoji_str.strip() # print(emoji_dict) bar = tqdm(enumerate(data['text']),total=len(data['text'])) for idx,text in bar: for em in emoji_dict: text = text.replace(em,emoji_dict[em]) data['text'][idx] = text # if idx == 10: # break data
可以看到处理6%的数据已经14分钟了
如何加速,使用flashtext模块,如果会异步就更快了,这里我还没有实现异步
pip install flashtext
from flashtext import KeywordProcessor # 1. 初始化关键字处理器 keyword_processor = KeywordProcessor() # 2. 添加关键词 for em in emoji_dict: keyword_processor.add_keyword(em, emoji_dict[em]) # 3. 替换关键词 bar = tqdm(enumerate(data['text']),total=len(data['text'])) for idx,text in bar: data['text'][idx] = keyword_processor.replace_keywords(text) # 4. 结果 data
可以看到处理7%的数据用了7分钟,明显比replace快了一倍
看下替换效果:
替换完后的数据: