前言
自然语言处理(NLP)是机器学习的应用之一,用于分析、理解和生成自然语言,以便人类与计算机,人类与人类更好的交流。自然语言处理按照任务类型可以分为分类、匹配、翻译、结构化预测、与序贯决策过程这五类。
本篇参考自TensorFlow官方文档,旨在让大家能够通过简单的代码,快速上手自己的第一个nlp模型
1、安装tensorflow环境
-
使用annaconda傻瓜化安装,不会的,可以参考这篇
TensorFlow安装(国内源,速度飞快) -
已经安装的,跳过这一步
2、分词
机器学习之所以看上去可以解决很多复杂的问题,是因为它把这些问题都转化为了数学问题。⽽ NLP 也是相同的思路,⽂本都是⼀些「⾮结构化数据」,我们需要先将这些数据转化为「结构化数据」,结构化数据就可以转化为数学问题了,⽽分词就是转化的第一步。
本篇先以英文为例,中文分词后续会介绍
2.1 分词实例
例:
# 导包
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
# 句子列表
d=[
'i love my dog',
'i love my cat',
'you love me!'
]
tokenizer=Tokenizer(num_words=100) # 实例化一个分词器对象 参数:保留最大单词数,超出则忽略
tokenizer.fit_on_texts(d) # 开始分词 传入一个列表
word_index=tokenizer.word_index # 使用分词器的word_index方法获得分词索引
print(word_index) # 打印分词索引
2.2 分词索引
输出:
从输出结果,我们可以看到:
- 每一个组成句子的单词,都有了自己的索引,也就是相当于“数字化”了
- 即便单词有符号,符号也会自动被过滤掉
3、文本句子转换为数字序列
在 TensorFlow 中,texts_to_sequences
是将文本转换为序列的函数。它可以将一个包含多个句子的文本数据集转换为一个由单个整数组成的序列,每个整数代表该句子在数据集中的位置。
具体来说,texts_to_sequences
函数接受两个参数:
input
:表示输入的文本数据集,通常是一个二维的字符串矩阵,每行代表一个句子。seq_length
:表示每个句子的长度,如果不指定,则默认为最大句子长度。
例:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
d=[
'i love my dog',
'i love my cat',
'you love me!'
]
tokenizer=Tokenizer(num_words=100,oov_token='<OOV>') # 实例化一个分词器对象 参数:保留最大单词数,超出则忽略 oov是没有见过的词
tokenizer.fit_on_texts(d) # 开始分词 传入一个列表
word_index=tokenizer.word_index # 使用分词器的word_index方法获得分词索引
sequences=tokenizer.texts_to_sequences(d) # 使用分词器的texts_to_sequences方法将句子转换为数字序列
print(word_index)
print(sequences)
输出:
- 可以看到句子转换后的序列,与分词索引的对应关系
- oov用于替代句子中有,而语料库中没有的,也就是没有见过的词,以保证句子转序列后长度不变
4、序列填充
为什么要填充,我们看以下几个句子:
我们可以看到,句子的长度是不一样的,这样,转换序列后的长度也肯定是不一样的!
如果数据长度不一致,我们无法进行后续的训练,所以,需要处理成一样的。
例:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
d=[
'i love my dog',
'i love my cat',
'do you think my dog is amazing!'
]
tokenizer=Tokenizer(num_words=100,oov_token='<OOV>') # 实例化一个分词器对象 参数:保留最大单词数,超出则忽略 oov是没有见过的词
tokenizer.fit_on_texts(d) # 开始分词 传入一个列表
word_index=tokenizer.word_index # 使用分词器的word_index方法获得分词索引
print("分词索引:")
print(word_index)
sequences=tokenizer.texts_to_sequences(d) # 使用分词器的texts_to_sequences方法将句子转换为数字序列
print("句子序列:")
print(sequences)
pad=pad_sequences(sequences) # 使用pad_sequences对序列后的数据进行长度一致填充
print("填充处理后的句子序列:")
print(pad)
输出:
可以看到,填充处理后的长度,是一致的。
且长度以所有句子最长那个为准。
我们也可以定义填充函数pad_sequences()
的参数:
- padding: post 填充前面 ,pre 填充后面
- truncating:post 超出长度截断前面 , pre 超出长度截断后面
- maxlen:数字,不看齐最长,指定一个长度
如:pad_sequences(d, padding='post')
下一篇我们一起搭建一个最简单的nlp模型