深度学习之NLP基础

NLP(自然语言处理)基础

一、基本概念

NLP = Natural Language Processing(自然语言处理) ,是人工智能和语言学领域的一个分支,它涉及到计算机和人类(自然)语言之间的相互作用。它的主要目标是让计算机能够理解、解释和生成人类语言的数据。NLP结合了计算机科学、人工智能和语言学的技术和理论,旨在填补人与机器之间的交流隔阂。

NLP的核心任务主要为:

任务 说明 示例
1. 分词(Tokenization) 把句子切分成词或子词单元 "我爱NLP"["我", "爱", "NLP"]
2. 词性标注(POS Tagging) 标注每个词的词性 "跑步" → 动词,"苹果" → 名词
3. 命名实体识别(NER) 识别专有名词(人名、地名、组织等) "马云在杭州创立了阿里巴巴" → 马云(人名),杭州(地点),阿里巴巴(组织)
4. 句法分析(Parsing) 分析句子语法结构(主谓宾) 画出依存句法树
5. 语义分析(Semantic Analysis) 理解词语和句子的含义 区分"苹果"是水果还是公司
6. 情感分析(Sentiment Analysis) 判断文本情感倾向 "这电影太棒了!" → 正面
7. 文本分类(Text Classification) 给文本打标签 新闻分类:体育 / 科技 / 娱乐
8. 机器翻译(MT) 不同语言之间翻译 "Hello""你好"
9. 问答系统(QA) 回答用户问题 输入:"谁是爱因斯坦?" 输出:"物理学家..."
10. 文本生成(Text Generation) 自动生成连贯文本 写文章、写诗、聊天机器人
11. 摘要生成(Summarization) 生成文本的简短摘要 将一篇新闻浓缩成一句话

应用方向有:

应用领域 典型产品/场景
智能客服 淘宝客服、银行机器人
搜索引擎 百度、Google 的语义理解
语音助手 Siri、小爱同学、天猫精灵
机器翻译 Google Translate、DeepL、有道翻译
推荐系统 根据评论情感推荐商品
舆情分析 监测社交媒体情绪(如微博、抖音)
智能写作 AI 写新闻、写周报、写文案
医疗 NLP 从病历中提取诊断信息
法律 NLP 合同审查、判例检索

NLP的基本流程如下:

1、语料获取

通过利用搭建好的数据集或第三方语料库、爬取网络数据、购买数据等方法获得文本语料库。

2、语料预处理

(1)去除数据中的非文本内容,如HTML代码中的标签、不需要的标点符号等等。

(2)分词。如果处理的语言种类为中文,需要下载第三方软件如jieba、FoolNlTK、HanLP、THULAC、NLPIR、LTP等。(这里我是在python环境中使用"pip install jieba"安装的jieba进行中文分词)

(3)标注。为分好的词语打赏此类标注,如动词、名词、形容词等,标注方法往往基于标注的算法。

(4)去除停用词。停用词即句子中没必要存在的词,去掉停用词后对理解整个句子的语义没有影响。

3、特征工程

在处理好语料获得干净的词以后,需要将词语转化为特征向量如one-hot编码、词向量等。

4、模型构建

文本向量化后,根据文本分析的需求选择合适的模型进行模型构建,同类模型也需要多准备几个备选用于效果对比。

5、模型训练

模型构建完成后,需要进行模型训练,其中包括模型微调等。训练时可先使用小批量数据进行试验,这样可以避免直接使用大批量数据训练导致训练时间过长等问题。在模型训练的过程中要注意两个问题:一个为在训练集上表现很好,但在测试集上表现很差的过拟合问题;另一个为模型不能很好地拟合数据的欠拟合问题。同时;还要避免出现梯度消失和梯度爆炸问题。

6、模型评估

对训练好的模型效果进行评估。评价指标指主要有准确率(Accuracy)、精确率(Precision)、召回率、F1值、ROC曲线、AUC线等。

二、基础知识

1、词向量

在自然语言处理中,计算机无法直接理解"单词",所以我们需要一种方法把单词转换成 数值化的表示,方便模型处理。词向量就是将每个词映射为一个实数向量的过程。

例如:

单词 词向量(前 5 维示例)
king [0.52, 0.25, 0.13, -0.44, 0.77, ...]
queen [0.50, 0.27, 0.15, -0.43, 0.80, ...]
man [0.45, 0.18, 0.11, -0.40, 0.72, ...]
woman [0.47, 0.20, 0.12, -0.39, 0.74, ...]

在向量空间里我们可以进行类似代数的操作:
king−man+woman≈queen king - man + woman ≈ queen king−man+woman≈queen

也就是说,如果你取 king 的向量减去 man 的向量,再加上 woman 的向量,结果会非常接近 queen 的向量。

这说明 词向量能够捕捉语义关系,比如性别(man ↔ woman)和角色(king ↔ queen)。

2、词嵌入层

词嵌入层---Embedding Layer,从数学原理上:等价于"将词转为 One-Hot 编码,再乘以一个嵌入矩阵",从而生成一个单词的词向量。

在 PyTorch 中,我们可以使用 nn.Embedding 词嵌入层来实现输入词的向量化。

例如:

现在我们有一段文字

text 复制代码
text = "灌伤害,骗骗花,拉开距离回回拉,给压压,再开大,压力有点大刚雷,压力大,压力雷,压力像个大暴雷。"

我们要转换为向量表示,需要进行如下步骤:

1、对文本进行分词:

python 复制代码
words = jieba.cut(text)
words_unique = list(set(words))

这里我们导入了jieba进行分词操作,如果是英文文本则需要手动使用.join() 将字符串里的单词装进一个列表。

2、构建词表:

python 复制代码
words2index = {k: v for v, k in enumerate(words_unique)}
index2words = {k: v for k, v in enumerate(words_unique)}

words2index为词到词索引的映射,词索引对应的向量即为该词对应的数值化后的向量表示;index2words为词索引到文本(即单词本身)的映射。

3、接下来创建词嵌入层:

python 复制代码
embedding = nn.Embedding(num_embeddings=len(words2index), embedding_dim=5)

其中,num_embeddings表示词的数量,也就是词表的大小;embedding_dim表示使用多少维的向量来表示每个词

4、对词库中每个词进行词向量的映射

python 复制代码
for word in words_unique:
    if word in words2index:
        index = torch.tensor(words2index[word])
        vector = embedding(index)
        print(vector)

整个代码为:

python 复制代码
import jieba
import torch.nn as nn
import torch

text = "灌伤害,骗骗花,拉开距离回回拉,给压压,再开大,压力有点大刚雷,压力大,压力雷,压力像个大暴雷。"

words = jieba.cut(text)
words_unique = list(set(words))

words2index = {k: v for v, k in enumerate(words_unique)}
index2words = {k: v for k, v in enumerate(words_unique)}

print(words2index)
print(index2words)

embedding = nn.Embedding(num_embeddings=len(words2index), embedding_dim=5)
for word in words_unique:
    if word in words2index:
        index = torch.tensor(words2index[word])
        vector = embedding(index)
        print(vector)
3、word2vec

Word2Vec最早、最经典的预训练语言模型之一,通过在大规模无标签文本上"预先训练",学习到通用的词向量表示,然后可以用于各种下游 NLP 任务。

预训练模型是指在大量通用文本数据集上训练好的模型,它可以捕捉到语言的广泛特征 ,例如词汇、句法、语境相关性等。这些模型训练完成后,可以在特定的下游任务上进行微调(fine-tuning),以适应特定的应用场景,如情感分析、问答系统、文档摘要等。

在模型初始化阶段,通过 Embedding Layer 映射得到的词向量是随机的 (如果从零开始训练模型),所以可以通过预训练模型得到训练好的具备语义和语境的词向量。

word2vec一般分为**CBOW(Continuous Bag-of-Words)**与 Skip-Gram 两种模型。接下来我们依次介绍这两种模型的实现逻辑。

  • CBOW

连续词袋模型(CBOW)是一种根据上下文单词来预测目标单词的模型。具体来说,给定一个窗口大小为 n 的上下文单词序列,连续词袋模型的任务是预测中间的目标单词。

实现核心:在一个固定大小的窗口中,取目标词(center word)周围的上下文词(context words)作为输入,把它们的词向量求平均(或加和),再通过一个神经网络预测中心词的概率分布。训练时,模型会不断调整词向量,使得"由上下文预测中心词"的概率最大化。

举例:

目标词是 "sat" ,窗口大小为 2,上下文是 [the, cat, on, the]

复制代码
 输入(上下文): the   cat   on   the
                     ↓     ↓     ↓     ↓
                 Embedding 向量化
                     ↓     ↓     ↓     ↓
          ┌─────────── 求平均 ───────────┐
                          ↓
                 隐藏层(线性变换)
                          ↓
                    Softmax输出
                          ↓
              预测目标词: sat

CBOW优点主要为模型参数较少,训练速度相对较快,适合对小型数据库进行训练。

  • Skip-gram

Skip-gram 模型是一种根据目标单词来预测上下文单词的模型。具体来说,给定一个中心单词,Skip-gram 模型的任务是预测在它周围窗口大小为 n 内的上下文单词。

实现核心:通过输入一个中心词,预测它周围的上下文词。也就是说,模型会先将中心词映射到一个低维的词向量空间,然后通过该向量去预测窗口内可能出现的上下文词的概率。训练过程中,模型不断调整词向量,使得在语料库中经常同时出现的词(如 "cat" 和 "dog")的向量更接近,而不相关的词向量则更远。最终得到的就是一个能捕捉语义关系的词向量表示。

复制代码
输入(中心词):    like
                   ↓
Embedding 向量化:
                   ↓
[0.2, -0.5, 0.7]   ← 词向量 (input vector)
                   ↓
隐藏层(线性变换)
                   ↓
Softmax 输出
                   ↓
预测上下文词:     I, drink

Skip-gram模型能够生成更多的训练数据,因此可以更好地训练低频词汇的表示,在处理大规模语料库时效果比 CBOW 模型更好

word2vec的API调用

我们可以使用gensim包里的Word2vec类创建模型对象。

首先需要安装包:

bash 复制代码
pip install gensim

使用API:

python 复制代码
model = Word2Vec(sentence=[words], vector_size=5, window=3, min_count=1, sg=0)

参数表:

参数 说明
sentences 可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或lineSentence构建。
vector_size word向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好。推荐值为几十到几百。
alpha 学习率
window 表示当前词与预测词在一个句子中的最大距离是多少。
min_count 可以对字典做截断。词频少于min_count次数的单词会被丢弃掉,默认值为5。
max_vocab_size 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
sample 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
seed 用于随机数发生器。与初始化词向量有关。
workers 参数控制训练的并行数。
sg 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
hs 如果为1则会采用hierarchica·softmax技巧。如果设置为0(default),则negative sampling会被使用。
negative 如果>0,则会采用negative samping,用于设置多少个noise words。
cbow_mean 如果为0,则采用上下文词向量的和,如果为1(default)则采用均值。只有使用CBOW的时候才起作用。
hashfxn hash函数来初始化权重。默认使用python的hash函数。
epochs 迭代次数,默认为5。
trim_rule 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RULE_DISCARD,utils。RULE_KEEP或者utils。RULE_DEFAULT的函数。
sorted_vocab 如果为1(default),则在分配word index 的时候会先对单词基于频率降序排序。
batch_words 每一批的传递给线程的单词的数量,默认为10000
min_alpha 随着训练的进行,学习率线性下降到min_alpha

一般情况下只关注加粗参数即可。

常用方法:

  • model.wv[word]:返回某个特定单词的向量。

  • model.wv.most_similar(word):获取与某个单词最相似的词。

  • model.wv.similarity(word1, word2):计算两个词之间的相似度。

  • model.save("word2vec.model")

    model = Word2Vec.load("word2vec.model")

    保存和加载模型

以上内容是博主学习NLP的一些总结笔记,若文章中出现错误请及时指正博主,感谢浏览☆噜~☆

相关推荐
AI扶我青云志2 小时前
Milvus 安装和启动指南
人工智能·云原生·eureka·大模型
一只齐刘海的猫2 小时前
部署Qwen2.5-VL-7B-Instruct-GPTQ-Int3
人工智能·多模态
weixin_582470173 小时前
GS-IR:3D 高斯喷溅用于逆向渲染
人工智能·算法
Hao想睡觉3 小时前
循环神经网络实战:用 LSTM 做中文情感分析(二)
rnn·深度学习·lstm
GetcharZp4 小时前
玩转AI绘画,你只差一个节点式“魔法”工具——ComfyUI 保姆级入门指南
人工智能·stable diffusion
一休哥助手4 小时前
Naive RAG:简单而高效的检索增强生成架构解析与实践指南
运维·人工智能·架构
机器之心5 小时前
究竟会花落谁家?DeepSeek最新大模型瞄准了下一代国产AI芯片
人工智能·openai
赵英英俊5 小时前
Python day51
人工智能·pytorch·python
双向335 小时前
金融风控AI引擎:实时反欺诈系统的架构设计与实现
人工智能