【NLP理论到实战】08 自然语言处理基础理论

自然语言处理知识介绍

目标

  1. 知道tokentokenization
  2. 知道N-gram的概念和作用
  3. 知道文本向量化表示的方法

1. 文本的tokenization

1.1 概念和工具的介绍

tokenization就是通常所说的分词,分出的每一个词语我们把它称为token


常见的分词工具很多,比如:

  • jieba分词:https://github.com/fxsjy/jieba
  • 清华大学的分词工具THULAC:https://github.com/thunlp/THULAC-Python

1.2 中英文分词的方法

  • 把句子转化为词语
    • 比如:我爱深度学习 可以分为[我,爱, 深度学习]
  • 把句子转化为单个字
    • 比如:我爱深度学习的token是[我,爱,深,度,学,习]

2. N-gram表示方法

前面我们说,句子可以用但个字,词来表示,但是有的时候,我们可以用2个、3个或者多个词来表示。
N-gram一组一组的词语,其中的N表示能够被一起使用的词的数量
例如:

import jieba

text = "深度学习(英语:deep learning)是机器学习的分支,是一种以人工神经网络为架构,对数据进行表征学习的算法。"
cuted = jieba.lcut(text)
[cuted[i:i+2] for i in range(len(cuted)-1)] #N-gram 中n=2时

"""
[['深度', '学习'],
 ['学习', '('],
 ['(', '英语'],
 ['英语', ':'],
 [':', 'deep'],
 ['deep', ' '],
 [' ', 'learning'],
 ['learning', ')'],
 [')', '是'],
 ['是', '机器'],
 ['机器', '学习'],
 ['学习', '的'],
 ['的', '分支'],
 ['分支', ','],
 [',', '是'],
 ['是', '一种'],
 ['一种', '以'],
 ['以', '人工神经网络'],
 ['人工神经网络', '为'],
 ['为', '架构'],
 ['架构', ','],
 [',', '对'],
 ['对', '数据'],
 ['数据', '进行'],
 ['进行', '表征'],
 ['表征', '学习'],
 ['学习', '的'],
 ['的', '算法'],
 ['算法', '。']]
"""

在传统的机器学习中,使用N-gram方法往往能够取得非常好的效果,但是在深度学习比如RNN中会自带N-gram的效果。

3. 向量化

因为文本不能够直接被模型计算,所以需要将其转化为向量
把文本转化为向量有两种方法:

  1. 转化为one-hot编码
  2. 转化为word embedding

3.1 one-hot 编码

one-hot编码中,每一个token使用一个长度为N的向量表示,N表示词典的数量


即:把待处理的文档进行分词或者是N-gram处理,然后进行去重得到词典,假设我们有一个文档:深度学习,那么进行one-hot处理后的结果如下:

tokenone-hot encoding
1000
0100
0010
0001

3.2 word embedding

word embedding是深度学习中表示文本常用的一种方法。和one-hot编码不同,word embedding使用了浮点型的稠密矩阵来表示token。根据词典的大小,我们的向量通常使用不同的维度,例如100,256,300等。其中向量中的每一个值是一个参数,其初始值是随机生成的,之后会在训练的过程中进行学习而获得


如果我们文本中有20000个词语,如果使用one-hot编码,那么我们会有20000*20000的矩阵,其中大多数的位置都为0,但是如果我们使用word embedding来表示的话,只需要20000*固定长度 维度,比如若固定embedding长度为300,则只需要20000*300维度


形象的表示就是:(其中N表示维度dimension,m表示词典的大小)

tokennumvector
词10 [ w 11 , w 12 , w 13 . . . w 1 N ] [w_{11},w_{12},w_{13}...w_{1N}] [w11,w12,w13...w1N]
词21 [ w 21 , w 22 , w 23 . . . w 2 N ] [w_{21},w_{22},w_{23}...w_{2N}] [w21,w22,w23...w2N]
词32 [ w 31 , w 32 , w 33 . . . w 3 N ] [w_{31},w_{32},w_{33}...w_{3N}] [w31,w32,w33...w3N]
….
词mm [ w m 1 , w m 2 , w m 3 . . . w m N ] [w_{m1},w_{m2},w_{m3}...w_{mN}] [wm1,wm2,wm3...wmN]

最后,我们会把所有的文本转化为向量,把句子用向量来表示


但是在这中间,我们会先把每个词token使用数字来表示,再把数字使用向量来表示。

即:token---> num ---->vector
在这里插入图片描述

3.3 word embedding API

torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx)
参数介绍:

  1. num_embeddings:词典的大小(不重复)
  2. embedding_dim:embedding的维度
  3. padding_idx:设置无用索引,填充为0向量

使用方法:

embedding = nn.Embedding(vocab_size,300) #实例化
input_embeded = embedding(input)         #进行embedding的操作

注:

1、embeddings中的值是正态分布N(0,1)中随机取值。
2、embedding方法获取的向量只是随机初始化的,并不代表任何含义,并且不会有word2vec等训练出来的效果。但是可以利用这样的方法先赋值然后在学习。

3.4 数据的形状变化

思考:每个batch中的每个句子有10个词语,经过形状为[20,4]的Word emebedding之后,原来的句子会变成什么形状?


每个词语用长度为4的向量表示,所以,最终句子会变为[batch_size,10,4]的形状。
即:[batch_size,seq_len]——>[batch_size,sqe_len,embedding_len]


增加了一个维度,这个维度是embedding的dim

如下图示例:
在这里插入图片描述

如下摘自pytorchEmbedding类源码的示例:

embedding = nn.Embedding(10, 3)  # an Embedding module containing 10 tensors of size 3
input = torch.LongTensor([[1,2,4,5],[4,3,2,9]])  # a batch of 2 samples of 4 indices each
embedding(input)

"""
tensor([[[-0.0251, -1.6902,  0.7172],
         [-0.6431,  0.0748,  0.6969],
         [ 1.4970,  1.3448, -0.9685],
         [-0.3677, -2.7265, -0.1685]],
         
        [[ 1.4970,  1.3448, -0.9685],
         [ 0.4362, -0.4004,  0.9400],
         [-0.6431,  0.0748,  0.6969],
         [ 0.9124, -2.3616,  1.1151]]])
"""

4、更多word embedding扩展阅读材料

torch.nn.Embedding理解
PyTorch快速入门教程七(pytorch下RNN如何做自然语言处理)
Word Embedding 知识总结
Word2Vec 与 Word Embedding的关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值