数据预处理基础:法律文本清洗、分词与词性标注、停用词与法律专有名词处理
各位同学,咱们直接进入正题。
法律案例检索,说白了就是让机器理解法律文书。但原始文本有多乱,做过的人都知道。我刚开始做这个项目时,拿到一份判决书,里面居然混着OCR识别出来的乱码、当事人手写的批注扫描件、还有法院盖章的阴影干扰。嗯,那时候我就明白——数据预处理,才是整个模型优化的地基。
核心观点:法律文本预处理的质量,直接决定后续检索模型的精度。跳过这一步,后面全是白费功夫。
一、法律文本清洗——把垃圾倒掉
你想想看,一份判决书从法院系统导出,经过扫描、OCR、人工录入,再到你手上,中间经过了多少道手?每一道都可能引入噪声。
我个人习惯,清洗分三步走:
- 字符级清洗——去掉不可见字符、控制字符、乱码。比如 \u3000 这种全角空格,还有OCR常见的「■」「●」等符号。
- 格式标准化——全角转半角(除了中文)、统一换行符、合并多余空白行。
- 内容过滤——去掉页眉页脚、案号标记、法院盖章区域的干扰文本。
我的经验:有一次处理一批2000年的旧判决书,里面居然混着「此页无正文」这种排版标记。如果不清理,模型会把「无正文」当成有效内容去检索,结果可想而知。
import re
def clean_legal_text(text):
# 1. 去掉控制字符
text = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f]', '', text)
# 2. 全角转半角(字母数字)
text = text.replace(',', ',').replace('。', '.').replace(';', ';')
text = text.replace('(', '(').replace(')', ')').replace(':', ':')
# 3. 合并多余空白
text = re.sub(r'\s+', ' ', text)
# 4. 去掉常见页眉(如“第1页共10页”)
text = re.sub(r'第\d+页\s*共\d+页', '', text)
return text.strip()
二、分词与词性标注——让机器看懂法律语言
中文分词本身就不容易,法律文本更是难上加难。为什么?因为法律术语往往很长,而且边界模糊。
举个例子:「最高人民法院关于审理民间借贷案件适用法律若干问题的规定」。你让通用分词器去切,大概率切成「最高」「人民法院」「关于」「审理」「民间」「借贷」…… 但法律人眼里,这是一个完整的司法解释名称。
我建议用以下方案:
| 分词工具 | 法律场景表现 | 推荐指数 |
|---|---|---|
| jieba | 速度快,但法律专名识别弱 | ★★★☆☆ |
| pkuseg | 支持领域模型,准确率更高 | ★★★★☆ |
| 哈工大LTP | 词性标注最全,适合深度分析 | ★★★★★ |
注意:千万不要直接用通用分词器处理法律文本。我曾经试过,结果「犯罪嫌疑人」被切成「犯罪」「嫌疑」「人」——这在法律语境下是完全错误的。
词性标注方面,法律文本有几个特殊标签需要关注:
- nz(其他专名)—— 常用于法条名称、司法解释
- nt(机构名)—— 法院、检察院、律所
- nr(人名)—— 当事人、律师、法官
- vn(名动词)—— 如「审理」「判决」「上诉」
import jieba.posseg as pseg
# 加载自定义法律词典
jieba.load_userdict('legal_dict.txt')
text = "根据《中华人民共和国刑法》第二百六十四条,盗窃公私财物数额较大的..."
words = pseg.cut(text)
for word, flag in words:
print(f'{word}/{flag}', end=' ')
# 输出:根据/p 《/w 中华人民共和国/ns 刑法/n 》/w 第二百六十四条/m ,/x 盗窃/vn 公私财物/n 数额/n 较大/a 的/uj ...
三、停用词与法律专有名词处理——该扔的扔,该留的留
停用词处理,说白了就是去掉那些高频但没意义的词。比如「的」「了」「是」「在」——这些词在通用场景下可以去掉。
但法律文本里有个坑:有些词在通用场景是停用词,在法律场景却是关键词。
举个例子:「依照」「鉴于」「 aforesaid(前述)」——这些词在普通文章里可以去掉,但在法律文书中,它们往往承载着重要的逻辑关系。
核心原则:法律文本的停用词表,必须单独构建。不能直接用通用停用词表。
我自己的做法是:
- 从通用停用词表出发,去掉「的」「了」「吗」「呢」等纯语气词
- 保留「依照」「根据」「鉴于」「但是」「然而」等逻辑连接词
- 加入法律特有噪声词,如「第页」「共页」「案号」「文书字号」
法律专有名词处理,这块是重头戏。我建议建立三层词典:
| 词典层级 | 内容示例 | 来源 |
|---|---|---|
| 一级:基础法律术语 | 原告、被告、辩护人、审判长 | 法律教材、法典 |
| 二级:法条与司法解释 | 《民法典》第X条、《刑诉解释》 | 法律法规数据库 |
| 三级:案例专名 | 张三诉李四案、最高检指导案例XX号 | 历史判决文书 |
避坑指南:我曾经在处理一批知识产权案件时,发现「商标权」被切成了「商标」和「权」。后来我在词典里加了「商标权」「专利权」「著作权」这些完整术语,分词准确率从72%直接提升到91%。
最后,给各位一个实用建议:预处理流程一定要做成可配置的pipeline。因为不同法律领域(民事、刑事、行政)的文本特点差异很大。民事判决书喜欢用「原告诉称」,刑事判决书则是「公诉机关指控」——这些差异,都需要在预处理阶段就考虑到。
嗯,数据预处理这块,说白了就是「磨刀不误砍柴工」。你花80%的时间把数据洗干净,后面模型训练和检索优化就会顺畅得多。