简介:本文详细介绍NLP中文本预处理的完整流程,涵盖数据清洗、分词、标准化、特征提取等关键步骤,提供可操作的代码示例和实用建议。
文本预处理是自然语言处理(NLP)任务的基础环节,直接影响模型性能和训练效率。据统计,数据科学家在NLP项目中平均花费40%的时间在预处理阶段。有效的预处理能将模型准确率提升15%-30%,尤其在低资源场景下效果更为显著。本文将系统梳理文本预处理的全流程,从原始文本到可输入模型的数值特征,提供端到端的解决方案。
re.sub(r'[^\w\s]', '', text)移除非字母数字字符,但需保留标点符号(如句号、逗号)对语义的影响。get_text()方法或re.sub(r'<[^>]+>', '', text)快速剥离标签。<URL>和<EMAIL>标记,保留语义信息同时减少噪声。text.lower())或保留大小写(如命名实体识别)。
def normalize_numbers(text):text = re.sub(r'(?<!\d)\d{1,3}(?:,\d{3})*(?!\d)',lambda m: m.group().replace(',', ''), text)text = re.sub(r'\d+(st|nd|rd|th)',lambda m: f"{int(m.group()[:-2])} {'first' if 'st' in m.group() else 'second' if 'nd' in m.group() else 'third' if 'rd' in m.group() else 'nth'}", text)return text
from nltk.stem import PorterStemmerstemmer = PorterStemmer()print(stemmer.stem("running")) # 输出: run
from nltk.stem import WordNetLemmatizerlemmatizer = WordNetLemmatizer()print(lemmatizer.lemmatize("better", pos="a")) # 输出: good
from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer()X = vectorizer.fit_transform(["This is a sentence.", "Another example."])
from sklearn.feature_extraction.text import TfidfVectorizertfidf = TfidfVectorizer()X_tfidf = tfidf.fit_transform(["common word", "rare term"])
from transformers import BertTokenizer, BertModeltokenizer = BertTokenizer.from_pretrained('bert-base-uncased')model = BertModel.from_pretrained('bert-base-uncased')inputs = tokenizer("Hello world!", return_tensors="pt")outputs = model(**inputs)last_hidden_states = outputs.last_hidden_state
Pipeline或自定义类封装预处理步骤。
from sklearn.pipeline import Pipelinepipeline = Pipeline([('cleaner', TextCleaner()), # 自定义清洗类('vectorizer', TfidfVectorizer()),('classifier', LogisticRegression())])
通过系统化的文本预处理,开发者能显著提升NLP模型的效率和效果。建议从简单方法(如TF-IDF)开始,逐步引入复杂技术(如BERT嵌入),在性能与计算成本间找到平衡点。