NLP 教程
NLP 教程:基于 Python 的自然语言处理入门
自然语言处理(Natural Language Processing, NLP)是人工智能的一个分支,专注于让计算机理解和处理人类语言。NLP 广泛应用于文本分类、机器翻译、情感分析、聊天机器人等领域。本教程将介绍 NLP 的基础概念、常用工具和 Python 实现,适合初学者和中级开发者。内容基于 2025 年 10 月的最新技术和工具(以 Python 3.10+ 和主流库为主),并提供可运行代码示例。
1. NLP 核心概念
NLP 涉及从文本数据中提取意义并生成响应,主要任务包括:
- 分词(Tokenization):将文本拆分为单词或子词。
- 词性标注(POS Tagging):为每个词标注词性(如名词、动词)。
- 命名实体识别(NER):识别文本中的实体(如人名、地名)。
- 情感分析(Sentiment Analysis):判断文本情感(正面/负面)。
- 文本分类:将文本分配到预定义类别。
- 词嵌入(Word Embedding):将词转换为向量表示(如 Word2Vec、BERT)。
- 机器翻译/生成:翻译或生成自然语言文本。
2. 环境准备
以下是推荐的 Python 环境和库:
- Python 版本:3.10 或更高(建议通过 Anaconda 或 pyenv 管理)。
- 核心库:
- NLTK:经典 NLP 工具,适合教学和简单任务。
- spaCy:高效、工业级的 NLP 库,支持多语言。
- Transformers (Hugging Face):基于深度学习的预训练模型(如 BERT、GPT)。
- scikit-learn:传统机器学习算法,用于文本分类。
- PyTorch/TensorFlow:深度学习框架,适合自定义模型。
- 安装命令:
pip install nltk spacy transformers scikit-learn torch
python -m spacy download en_core_web_sm # 安装 spaCy 英语模型
- 硬件要求:GPU 可加速 Transformers 模型推理(需安装 CUDA 兼容的 PyTorch)。
3. 基础 NLP 操作
以下是使用 NLTK 和 spaCy 实现常见 NLP 任务的代码示例。
3.1 分词与词性标注
分词将句子拆分为单词,词性标注为每个词分配语法类别。
import nltk
import spacy
from nltk import pos_tag, word_tokenize
下载 NLTK 数据
nltk.download(‘punkt’)
nltk.download(‘averaged_perceptron_tagger’)
示例文本
text = “Apple is launching a new iPhone in San Francisco.”
NLTK 分词与词性标注
def nltk_process(text):
tokens = word_tokenize(text)
pos_tags = pos_tag(tokens)
return tokens, pos_tags
spaCy 分词与词性标注
nlp = spacy.load(“en_core_web_sm”)
def spacy_process(text):
doc = nlp(text)
tokens = [token.text for token in doc]
pos_tags = [(token.text, token.pos_) for token in doc]
return tokens, pos_tags
执行
nltk_tokens, nltk_pos = nltk_process(text)
spacy_tokens, spacy_pos = spacy_process(text)
print(“NLTK 分词:”, nltk_tokens)
print(“NLTK 词性:”, nltk_pos)
print(“spaCy 分词:”, spacy_tokens)
print(“spaCy 词性:”, spacy_pos)
输出示例:
NLTK 分词: ['Apple', 'is', 'launching', 'a', 'new', 'iPhone', 'in', 'San', 'Francisco', '.']
NLTK 词性: [('Apple', 'NNP'), ('is', 'VBZ'), ('launching', 'VBG'), ('a', 'DT'), ...]
spaCy 分词: ['Apple', 'is', 'launching', 'a', 'new', 'iPhone', 'in', 'San', 'Francisco', '.']
spaCy 词性: [('Apple', 'NOUN'), ('is', 'AUX'), ('launching', 'VERB'), ('a', 'DET'), ...]
说明:
- NLTK:简单易用,适合教学,但性能较低。
- spaCy:更快、更准确,支持多语言和 NER。
3.2 命名实体识别(NER)
识别文本中的实体(如人名、地点)。
import spacy
nlp = spacy.load(“en_core_web_sm”)
text = “Apple is launching a new iPhone in San Francisco on October 22, 2025.”
doc = nlp(text)
for ent in doc.ents:
print(f”实体: {ent.text}, 类型: {ent.label_}”)
输出示例:
实体: Apple, 类型: ORG
实体: San Francisco, 类型: GPE
实体: October 22, 2025, 类型: DATE
说明:spaCy 的 NER 模型预训练了常见实体类型(如 ORG、GPE、DATE),适合快速开发。
4. 文本分类(传统机器学习)
使用 scikit-learn 和 TF-IDF 特征进行情感分析。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.pipeline import make_pipeline
import nltk
nltk.download(‘movie_reviews’)
from nltk.corpus import movie_reviews
准备数据
texts = [movie_reviews.raw(fileid) for fileid in movie_reviews.fileids()]
labels = [1 if fileid.startswith(‘pos’) else 0 for fileid in movie_reviews.fileids()]
构建 pipeline
pipeline = make_pipeline(TfidfVectorizer(max_features=5000), LinearSVC())
训练
pipeline.fit(texts[:1500], labels[:1500])
测试
test_text = “This movie is fantastic and highly recommended!”
prediction = pipeline.predict([test_text])[0]
print(f”预测情感: {‘正面’ if prediction == 1 else ‘负面’}”)
说明:
- TF-IDF:将文本转为特征向量,捕捉词的重要性。
- LinearSVC:高效的分类器,适合小数据集。
- 数据集:NLTK 的 movie_reviews 提供正/负评论数据。
5. 深度学习与 Transformers
Hugging Face 的 Transformers 库提供预训练模型(如 BERT),适合复杂任务。
5.1 情感分析(BERT)
使用 BERT 进行情感分析:
from transformers import pipeline
加载预训练 BERT 情感分析模型
classifier = pipeline(“sentiment-analysis”)
测试
text = “This movie is fantastic and highly recommended!”
result = classifier(text)[0]
print(f”情感: {result[‘label’]}, 置信度: {result[‘score’]:.4f}”)
输出示例:
情感: POSITIVE, 置信度: 0.9998
说明:
- pipeline:Hugging Face 提供的简易接口,自动加载模型和分词器。
- 模型:默认使用 DistilBERT,适合快速推理。
5.2 自定义 BERT 模型
训练 BERT 进行文本分类(需要 GPU 加速):
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
import torch
from torch.utils.data import Dataset
自定义数据集
class TextDataset(Dataset):
def init(self, texts, labels, tokenizer, max_len=128):
self.texts = texts
self.labels = labels
self.tokenizer = tokenizer
self.max_len = max_len
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
text = self.texts[idx]
label = self.labels[idx]
encoding = self.tokenizer(text, truncation=True, padding='max_length', max_length=self.max_len, return_tensors='pt')
return {
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
'labels': torch.tensor(label, dtype=torch.long)
}
准备数据
texts = [“This is great!”, “This is terrible.”]
labels = [1, 0]
tokenizer = BertTokenizer.from_pretrained(“bert-base-uncased”)
dataset = TextDataset(texts, labels, tokenizer)
加载模型
model = BertForSequenceClassification.from_pretrained(“bert-base-uncased”, num_labels=2)
训练参数
training_args = TrainingArguments(
output_dir=”./results”,
num_train_epochs=3,
per_device_train_batch_size=8,
logging_steps=10,
save_steps=100,
)
训练
trainer = Trainer(model=model, args=training_args, train_dataset=dataset)
trainer.train()
推理
text = “This movie is fantastic!”
inputs = tokenizer(text, return_tensors=”pt”, truncation=True, padding=True)
outputs = model(**inputs)
prediction = torch.argmax(outputs.logits, dim=1).item()
print(f”预测情感: {‘正面’ if prediction == 1 else ‘负面’}”)
说明:
- BERT:预训练模型,需微调(fine-tuning)以适配任务。
- GPU 加速:训练需要 GPU,推理可在 CPU 上运行。
- 数据量:示例数据较少,实际需数百至数千样本。
6. 性能优化技巧
- NLTK/spaCy:
- 批量处理:对多文本使用
nlp.pipe()(spaCy)以减少开销。 - 缓存模型:加载一次模型,复用推理。
- Transformers:
- 轻量模型:使用 DistilBERT 或 MobileBERT 代替 BERT。
- 量化:启用
torch.quantization或 ONNX 优化推理。 - GPU 加速:配置 PyTorch CUDA(
pip install torch --index-url https://download.pytorch.org/whl/cu118)。 - 内存管理:
- 清理大对象:
del释放内存。 - 使用生成器处理大文本数据集。
7. 注意事项
- 环境配置:确保安装正确版本的 PyTorch/TensorFlow(参考 Hugging Face 安装指南)。
- 数据预处理:清洗文本(去除标点、统一大小写)以提高模型准确性。
- 模型选择:小型项目用 spaCy,复杂任务用 Transformers。
- 多语言支持:spaCy 和 Transformers 支持多语言模型(如
zh_core_web_sm适用于中文)。
8. 进阶学习建议
- 任务扩展:
- 机器翻译:使用
transformers的MarianMT模型。 - 文本生成:尝试 GPT-2 或 LLaMA(需申请访问)。
- 问答系统:使用
pipeline("question-answering")。 - 工具探索:
- Gensim:词嵌入(Word2Vec、FastText)。
- AllenNLP:研究级 NLP 框架。
- 资源:
- Hugging Face 文档:全面的 Transformers 教程。
- spaCy 文档:快速上手指南。
- NLTK 书:免费在线教程。
- CSDN:搜索 “Python NLP 教程”,如 NLP 入门。
如果你需要针对特定任务(如中文 NLP、聊天机器人)或更复杂的实现(如微调 LLaMA),请告诉我,我可以提供更详细的代码和指导!