计算机怎样读取中文文本:编码、清洗与标准化

文本分类项目看起来是在训练模型,但第一步其实不是模型,而是让计算机正确读取文本。

如果一开始就乱码、混入奇怪符号、空白不统一,后面的分词、TF-IDF 和模型训练都会受到影响。这一课先解决一个基础问题:中文文本进入模型之前,应该怎样读取、清洗和标准化。

文本在计算机里是什么

人看到的是一句话:

text 复制代码
这个课程讲得很清楚。

计算机看到的是一串编码后的数字。编码规则决定了这些数字怎样还原成文字。如果保存文件时用一种编码,读取时却用另一种编码,就可能出现乱码。

常见编码包括:

编码 说明
UTF-8 最推荐,跨平台最常用
GBK 中文 Windows 老文件常见
UTF-8 with BOM 带特殊文件头,某些工具会受影响

初学阶段建议统一使用 UTF-8。

读取 CSV 时先指定编码

Pandas 读取中文 CSV 时,可以显式指定编码:

python 复制代码
import pandas as pd

df = pd.read_csv("data.csv", encoding="utf-8")

如果出现乱码,可以尝试:

python 复制代码
df = pd.read_csv("data.csv", encoding="gbk")

不要看到报错就直接换模型。很多 NLP 项目的第一个问题,其实是文件读取阶段就错了。

先检查文本列

读取数据后,先看几行文本,再看缺失值:

python 复制代码
print(df.head())
print(df["text"].head(10))

print(df["text"].isna().sum())
print(df["label"].isna().sum())

文本列为空、标签为空、标签写法不统一,都会影响训练。

文本里藏着四类暗雷

编码搞对只是第一步。真实的中文文本里还混着几类容易被忽略的问题:

暗雷 现象 处理方式
全半角 ABC 对 ABC,123 对 123 全角字母数字转半角
繁简体 産品、眞的、不錯 统一转简体
HTML 实体 我 代表"我",  代表空格 解码还原
控制字符与零宽字符 \x00 等不可见字符 正则删除

这些字符对人来说几乎看不见,但对分词工具来说就是干扰:jieba 对不同编码、全半角、繁简体的处理方式不一致,不规范输入会得到不规范输出。

一条完整的清洗流水线

把上面四类问题一次性处理掉,可以写成这样一个函数:

python 复制代码
import re
import html
import unicodedata
from opencc import OpenCC  # pip install opencc-python-reimplemented

cc = OpenCC("t2s")  # 繁体转简体,全局初始化一次

def full_normalize(text):
    text = str(text)

    # 1. HTML 实体解码:我 → 我
    text = html.unescape(text)

    # 2. 去掉 HTML 标签:<br>、<p> 等
    text = re.sub(r'<[^>]+>', '', text)

    # 3. 全角字母数字和符号转半角(NFKC 一步搞定)
    text = unicodedata.normalize("NFKC", text)

    # 4. 繁体转简体
    text = cc.convert(text)

    # 5. 去除控制字符(保留 \n \t)
    text = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', text)

    # 6. 去除零宽字符(​ 等)
    text = re.sub(r'[​‌‍]', '', text)

    # 7. 多个连续空格合并成一个
    text = re.sub(r'\s+', ' ', text)

    # 8. 重复标点压缩:!!! → !,??? → ?
    text = re.sub(r'[!!??]{2,}', lambda m: m.group(0)[0], text)

    return text.strip()

其中 unicodedata.normalize("NFKC", text) 一行就能解决大部分全半角问题,比手写逐字符转换更可靠。如果你暂时不想引入 OpenCC,可以删掉第 4 步,等数据里确实有繁体字再加回来。

规范化要在分词之前

清理干净的文本喂给 jieba,分词更准,TF-IDF 向量也更有意义。看一个前后对比:

python 复制代码
raw_text = "&#x6211;&#x4EEC;的産品眞的很不錯!!! 价格也便宜"
cleaned = full_normalize(raw_text)
print("原始:", raw_text)
print("清理:", cleaned)

输出:

text 复制代码
原始: &#x6211;&#x4EEC;的産品眞的很不錯!!! 价格也便宜
清理: 我们的产品真的很不错! 价格也便宜

HTML 实体解码了,繁体转成了简体,重复标点压缩了,现在可以放心进入分词。

要不要删标点、统一大小写

这两件事都取决于任务,没有固定答案。

标点方面,如果是情感分析,感叹号、问号可能携带情绪强度;如果是主题分类,很多标点只是噪声。更稳的做法是先保留标点训练一个 baseline,再尝试删除或统一部分标点,用验证集指标比较效果。

大小写方面,中文本身没有大小写,但中文文本里经常混入英文、产品名、网址、变量名。普通用户评论分类可以考虑统一小写;代码、品牌、专有名词分类不要轻易改大小写。比如 Appleapple 在某些任务里含义可能不同。

标签也要清洗

很多人只清洗文本,忘了标签。标签列可能出现:

text 复制代码
正面
正面 
 正面
positive
POS

这些对人来说可能是同一类,对模型来说却是不同标签。先查看唯一值,再做统一映射:

python 复制代码
print(df["label"].value_counts())

label_map = {
    "正面": "positive",
    "positive": "positive",
    "POS": "positive",
    "负面": "negative",
    "negative": "negative",
}

df["label_clean"] = df["label"].astype(str).str.strip().map(label_map)

标签混乱会直接污染训练目标,必须提前处理。

清洗不要过度

过度清洗可能删掉有用信息:

  • 删除所有数字,可能丢掉价格、日期、版本号;
  • 删除所有英文,可能丢掉产品名;
  • 删除所有标点,可能丢掉情绪强度;
  • 删除停用词,可能误删否定词("不好用"删掉"不"意思就反了)。

所以清洗规则应该随着评估结果和错分样本逐步调整,而不是一开始就堆一堆规则。

这一课先记住

中文文本分类进入分词之前,至少要检查:

text 复制代码
文件编码是否正确
文本列是否为空
标签是否统一
全半角、繁简体、HTML 实体是否清理
空白符是否混乱
清洗规则是否过度

下一课再进入中文分词,看看 jieba 到底怎样把一句话切成模型可以使用的词。


在线阅读

点击这里阅读博客原文

原文地址:https://bestsdz.xyz/posts/chinese-text-encoding-cleaning-normalization/

相关推荐
CIO_Alliance3 小时前
AI+iPaaS解决方案深度整合:让跨系统业务流程自动化一步到位
人工智能·ipaas·系统集成·ai+ipaas·企业cio联盟·企业级ai化转型
苏州IT威翰德3 小时前
算力资产“续命”专家:苏州威翰德科技赋能NVIDIA高端AI芯片芯片级维修
大数据·人工智能
天上路人3 小时前
A59P双波束语音模块:神经网络降噪在远场拾音中的工程实现分析
人工智能·深度学习·神经网络·ai降噪·ai语音·麦克风·回音消除
冬奇Lab3 小时前
AI 评测系列(03):LLM-as-Judge——让 LLM 评价 LLM 的正确姿势
人工智能·llm
Miao121313 小时前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践
大数据·数据库·人工智能
冬奇Lab4 小时前
每日一个开源项目(第164篇):毕昇(BISHENG)- 面向企业的开源 LLM DevOps 平台
人工智能·开源·agent
SeaTunnel4 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
深度研习笔记4 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
CCPC不拿奖不改名4 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github