使用Wordninja处理文本时,如何避免拆分浮点数?
解决wordninja拆分浮点数的问题
可以通过先暂存浮点数、处理后恢复的思路解决这个问题——先把文本里的浮点数用占位符替换,等wordninja完成单词拆分后,再把占位符换回原始浮点数,具体实现如下:
实现思路
- 用正则匹配文本中所有常见格式的浮点数(比如
1.23、.45、67.) - 把匹配到的浮点数替换成唯一占位符,同时记录占位符与浮点数的映射关系
- 对替换后的文本执行wordninja拆分
- 将拆分结果中的占位符还原为原始浮点数
修改后的完整代码
import wordninja import re def split_adjacent_words(description): # 匹配常见浮点数格式的正则表达式 float_pattern = re.compile(r'\d+\.\d*|\.\d+|\d+\.') float_map = {} placeholder_count = 0 # 定义回调函数:替换浮点数为唯一占位符,并记录映射 def replace_float(match): nonlocal placeholder_count placeholder = f"__FLOAT_{placeholder_count}__" float_map[placeholder] = match.group() placeholder_count += 1 return placeholder # 替换文本中的浮点数为占位符 temp_text = float_pattern.sub(replace_float, description) # 执行wordninja单词拆分 split_words = wordninja.split(temp_text) # 还原占位符为原始浮点数 final_words = [float_map.get(word, word) for word in split_words] return " ".join(final_words) # 应用到DataFrame(自动跳过空值) df['description_clean'] = df['description'].dropna().apply(split_adjacent_words)
细节说明
- 正则表达式
\d+\.\d*|\.\d+|\d+\.覆盖了大部分常见浮点数格式,如果你的数据里有带千分位的浮点数(比如1,234.56),可以调整正则为\d{1,3}(,\d{3})*\.\d*|\.\d+|\d{1,3}(,\d{3})*\.)来匹配 - 占位符采用
__FLOAT_{数字}__的格式,能有效避免和文本中的正常单词冲突 - 测试示例:输入文本
"thisisaproductwith2.5kgweight",处理后会得到"this is a product with 2.5 kg weight",浮点数完整保留未被拆分
内容的提问来源于stack exchange,提问作者hande gülbağcı
相关产品推荐
相关产品推荐

