【知识点】自然语言处理
文章目录自然语言处理1、分词器分词器拓展2、序列化将上面的sentences序列化用新的句子看看序列化效果解决句子成分丢失句子补齐——pad_sequences3、嵌入4、LSTM层自然语言处理1、分词器导入from tensorflow.keras.preprocessing.text import Tokenizer创建分词器tokenizer = Tokenizer(num_words=10
·
自然语言处理
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(正则化——随机失活)
更多推荐
已为社区贡献1条内容
所有评论(0)