NLP基础:从词嵌入到语言模型的实践指南

📅 2026/7/26 21:15:49
NLP基础:从词嵌入到语言模型的实践指南
1. NLP基础概念入门从词嵌入到语言模型作为一名NLP工程师我经常被问到如何快速理解自然语言处理的核心概念。今天我就以happy-llm项目的task01为例带大家系统梳理NLP的基础知识体系。这个任务虽然标注为基础但其中蕴含的思维框架对后续深度学习至关重要。NLP自然语言处理是让计算机理解、解释和生成人类语言的技术。不同于编程语言的严格语法自然语言充满歧义和上下文依赖这正是NLP的挑战所在。在Datawhale2603这个学习项目中happy-llm模块从最基础的文本表示方法开始为我们搭建了循序渐进的学习路径。2. 文本表示的核心方法2.1 离散表示从One-hot到词袋模型最早的文本表示方法是One-hot编码。假设我们有一个包含5个词的词汇表[apple,banana,fruit,eat,like]那么apple可以表示为[1,0,0,0,0]。这种方法简单直接但存在两个致命缺陷维度灾难词汇表增长会导致向量维度爆炸语义缺失无法表示词与词之间的关系词袋模型(Bag of Words)在此基础上改进将文档表示为所有词的出现频率。例如句子I like to eat apple可以表示为[1,0,1,1,1]假设词汇表顺序为apple,banana,eat,like,to。我在实际项目中常用sklearn的CountVectorizer实现from sklearn.feature_extraction.text import CountVectorizer corpus [I like to eat apple, apple is a kind of fruit] vectorizer CountVectorizer() X vectorizer.fit_transform(corpus) print(vectorizer.get_feature_names_out()) print(X.toarray())注意词袋模型忽略了词序信息I like apple和apple like I会被表示为相同的向量2.2 分布式表示词嵌入的革命2013年Word2Vec的提出彻底改变了文本表示方式。词嵌入(word embedding)将词语映射到低维连续向量空间语义相似的词会有相近的向量表示。这种分布式表示有三大优势维度固定通常50-300维捕捉语义关系通过余弦相似度计算可进行向量运算如king - man woman ≈ queen在happy-llm项目中我们常用Gensim训练词向量from gensim.models import Word2Vec sentences [[natural, language, processing], [language, model, is, important]] model Word2Vec(sentences, vector_size100, window5, min_count1) print(model.wv[language]) # 输出100维词向量实际应用中我会特别注意这些参数vector_size维度大小根据数据量调整window上下文窗口影响语义捕捉范围min_count词频阈值过滤低频噪声词3. 语言模型的发展脉络3.1 统计语言模型n-gram方法n-gram是基于马尔科夫假设的统计方法预测第n个词出现的概率依赖于前n-1个词。例如bigram(2-gram)模型P(wₙ|w₁...wₙ₋₁) ≈ P(wₙ|wₙ₋₁)在happy-llm的实践环节我们用nltk计算句子的n-gram概率from nltk.lm import MLE from nltk.util import ngrams train_data [list(自然语言处理很有趣), list(深度学习很强大)] n 2 train_ngrams [ngrams(sent, n) for sent in train_data] model MLE(n) model.fit(train_ngrams, vocabulary_text[自,然,语,言,处,理,很,有,趣,深,度,学,习,强,大]) print(model.score(言, [语])) # P(言|语)经验n取值通常2-4太大导致数据稀疏太小捕捉不到长依赖3.2 神经网络语言模型从RNN到Transformer随着深度学习兴起基于神经网络的语言模型逐渐取代统计方法。它们的主要演进路线RNN/LSTM处理变长序列但存在梯度消失问题Seq2Seq编码器-解码器结构适合生成任务Transformer自注意力机制并行处理所有位置在Datawhale2603项目中我们使用PyTorch实现最简单的RNN语言模型import torch import torch.nn as nn class RNNLM(nn.Module): def __init__(self, vocab_size, embed_size, hidden_size): super().__init__() self.embed nn.Embedding(vocab_size, embed_size) self.rnn nn.RNN(embed_size, hidden_size, batch_firstTrue) self.fc nn.Linear(hidden_size, vocab_size) def forward(self, x, h): x self.embed(x) out, h self.rnn(x, h) return self.fc(out), h # 示例使用 vocab_size 10000 model RNNLM(vocab_size, 128, 256) inputs torch.LongTensor([[1,2,3]]) # 输入token id h0 torch.zeros(1, 1, 256) # 初始隐藏状态 output, hn model(inputs, h0)4. 实践中的常见问题与解决4.1 词向量训练不收敛现象损失值波动大或持续不下降 可能原因学习率设置不当太大震荡太小收敛慢数据预处理不充分含大量噪声或特殊字符词频阈值过低包含太多低频词解决方案使用学习率预热(warmup)策略清洗数据统一大小写去除标点设置合理的min_count通常5-104.2 长文本处理效率低当处理长文档时传统方法会遇到瓶颈词袋模型矩阵过于稀疏RNN模型序列过长导致梯度消失我的优化经验使用TF-IDF替代纯词频统计对文档分块处理采用Transformer模型如BERT的段落编码from sklearn.feature_extraction.text import TfidfVectorizer corpus [这是一个长文档...*100, 另一个文档...*50] vectorizer TfidfVectorizer(max_features5000) X vectorizer.fit_transform(corpus) # 自动处理长文本4.3 领域适应性问题通用词向量在专业领域如医疗、法律表现不佳。在happy-llm项目中我们采用以下策略领域数据继续训练使用gensim的continue_training领域术语特殊处理如添加自定义嵌入混合通用与领域词向量# 继续训练示例 medical_sentences [[patient,diagnosis], [treatment,symptom]] model.build_vocab(medical_sentences, updateTrue) model.train(medical_sentences, total_exampleslen(medical_sentences), epochs10)5. 从基础到进阶的学习路径根据Datawhale2603的课程设计我建议的学习顺序掌握文本预处理技术分词、标准化理解不同文本表示方法的特点实现基础的统计语言模型动手训练词向量尝试调整参数搭建简单的神经网络语言模型在具体任务中应用如文本分类对于想深入NLP的同学我特别推荐精读Word2Vec原始论文复现经典的NNLM模型参加Kaggle相关比赛如Spam Detection在happy-llm的后续任务中我们会基于这些基础知识逐步深入到BERT、GPT等现代大语言模型的原理与应用。记住牢固的基础概念理解是应对复杂模型的关键——这也是task01设计的初衷。