You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:48:19