制作中文語料庫時,需刪除文本中的所有標點符號。本文對比正則表達式、字符串翻譯、第三方庫等多種方案的性能與適用場景。
import re
# 方案 A:匹配所有非中英文數字字符(保留字母數字)
def remove_punct_regex(text):
return re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9]', '', text)
# 方案 B:顯式列出中文標點(更精確)
CN_PUNCT = r'[!,。?、;:「」『』()【】《》〈〉……——~·¥\s+]'
def remove_punct_explicit(text):
return re.sub(CN_PUNCT, '', text)
# 方案 C:Unicode 類別 \p{P} (Python 3.6+ regex 模塊)
# pip install regex
import regex
def remove_punct_unicode(text):
return regex.sub(r'\p{P}+', '', text)
import string
# 構建翻譯表:標點 -> None
# 合併 ASCII 標點 + 常用中文標點
punct_map = str.maketrans('', '', string.punctuation + '!,。?、;:「」『』()【】《》〈〉……——~·¥')
def remove_punct_translate(text):
return text.translate(punct_map)
import jieba
def tokenize_no_punct(text):
# jieba 默認會將標點作為單獨詞元輸出
words = jieba.lcut(text)
return [w for w in words if w not in string.punctuation and w not in '!,。?、;:「」『』()【】《》〈〉……——~·¥']
| 方法 | 耗時 | 內存峰值 | 優點 | 缺點 |
|---|---|---|---|---|
| re.sub (方案 A) | ~1.2s | ~50MB | 通用、支持複雜模式 | 較慢、需編譯正則 |
| str.translate | ~0.15s | ~10MB | 極快、C層實現、內存友好 | 只能單字符映射、不支持正則 |
| regex \p{P} | ~0.8s | ~30MB | 完整 Unicode 標點覆蓋 | 需安裝 regex 包 |
| jieba 分詞過濾 | ~3.5s | ~200MB | 同時完成分詞 | 若僅去標點則過重 |
str.translate + 預構建翻譯表jieba 分詞後過濾,一步到位regex 模塊的 \p{P} 覆蓋所有 Unicode 標點若為一次性數據清洗,無需寫代碼:
[!,。?、;:「」『』()【】《》〈〉……——~·¥\p{P}](Notepad++ 需安裝 Unicode 正則插件)| 語料庫 | 特點 | 獲取方式 |
|---|---|---|
| THUCTC (清華) | 中文文本分類,74萬+ 條,含標籤 | GitHub: thunlp/THUCTC |
| SogouCA | 搜狗新聞,290萬+ 文檔,18 大類 | 搜狗實驗室官網申請 |
| Chinese Wikipedia | 中文維基百科全量,開放授權 | dumps.wikimedia.org |
| CLUECorpus2020 | 大規模預訓練語料,100GB+ | GitHub: CLUEbenchmark/CLUECorpus2020 |
| People's Daily 1998 | 經典標註語料,詞性標註 | GitHub 多個復現倉庫 |