文本预处理基础:中文分词技术、停用词过滤与文本清洗
各位同学好,今天我们聊聊文本预处理。说实话,这是NLP里最枯燥、但也是最关键的一环。我见过太多人一上来就调模型,结果数据没洗干净,跑出来的结果一塌糊涂。嗯,咱们先把地基打牢。
核心观点:文本预处理的质量,直接决定了后续分析的成败。你想想看,垃圾进垃圾出,这个道理在NLP里特别明显。
一、中文分词技术:Jieba与HanLP
中文分词,说白了就是把一句话切成有意义的词。英文天然有空格分隔,中文可没有。我刚开始做研报分析时,遇到「中国人民银行」这种词,要是切成了「中国/人民/银行」,那意思就全变了。
1.1 Jieba分词:入门首选
Jieba是我用得最多的工具。它支持三种模式,我给大家列个表对比一下:
| 模式 | 特点 | 适用场景 |
|---|---|---|
| 精确模式 | 最精准,不冗余 | 研报正文分析 |
| 全模式 | 把所有可能的词都找出来 | 关键词提取 |
| 搜索引擎模式 | 在精确模式基础上再切长词 | 搜索场景 |
import jieba
# 精确模式(我最常用的)
text = "中国人民银行发布2024年金融统计数据"
words = jieba.lcut(text)
print(words)
# 输出:['中国人民银行', '发布', '2024年', '金融', '统计', '数据']
# 添加自定义词典(避坑指南)
jieba.add_word("金融科技")
jieba.add_word("量化宽松")
我的经验:做研报分析时,一定要加自定义词典。我曾经因为没加「量化宽松」这个词,结果被切成了「量化/宽松」,整个分析方向都偏了。
1.2 HanLP:更专业的方案
HanLP比Jieba更重,但功能也更强大。它支持词性标注、命名实体识别,这些在研报分析里特别有用。
from hanlp import HanLP
# 词性标注
result = HanLP.segment("美联储加息预期升温")
for word, pos in result:
print(f"{word}/{pos}")
# 输出:美联储/nt 加息/v 预期/n 升温/v
为什么会推荐HanLP?因为研报里经常出现「美联储」「欧央行」这类专有名词,HanLP的命名实体识别能直接把它们标出来。
二、停用词过滤:去掉噪音
停用词,就是那些高频但没实际意义的词。比如「的」「了」「在」「是」。你想想看,如果不去掉这些词,词频统计里全是它们,真正的关键词反而被淹没了。
我一般用哈工大停用词表,再结合业务场景自己加一些。比如研报里常见的「我们认为」「综上所述」这类套话,也可以加到停用词里。
# 加载停用词表
stop_words = set()
with open('stopwords.txt', 'r', encoding='utf-8') as f:
for line in f:
stop_words.add(line.strip())
# 过滤停用词
words = ['我们', '认为', '市场', '的', '走势', '良好']
filtered = [w for w in words if w not in stop_words]
print(filtered)
# 输出:['市场', '走势', '良好']
注意:停用词表不是万能的。我曾经在分析某行业研报时,发现「风险」这个词被误删了——因为它在通用停用词表里。所以一定要根据业务场景调整。
三、文本清洗与正则表达式
文本清洗,说白了就是把脏数据弄干净。研报数据有多脏?我举个例子:
- 全角半角混用(“ ” vs " ")
- 多余的空格、换行
- HTML标签残留(<br>、<p>)
- 特殊符号(★、◆、※)
正则表达式是处理这些问题的利器。我刚开始学的时候觉得它像天书,但用多了发现,其实就是几个核心套路。
import re
# 常见清洗操作
text = " ★ 美联储 加息 25个基点 ◆ "
# 1. 去除多余空格
text = re.sub(r'\s+', ' ', text)
# 2. 去除特殊符号
text = re.sub(r'[★◆※]', '', text)
# 3. 去除HTML标签
text = re.sub(r'<[^>]+>', '', text)
# 4. 统一全角半角
text = text.replace(',', ',').replace('。', '.')
print(text.strip())
# 输出:美联储 加息 25个基点
避坑指南:我曾经在处理一批PDF转出来的研报时,发现里面有很多不可见字符(\u200b)。这种字符用肉眼根本看不出来,但会影响分词结果。建议清洗时加上:text = re.sub(r'[\u200b\u200c\u200d]', '', text)
四、知识体系总览
下面这张图,是我自己总结的文本预处理流程。每次做项目前,我都会对照着检查一遍:
这个流程看起来简单,但每个环节都有坑。我建议你拿到数据后,先打印几行看看,心里有个数再动手。
五、实战建议
最后,给大家几个我在项目中总结的经验:
- 先清洗,再分词。顺序很重要。脏数据会影响分词效果。
- 自定义词典要持续迭代。我每做一个新领域的研报,都会先跑一遍看看哪些词没被正确识别,然后加到词典里。
- 停用词表要动态调整。不同行业的研报,停用词不一样。比如医药研报里的「患者」「临床」就不能删。
- 正则表达式要测试。我习惯写一个测试函数,把各种边界情况都跑一遍,确保不会误删有用信息。
记住:预处理做得好,后续分析事半功倍。预处理做得差,模型再牛也白搭。