在路缘石中连接单词和字符嵌入

keras-word-char-embd的Python项目详细描述


在路缘石中嵌入单词/字符

TravisCoverage

简介

image

词汇量不足是单词嵌入的缺点。有时同时使用单词和字符特征。首先将一个词中的字符映射到字符嵌入,然后使用双向递归神经层将字符嵌入编码为单个向量。单词的最后一个特征是单词嵌入和编码字符特征的连接。

存储库包含一些函数和一个包装类,可用于生成前几层,这些层对单词和字符的特性进行编码。

安装

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',请记住将MaskedConv1DMaskedFlatten添加到自定义对象:

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,)

引文

几家报纸也做了同样的事情。就选一个你见过的吧。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为textview创建选定状态(突出显示)   Java Hibernate计数行   Java语言中的字符串比较   java为什么SparkLauncher会立即返回而不会生成任何作业?   java layout_centerInParent在抛出回收视图后不工作   c#中的readInt16()与java中的readShort()   java如何在工具栏菜单中添加昼夜切换器   java在eclipse上向Tomcat提供<Realm/>信息   java使用给定的随机路径构造一个图   带有对象推送的java Morphia聚合阶段组   java关闭JTable实例   性能如何更好地转换java中的所有集合元素?   JAVA木卫一。IOException:通过Eclipse读取Java中的EOF Lucene   java如何在Android中将光标设置在tableLayout的行/列中所需的位置   使用HashMap的Set的java迭代器不会生成值/键吗?   java google guava cachebuilder在ExipeAfterAccess和expireActerWrite之间使用的时间更长   如何将这个排序映射方法从java转换为Kotlin   java如何从运行的JAR文件中读取war目录?   SpringBootJava。使用Java 9模块(JPM)时lang.NoSuchMethodError