自然语言处理

1、分词器

  • 导入
from tensorflow.keras.preprocessing.text import Tokenizer
  • 创建分词器
tokenizer = Tokenizer(num_words=100)	# 创建100大小的词典
  • 根据数据集分词
    • fit_on_texts将遍历整个文本并创建词典key:value,key为单词,value为单词的编码
    • 这个操作会去除标点符号,和对大小写不敏感
sentences = [
    'I love my dog',
    'I love my cat',
    'You love my dog!',
    'Do you think my dog is amazing?'
]
tokenizer.fit_on_texts(sentences)
  • 查看词典
word_index = tokenizer.word_index
pring(word_index)
  • 输出结果
{'my': 1, 'love': 2, 'i': 3, 'dog': 4, 'cat': 5, 'you': 6, 'do': 7, 'think': 8, 'is': 9, 'amazing': 10}
分词器拓展
  • 查看编码结果
tokenizer_string = tokenizer.encode(sentences[0])
  • 查看解码结果
tokenizer.decode(tokenizer_string)

2、序列化

将上面的sentences序列化
sequences = tokenizer.texts_to_sequences(sentences)
print(sequences)
  • 输出
[[3, 2, 1, 4], [3, 2, 1, 5], [6, 2, 1, 4], [7, 6, 8, 1, 4, 9, 10]]
用新的句子看看序列化效果
test_data = [
    'I really love my dog',
    'my dog loves my manatee'
]
test_seq = tokenizer.texts_to_sequences(test_data)
print(test_data)
  • 输出
[[3, 2, 1, 4], [1, 4, 1]]

如果词典里面没有句子中的词,则句子编码后会丢失部分词

解决句子成分丢失
  • 在创建分词器时,设置一个参数oov_token,后面的符号可以是任何不与单词冲突的符号
tokenizer = Tokenizer(num_words=100, oov_token='<BLK>')	# 创建100大小的词典
  • 输出结果
{'<BLK>': 1, 'my': 2, 'love': 3, 'dog': 4, 'i': 5, 'you': 6, 'cat': 7, 'do': 8, 'think': 9, 'is': 10, 'amazing': 11}
[[5, 1, 3, 2, 4], [2, 4, 1, 2, 1]]
句子补齐——pad_sequences
  • 导入
from tensorflow.keras.preprocessing.sequence import pad_sequences
  • 句子补齐
:sequences 要补齐的句子
:padding 在开头(pre)/末尾(post)补齐,默认为开头
:truncating 当句子超出长度时,从开头(pre)/末尾(post)去掉超出部分,默认为开头
:maxlen 句子长度
padded = pad_sequences(sequences, padding='post', truncating='post', maxlen=5)
print(padded)
  • 输出
原来
[[5, 3, 2, 4], [5, 3, 2, 7], [6, 3, 2, 4], [8, 6, 9, 2, 4, 10, 11]]
句子补齐后
[[5 3 2 4 0]
 [5 3 2 7 0]
 [6 3 2 4 0]
 [8 6 9 2 4]]

3、嵌入

  • Embedding层
这个函数的作用就是,把单词转换为词向量,用于神经网络计算
第一个参数是:单词总数量(词汇表大小)
第二个参数是:单词的词向量维度,比如上面的6表示‘you’,这里第二个参数设置为4的话,那么‘you’:6的词向量就是[x x x x],1*4的向量来表示
tf.keras.layers.Embedding(
    input_dim, output_dim, embeddings_initializer='uniform',
    embeddings_regularizer=None, activity_regularizer=None,
    embeddings_constraint=None, mask_zero=False, input_length=None, **kwargs
)
  • 输出
    • 嵌入的输出是一个二维数组,行和列分别是句子的长度和向量的维度,所以Embedding之后要有Flatten层(或者GlobalAvgPool1D())将结果展平

4、LSTM层

tf.keras.layers.LSTM(
    units, activation='tanh', recurrent_activation='sigmoid',
    use_bias=True, kernel_initializer='glorot_uniform',
    recurrent_initializer='orthogonal',
    bias_initializer='zeros', unit_forget_bias=True,
    kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None,
    activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None,
    bias_constraint=None, dropout=0.0, recurrent_dropout=0.0,
    return_sequences=False, return_state=False, go_backwards=False, stateful=False,
    time_major=False, unroll=False, **kwargs
)

一般用到两个参数,units(输出维度)和return_sequences=True(当前一个LSTM层和后一个LSTM层衔接时,前一个LSTM层需设置return_sequences=True,这样可以确保上一个LSTM层的输出可与下一个LSTM层的输入相匹配),dropout(正则化——随机失活)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐