共计 2950 个字符,预计需要花费 8 分钟才能阅读完成。
为什么学习自然语言处理
自然语言处理 (NLP) 是让计算机理解人类语言的技术,如今已渗透到生活的方方面面——从手机输入法预测、智能客服到医疗病历分析。掌握 NLP 能力,意味着你可以开发自动摘要工具、情感分析系统,甚至对话机器人。BJTU NLP 工具包是北京交通大学开源的中文处理工具,特别适合中文场景下的快速开发。

环境准备
在开始前,我们需要准备好 Python 环境和必要的库。推荐使用 Anaconda 创建虚拟环境:
conda create -n nlp_env python=3.8
conda activate nlp_env
安装 BJTU NLP 工具包和其他依赖:
pip install bjtu-nlp
pip install torch==1.9.0
pip install numpy pandas jieba
文本预处理实战
中文 NLP 的第一步总是文本预处理,主要包括分词和清洗。这里我们使用 BJTU 集成的分词工具:
import jieba
from bjtu_nlp.preprocess import ChineseTextCleaner
# 示例文本
text = "BJTU 的自然语言处理工具包真的很好用!👍"
# 1. 清洗文本(去除标点、特殊符号等)cleaner = ChineseTextCleaner()
cleaned_text = cleaner.clean(text) # 输出: "BJTU 的 自然语言处理 工具包 真的 很好用"
# 2. 使用结巴分词(BJTU 内置增强版)words = jieba.lcut(cleaned_text)
print(words) # ['BJTU', '的', '自然语言处理', '工具包', '真的', '很好用']
# 3. 加载停用词表(BJTU 内置)from bjtu_nlp.utils import load_stopwords
stopwords = load_stopwords()
# 4. 去除停用词
filtered_words = [w for w in words if w not in stopwords]
print(filtered_words) # ['BJTU', '自然语言处理', '工具包', '很好用']
中文分词避坑指南
- 专业术语识别:对于领域特定词汇(如 ”BJTU”),需要使用
jieba.add_word()手动添加 - 新词发现:当处理社交媒体文本时,建议开启 jieba 的
jieba.enable_paddle()模式 - 停用词表定制:不同场景需要不同的停用词,BJTU 提供了
add_stopwords()方法扩展词表
训练词向量
词向量是将词语映射到高维空间的数值表示,是 NLP 的基础组件。我们用 Word2Vec 算法演示:
from bjtu_nlp.embedding import Word2VecTrainer
import logging # 控制日志输出级别
# 准备语料(列表格式,每行是分词后的句子)corpus = [["自然语言", "处理", "很", "有趣"],
["深度学习", "改变", "NLP", "领域"],
["BJTU", "的", "工具包", "方便"]
]
# 配置训练参数
w2v_trainer = Word2VecTrainer(
corpus=corpus,
vector_size=100, # 向量维度
window=5, # 上下文窗口
min_count=1, # 最小词频
workers=4 # 并行线程
)
# 开始训练(自动保存模型)model = w2v_trainer.train("my_word2vec.model")
# 查看词向量
print(model.wv["自然语言"].shape) # (100,)
词向量维度选择
- 小数据集(<1MB 文本):50-100 维
- 中等数据(1MB-100MB):100-300 维
- 大规模数据:300-500 维
文本分类实战
现在我们用 LSTM 实现一个简单的文本分类器。假设我们要区分科技和体育新闻:
import torch
import torch.nn as nn
from bjtu_nlp.models import TextClassifier
# 1. 准备数据集(实际项目应该从文件加载)train_data = [("深度学习 取得 新 突破", "科技"),
("世界杯 决赛 精彩 纷呈", "体育")
]
# 2. 创建词汇表
vocab = {word: idx for idx, word in enumerate(set(" ".join([x[0] for x in train_data]).split()))}
# 3. 定义 LSTM 模型(BJTU 封装版)classifier = TextClassifier(vocab_size=len(vocab),
embed_dim=100,
hidden_dim=64,
num_classes=2
)
# 4. 训练流程(简化版)criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(classifier.parameters())
for epoch in range(10):
for text, label in train_data:
# 文本转索引序列
inputs = torch.tensor([vocab[word] for word in text.split()])
# 前向传播
outputs = classifier(inputs.unsqueeze(0))
loss = criterion(outputs, torch.tensor([0 if label=="科技" else 1]))
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
解决过拟合问题
- 添加 Dropout 层:
nn.Dropout(0.5) - 早停机制:验证集性能不再提升时终止训练
- 数据增强:使用 BJTU 的
text_augmentation模块生成同义句
模型评估
训练完成后需要评估模型效果:
from bjtu_nlp.metrics import ClassificationReport
# 假设有测试集
test_data = [("人工智能 发展 迅速", "科技")]
y_true, y_pred = [], []
for text, label in test_data:
inputs = torch.tensor([vocab.get(word, 0) for word in text.split()])
output = classifier(inputs.unsqueeze(0))
pred = torch.argmax(output).item()
y_true.append(0 if label=="科技" else 1)
y_pred.append(pred)
# 生成评估报告
report = ClassificationReport(y_true, y_pred)
print(report) # 输出准确率、召回率、F1 值
下一步学习建议
- 深入理解 Transformer 架构
- 尝试 BERT 等预训练模型(BJTU 提供简化接口)
- 参加 NLP 竞赛(如天池、Kaggle)
- 阅读论文《Attention Is All You Need》
通过这个项目,我们完成了从原始文本到分类模型的完整流程。BJTU 工具包极大简化了开发过程,但其背后是标准的 NLP 方法论。建议初学者在掌握基础后,逐步过渡到更底层的实现,这对长期发展至关重要。
正文完
