1. 虚拟环境创建与配置
在开始自然语言处理项目前,创建一个独立的Python虚拟环境是必要的。这能确保项目依赖与其他项目隔离,避免版本冲突问题。以下是详细步骤:
bash复制python -m venv nlpbase
source nlpbase/bin/activate # Linux/Mac
nlpbase\Scripts\activate.bat # Windows
安装基础依赖包:
bash复制pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126
提示:使用CUDA 12.6版本的PyTorch可以获得GPU加速支持。如果仅使用CPU,可以去掉
cu126后缀。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文本表示基础概念
2.1 词表与词典的区别
| 维度 | 词表 (Vocabulary) | 词典 (Lexicon) |
|---|---|---|
| 功能 | 文本与ID的映射关系 | 词语属性知识库 |
| 内容 | 仅包含词和对应ID | 包含词性、释义等丰富属性 |
| 用途 | 模型嵌入层的基础 | 语言知识参考 |
实际应用中,词表通常需要覆盖语料库中所有词汇,而词典可以作为外部知识补充。例如"running"在词表中是一个独立token,但在词典中可能关联到基础词"run"。
2.2 文本表示的基本流程
- 分词:将连续文本切分为有意义的词元
- 构建词表:建立词到ID的映射关系
- 向量化:将词转换为数值向量表示
- 序列编码:将词向量序列组合为文本表示
3. 分词技术详解
3.1 英文分词方法
3.1.1 词级分词
传统NLP常用方法,直接按空格和标点分割。主要问题:
- 词形变化导致词表膨胀(run/runs/running)
- 无法处理未登录词(OOV)
3.1.2 字符级分词
将单词拆分为单个字符:
- 优点:彻底解决OOV问题
- 缺点:丢失语义信息,序列过长
3.1.3 子词分词
现代主流方法(BPE/WordPiece等),平衡上述两种方案:
- "unhappiness" → ["un", "happiness"]
- 有效控制词表大小
- 保留语义信息
3.2 中文分词实践
中文没有自然分隔符,需要专门的分词工具。jieba是常用的中文分词库:
python复制import jieba
text = "传智教育是一家上市公司"
# 精确模式
print(jieba.lcut(text, cut_all=False))
# 全模式
print(jieba.lcut(text, cut_all=True))
# 搜索引擎模式
print(jieba.lcut_for_search(text))
自定义词典优化
创建userdict.txt文件,格式为:
code复制黑马程序员 10 n
传智教育 10 n
加载自定义词典:
python复制jieba.load_userdict('userdict.txt')
经验:词典中词频设置越高,该词被优先分出的概率越大。对于专业术语,建议设置较高词频(如10以上)。
4. 词向量表示技术
4.1 One-Hot编码
最简单的词表示方法:
- 词表大小为N,每个词用N维向量表示
- 对应词的位置为1,其余为0
局限性:
- 维度灾难(N可能达10万+)
- 无法表达语义关系
4.2 Word2Vec原理
通过神经网络学习词的分布式表示:
4.2.1 Skip-gram模型
mermaid复制graph LR
A[中心词] --> B[上下文词1]
A --> C[上下文词2]
A --> D[...]
4.2.2 CBOW模型
mermaid复制graph LR
A[上下文词1] --> B[中心词]
C[上下文词2] --> B
D[...] --> B
实际训练时:
- 窗口大小通常设为5-10
- 负采样加速训练
- 词向量维度一般100-300
4.3 Word2Vec实践应用
4.3.1 使用预训练词向量
python复制from gensim.models import KeyedVectors
model = KeyedVectors.load_word2vec_format('sgns.weibo.word')
print(model['北京']) # 获取词向量
print(model.similarity('北京', '上海')) # 计算相似度
4.3.2 训练自定义词向量
python复制from gensim.models import Word2Vec
sentences = [['传智', '教育'], ['黑马', '程序员']]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1)
model.save("word2vec.model")
4.3.3 PyTorch集成
python复制import torch
import torch.nn as nn
# 构建嵌入层
embedding = nn.Embedding.from_pretrained(torch.FloatTensor(model.wv.vectors))
input_ids = torch.LongTensor([model.wv.key_to_index['北京']])
embedded = embedding(input_ids)
避坑指南:实际应用中务必处理OOV问题,可以添加
<unk>token并随机初始化其向量。
5. 进阶文本表示技术
5.1 上下文相关表示
传统Word2Vec是静态词向量,新一代模型如ELMo、BERT等:
- 根据上下文动态调整词表示
- 能更好处理一词多义
- 但计算成本更高
5.2 实践建议
- 小型项目:使用预训练Word2Vec
- 专业领域:自定义训练词向量
- 性能敏感:考虑字符级CNN
- 最先进效果:使用BERT等Transformer模型
6. 完整项目示例
以下是一个电商评论情感分析的数据处理流程:
python复制import pandas as pd
import jieba
from gensim.models import Word2Vec
# 1. 数据加载
df = pd.read_csv('reviews.csv')
texts = df['content'].tolist()
# 2. 中文分词
tokenized = []
for text in texts:
words = [w for w in jieba.lcut(text) if w.strip()]
tokenized.append(words)
# 3. 训练词向量
model = Word2Vec(tokenized, vector_size=100, window=5, min_count=2)
# 4. 构建嵌入矩阵
import numpy as np
vocab_size = len(model.wv)
embed_dim = 100
embed_matrix = np.zeros((vocab_size+1, embed_dim)) # +1 for OOV
for i in range(len(model.wv)):
embed_matrix[i] = model.wv[model.wv.index_to_key[i]]
# 5. 文本向量化
def text_to_vec(text):
words = [w for w in jieba.lcut(text) if w.strip()]
vecs = []
for w in words:
if w in model.wv:
vecs.append(model.wv[w])
return np.mean(vecs, axis=0) if vecs else np.zeros(embed_dim)
性能优化技巧:对于大规模语料,可以使用jieba的并行分词模式
jieba.enable_parallel()加速处理。
通过以上步骤,我们完成了从原始文本到数值向量的完整转换流程,为后续的机器学习模型提供了标准化的输入。在实际项目中,还需要根据具体任务调整词向量维度和分词策略。
