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. 进阶学习建议

  • 任务扩展
  • 机器翻译:使用 transformersMarianMT 模型。
  • 文本生成:尝试 GPT-2 或 LLaMA(需申请访问)。
  • 问答系统:使用 pipeline("question-answering")
  • 工具探索
  • Gensim:词嵌入(Word2Vec、FastText)。
  • AllenNLP:研究级 NLP 框架。
  • 资源
  • Hugging Face 文档:全面的 Transformers 教程。
  • spaCy 文档:快速上手指南。
  • NLTK 书:免费在线教程。
  • CSDN:搜索 “Python NLP 教程”,如 NLP 入门

如果你需要针对特定任务(如中文 NLP、聊天机器人)或更复杂的实现(如微调 LLaMA),请告诉我,我可以提供更详细的代码和指导!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注