在自然語言處理當中,經常對數據集進行一些數據字符的替換,表情的替換,以便在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快了一倍
看下替換效果:
替換完後的數據: