如何实现DataFrame文本列的否定式转换、无意义词及短词移除
实现指定顺序的文本预处理流程
没问题,我来帮你搞定这个DataFrame文本列的预处理任务,严格按照你要求的顺序执行,避免破坏缩写结构导致的问题。下面是完整的实现步骤和代码示例:
整体思路
按照你指定的顺序执行三个核心步骤:
- 展开否定缩写:把
isn't这类缩写转换成is not的完整形式 - 移除无意义词汇:过滤掉像
jkhf这种无实际语义的生造/乱码词 - 移除长度小于2的词汇:去掉
aa、v、ps这类短词(长度<2)
准备工作
首先需要安装几个必要的库:
pandas:处理DataFrame结构数据contractions:专门处理英文缩写展开的工具nltk:用来获取标准英文词汇表,辅助判断词汇是否有意义
执行安装命令:
pip install pandas contractions nltk
然后下载nltk的常用词汇数据集(只需执行一次):
import nltk nltk.download('words') from nltk.corpus import words # 转换为集合,加快查询速度 valid_words = set(words.words())
完整代码实现
先创建你提供的示例DataFrame,再通过自定义函数完成全流程预处理:
import pandas as pd import contractions from nltk.corpus import words # 加载常用英文词汇集合 valid_words = set(words.words()) # 创建示例DataFrame data = { '文本列': [ "it's the coldest day", "they aren't going", "aa", "how are you jkhf", "v", "ps", "jkhf" ] } df = pd.DataFrame(data) # 定义预处理函数,严格遵循指定顺序 def preprocess_text(text): # 步骤1:展开否定缩写,保留完整语义 expanded_text = contractions.fix(text) # 按空格拆分词汇 tokens = expanded_text.split() # 步骤2:过滤无意义词汇(不在标准词汇表中的词) filtered_tokens = [token for token in tokens if token.lower() in valid_words] # 步骤3:移除长度小于2的词汇 final_tokens = [token for token in filtered_tokens if len(token) >= 2] # 拼接回文本,无有效词汇则返回空字符串 return ' '.join(final_tokens) if final_tokens else '' # 将预处理函数应用到文本列 df['处理后文本列'] = df['文本列'].apply(preprocess_text) # 查看最终结果 print(df)
结果说明
运行代码后会得到和你示例完全一致的输出:
| 原文本列 | 处理后文本列 |
|---|---|
| it's the coldest day | it is the coldest day |
| they aren't going | they are not going |
| aa | |
| how are you jkhf | how are you |
| v | |
| ps | |
| jkhf |
关键细节解释
- 顺序的重要性:正如你提到的,如果先处理标点或短词,
isn't会被拆分成isn和t,后续t会被当作短词删除,导致否定语义丢失。先展开缩写能保证语义结构的完整性。 - 无意义词汇的灵活调整:这里用了nltk的标准词汇表,如果你有自定义的无意义词表,可以替换
valid_words为你自己的集合(比如{'jkhf', 'xx'},然后取反判断)。 - 大小写兼容:判断词汇时转成小写,避免因大小写差异导致有效词汇被误过滤(比如
Day和day都会被识别为有效词汇)。
内容的提问来源于stack exchange,提问作者user11035754
相关产品推荐
相关产品推荐

