Python基于string模块的translate方法移除文本标点未生效问题
问题根因
- 操作无返回值承接:Python字符串是不可变对象,所有内置的字符串修改类方法都不会改动原字符串,只会返回处理后的新字符串。原代码调用
translate()后没有把返回值存回列表对应位置,整个调用完全没有产生实际效果,标点自然不会消失。 - 列表引用错误:
train_text_new = train_text只是给原列表加了个别名,两个变量指向同一个内存对象,根本没有生成独立的新列表,后续操作很容易连带改动原始训练数据。
修正后的可运行代码
推荐写法(列表推导式实现)
这种写法更简洁,没有循环索引操作的冗余,处理过程也不会改动原列表数据:
import string train_text = ["TEXT!!! TEXT TEXT TEXT, TEXT", "TEXT? TEXT TEXT... TEXT TEXT"] train_text_new = [ text.translate(str.maketrans('', '', string.punctuation)) for text in train_text ]
运行后得到的train_text_new完全匹配预期输出:
["TEXT TEXT TEXT TEXT TEXT", "TEXT TEXT TEXT TEXT TEXT"]
兼容原循环结构的写法
如果需要保留原本的for循环遍历结构,只需要调整两处逻辑即可:
import string train_text = ["TEXT!!! TEXT TEXT TEXT, TEXT", "TEXT? TEXT TEXT... TEXT TEXT"] # 生成原列表的独立副本,避免和原列表共享内存 train_text_new = train_text.copy() for text_idx in range(len(train_text_new)): # 将translate返回的处理结果赋值回对应索引位置 train_text_new[text_idx] = train_text_new[text_idx].translate(str.maketrans('', '', string.punctuation))
补充说明:
string.punctuation覆盖了所有英文场景的常用标点(!?"#$%&'()*+,-./:;<=>?@[\]^_{|}~`),可以满足绝大多数英文文本的标点清理需求,如果需要清理中文标点,可以自行补充自定义的标点集合,传入`maketrans`的第三个参数即可。
内容的提问来源于stack exchange,提问作者Tazz
相关产品推荐
相关产品推荐

