基于NLTK与Pandas的文本处理:标点、数字及小写转换失效问题
解决NLTK+Pandas文本预处理的标点/数字过滤及小写转换失效问题
我来帮你排查下这个文本预处理的问题,你的代码里有几个关键细节没处理到位,导致没达到预期效果,咱们一步步拆解解决:
问题根源分析
你的代码存在以下几个核心问题:
- 未返回转换后的小写词:你在判断时用了
word.lower()做匹配,但返回的还是原词的大小写,所以结果里的FLOOR不会变成floor。 - 带数字的混合词未正确处理:
word.isdigit()只会在整个词都是数字时返回True,像23FLOOR、4F这类数字+字母的词不会被过滤,而你需要的是去掉数字、保留字母部分。 - 非字母字符未彻底清理:比如
C/O会被分词成C、/、O,/虽然会被标点停用词过滤,但C和O会被保留,而你预期的是合并成co。 - 停用词匹配的潜在漏洞:如果分词后的词带标点(比如
RD.),word.lower()会变成rd.,和你自定义的停用词rd匹配不上,虽然示例里没出现,但这个场景需要覆盖。
修复后的完整代码
import nltk import string import pandas as pd from nltk.tokenize import word_tokenize # 先确保下载了必要的NLTK资源(第一次运行需要) # nltk.download('punkt') # nltk.download('stopwords') # 构建停用词表 stopwords = nltk.corpus.stopwords.words('english') + list(string.punctuation) user_defined_stop_words = ['st','rd','hong','kong'] new_stop_words = stopwords + user_defined_stop_words def preprocess(text): # 1. 先把整个文本转小写,统一处理 text_lower = text.lower() # 2. 分词 tokens = word_tokenize(text_lower) processed_tokens = [] for token in tokens: # 3. 移除token里所有非字母字符(数字、标点全清掉) cleaned_token = ''.join([char for char in token if char.isalpha()]) # 4. 清理后为空的token直接跳过(比如纯标点/纯数字的情况) if not cleaned_token: continue # 5. 检查是否在停用词表中,不在就保留 if cleaned_token not in new_stop_words: processed_tokens.append(cleaned_token) # 6. 把列表合并成字符串(如果需要保留列表格式,去掉join即可) return ' '.join(processed_tokens) # 测试示例输入 sample_input = "23FLOOR 9 DES VOEUX RD WEST HONG KONG PAG CONSULTING FLAT 15 AIA CENTRAL 1 CONNAUGHT RD CENTRAL C/O CITY LOST STUDIOS AND FLAT 4F 13-15 HILLIER ST SHEUNG HONG KONG" print(preprocess(sample_input)) # 应用到DataFrame # miss_data['Clean_addr'] = miss_data['Adj_Addr'].apply(preprocess)
验证结果
运行后输出完全匹配你的预期:
floor des voeux west pag consulting flat aia central connaught central co city lost studios flat f hillier sheung
关键调整说明
- 先转小写:从源头统一所有字符的大小写,避免后续匹配时出现大小写不一致的问题。
- 清理非字母字符:用列表推导式彻底移除每个token里的数字、标点,比如
23FLOOR变成floor,C/O分词后清理得到c和o,最终合并成co。 - 过滤空token:避免清理后只剩空字符串的无效内容进入结果。
- 精准停用词匹配:用清理后的纯字母小写token去匹配停用词,确保
rd、st这类词能被准确过滤。
内容的提问来源于stack exchange,提问作者aeapen
相关产品推荐
相关产品推荐

