在路缘石中连接单词和字符嵌入
keras-word-char-embd的Python项目详细描述
在路缘石中嵌入单词/字符
简介
词汇量不足是单词嵌入的缺点。有时同时使用单词和字符特征。首先将一个词中的字符映射到字符嵌入,然后使用双向递归神经层将字符嵌入编码为单个向量。单词的最后一个特征是单词嵌入和编码字符特征的连接。
存储库包含一些函数和一个包装类,可用于生成前几层,这些层对单词和字符的特性进行编码。
安装
pip install keras-word-char-embd
演示
在demo
目录中有一个情绪分析演示。运行以下命令,则您的模型应具有大约70%的精度:
cd demo
./get_data.sh
python sentiment_analysis.py
功能
本节仅介绍函数的基本用法。有关更多详细信息,请参阅演示和描述源代码中函数的文档注释。
get_dicts_generator
函数返回用于生成单词和字符词典的闭包。为了记录每个单词或字符的频率,应该对所有训练语句调用闭包。之后,设置参数return_dict=True
将返回字典。
fromkeras_wc_embdimportget_dicts_generatorsentences=[['All','work','and','no','play'],['makes','Jack','a','dull','boy','.'],]dict_generator=get_dicts_generator(word_min_freq=2,char_min_freq=2,word_ignore_case=False,char_ignore_case=False,)forsentenceinsentences:dict_generator(sentence)word_dict,char_dict,max_word_len=dict_generator(return_dict=True)
您可以自己生成词典,但请确保保存索引0
和<UNK>
的索引。
get_embedding_layer
生成对句子中的单词进行编码的前几层:
importkerasfromkeras_wc_embdimportget_embedding_layerinputs,embd_layer=get_embedding_layer(word_dict_len=len(word_dict),char_dict_len=len(char_dict),max_word_len=max_word_len,word_embd_dim=300,char_embd_dim=50,char_hidden_dim=150,char_hidden_layer_type='lstm',)model=keras.models.Model(inputs=inputs,outputs=embd_layer)model.summary()
embd_layer
的输出形状应该是(None, None, 600)
,它表示批大小、句子长度和编码字特征的长度。
char_hidden_layer_type
可以是'lstm'
、'gru'
、'cnn'
、路缘石层或路缘石层列表。如果使用'cnn'
,请记住将MaskedConv1D
和MaskedFlatten
添加到自定义对象:
importkerasfromkeras_wc_embdimportMaskedConv1D,MaskedFlattenkeras.models.load_model(filepath,custom_objects={'MaskedConv1D':MaskedConv1D,'MaskedFlatten':MaskedFlatten,})
get_batch_input
函数用于生成模型的批输入。
fromkeras_wc_embdimportget_batch_inputword_embd_input,char_embd_input=get_batch_input(sentences,max_word_len=max_word_len,word_dict=word_dict,char_dict=char_dict,)
get_embedding_weights_from_file
加载预先训练的嵌入以初始化嵌入层权重的辅助函数。文件的格式应该类似于手套。
fromkeras_wc_embdimportget_embedding_layer,get_embedding_weights_from_fileword_embd_weights=get_embedding_weights_from_file(word_dict,'glove.6B.100d.txt',ignore_case=True)inputs,embd_layer=get_embedding_layer(word_dict_len=len(word_dict),char_dict_len=len(char_dict),max_word_len=max_word_len,word_embd_dim=300,char_embd_dim=50,char_hidden_dim=150,word_embd_weights=word_embd_weights,char_hidden_layer_type='lstm',)
包装类WordCharEmbd
有一个包装类可以让事情变得更简单。
fromkeras_wc_embdimportWordCharEmbdsentences=[['All','work','and','no','play'],['makes','Jack','a','dull','boy','.'],]wc_embd=WordCharEmbd(word_min_freq=0,char_min_freq=0,word_ignore_case=False,char_ignore_case=False,)forsentenceinsentences:wc_embd.update_dicts(sentence)inputs,embd_layer=wc_embd.get_embedding_layer()lstm_layer=keras.layers.LSTM(units=5,name='LSTM')(embd_layer)softmax_layer=keras.layers.Dense(units=2,activation='softmax',name='Softmax')(lstm_layer)model=keras.models.Model(inputs=inputs,outputs=softmax_layer)model.compile(optimizer='adam',loss=keras.losses.sparse_categorical_crossentropy,metrics=[keras.metrics.sparse_categorical_accuracy],)model.summary()defbatch_generator():whileTrue:yieldwc_embd.get_batch_input(sentences),np.asarray([0,1])model.fit_generator(generator=batch_generator(),steps_per_epoch=200,epochs=1,)
引文
几家报纸也做了同样的事情。就选一个你见过的吧。