深度学习之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 = "灌伤害,骗骗花,拉开距离回回拉,给压压,再开大,压力有点大刚雷,压力大,压力雷,压力像个大暴雷。"
我们要转换为向量表示,需要进行如下步骤:
1、对文本进行分词:
words = jieba.cut(text)
words_unique = list(set(words))
这里我们导入了jieba进行分词操作,如果是英文文本则需要手动使用.join() 将字符串里的单词装进一个列表。
2、构建词表:
words2index = {k: v for v, k in enumerate(words_unique)}
index2words = {k: v for k, v in enumerate(words_unique)}
words2index为词到词索引的映射,词索引对应的向量即为该词对应的数值化后的向量表示;index2words为词索引到文本(即单词本身)的映射。
3、接下来创建词嵌入层:
embedding = nn.Embedding(num_embeddings=len(words2index), embedding_dim=5)
其中,num_embeddings
表示词的数量,也就是词表的大小;embedding_dim
表示使用多少维的向量来表示每个词
4、对词库中每个词进行词向量的映射
for word in words_unique:if word in words2index:index = torch.tensor(words2index[word])vector = embedding(index)print(vector)
整个代码为:
import jieba
import torch.nn as nn
import torchtext = "灌伤害,骗骗花,拉开距离回回拉,给压压,再开大,压力有点大刚雷,压力大,压力雷,压力像个大暴雷。"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类创建模型对象。
首先需要安装包:
pip install gensim
使用API:
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的一些总结笔记,若文章中出现错误请及时指正博主,感谢浏览☆噜~☆