如何高效替换大量字符串中的聊天俚语缩写为全称?
聊天俚语缩写替换的高效实现方法
问题描述
我需要将字符串中的聊天俚语缩写替换为对应的全称,使用的是包含3000+条数据的聊天俚语缩写数据集。当前使用的Python代码如下:
import pandas as pd slangs = pd.read_csv('slang.csv', index_col=[0]) def expand_slang_acronyms(): word_list = 'foo brb bar'.split(' ') for i in range(len(word_list)): for j in range(len(slangs)): if word_list[i] == slangs.loc[j, 'acronym']: word_list[i] = slangs.loc[j, 'expansion'] print(' '.join(word_list)) # 'foo be right back bar'
单独运行该代码速度尚可,但处理数千条字符串时效率极低,timeit测试100次耗时6.519681000005221,需要更高效的实现方法。
优化方案
核心思路:用字典映射消除嵌套循环
原代码的双重循环时间复杂度为O(n*m)(n为字符串单词数,m为数据集大小),将数据集转换为字典后,可把查找复杂度降到O(1),彻底解决效率问题。
具体实现
1. 基础字典替换版本
import pandas as pd # 一次性加载数据集并转换为字典(仅执行一次) slang_dict = pd.read_csv('slang.csv').set_index('acronym')['expansion'].to_dict() def expand_slang_acronyms(text): word_list = text.split(' ') # 用列表推导式快速替换,字典get方法保留原词(不在字典中的单词不修改) expanded_list = [slang_dict.get(word, word) for word in word_list] return ' '.join(expanded_list) # 测试 print(expand_slang_acronyms('foo brb bar')) # 输出: 'foo be right back bar'
2. 批量处理多条字符串
如果需要处理大量输入字符串,避免重复初始化字典,统一批量处理:
def expand_multiple_texts(text_list): return [expand_slang_acronyms(text) for text in text_list] # 示例:处理1000条字符串 sample_texts = ['foo brb bar'] * 1000 results = expand_multiple_texts(sample_texts)
3. 正则精准替换(避免部分匹配)
如果需要确保只替换独立的缩写单词(比如避免"brb"在"brbxyz"中被误替换),可以用正则表达式:
import re # 构建匹配独立单词的正则模式,转义特殊字符避免匹配错误 pattern = re.compile(r'\b(' + '|'.join(re.escape(key) for key in slang_dict.keys()) + r')\b') def expand_slang_with_regex(text): return pattern.sub(lambda match: slang_dict[match.group(0)], text) # 测试 print(expand_slang_with_regex('foo brb bar brbxyz')) # 输出: 'foo be right back bar brbxyz'
效率说明
转换为字典后,每个单词的查找时间从O(m)降至O(1),处理数千条字符串的速度会有数量级的提升,timeit测试100次的耗时将大幅减少。
内容的提问来源于stack exchange,提问作者teduniq
相关产品推荐
相关产品推荐

