Flair上下文化嵌入的Keras实现

bubs的Python项目详细描述


胸部

Bubs是Flair上下文化嵌入(https://alanakbik.github.io/papers/coling2018.pdf)的Keras/TensorFlow再实现。它是由Yuliya DovzhenkoKensho Technologies AI Research Teamfull contributor list)开发的用于Keras/TensorFlow自然语言模型的构建块。

请查看我们的blog post通告Bubs!


Bubs实现了两种Flair嵌入:news-forward-fast和{}。

Bubs由两部分组成:

  • ContextualizedEmbedding:Keras自定义层,它计算上下文化的嵌入。它有两个输出对应于news-forward-fast和{}嵌入。在
  • inpuntencoder:一个对象,用于构造上下文化的嵌入层的输入。在

上下文化嵌入

该层包括:

  • 两个字符级嵌入层(一个用作前向LSTM的输入,一个用作后向LSTM的输入)
  • 两个字符级LSTM层(一个向前,一个沿着句子向后)
  • 在每个LSTM/end层选择两个字符的输出开始索引。在
  • 两个屏蔽层,以确保填充位置的输出设置为零。这是必要的,因为句子将有不同数量的标记,并且输出将填充到max_token_sequence_length。在

需要以下输入到ContextualizedEmbedding层:

  • forward_input:与每个具有特殊开头/结尾字符的句子相对应的字符代码填充数组
  • backward_input:使用特殊的开始/结束字符按相反顺序填充字符代码数组
  • forward_index_input:前向输入中令牌输出位置的填充数组
  • backward_index_input:后向输入中令牌输出位置的填充数组
  • forward_mask_input:与forward_index_input形状相同的掩码,0为填充位置,1为实标记
  • backward_mask_input:与back_index_输入形状相同的掩码,其中0为填充,1为实标记

输入编码器

此类提供两种方法来准备对ContextualizedEmbedding层的输入:

  • input_batches_from_raw_text()将接受原始文本字符串,将其拆分为句子和标记,并通过将较长的句子拆分为部分来实施字符和令牌限制。然后,它将把char_to_int.py中字典中的字符转换成数字代码,将句子填充到相同长度,并计算来自字符级LSTMs的令牌级输出的索引。

  • prepare_inputs_from_pretokenized()将接受令牌列表和输出模型输入列表。使用风险自负:此函数不会强制字符或标记限制,并且会假定所有句子都适合一批处理。在调用此函数之前,请确保将所有句子拆分成批。否则,forward_index_input和{}中的索引将不正确。

模型权重

上下文化嵌入层的权重是从flair的news-forward-fastnews-backward-fast嵌入中的相应权重复制的(有关用于提取权重的代码片段,请参见scripts/extracting_model_weights.py)。

名字Bubs

Bubs是以作者的猫Bubs(Bubs的缩写)命名的。

最小示例模型

下面我们定义一个非常简单的示例,它为下面的文本输出上下文化的嵌入:“Bubs是一个cat。胸部很可爱。

fromtensorflow.keras.layersimportInputfromtensorflow.keras.modelsimportModelfromtensorflow.keras.optimizersimportAdamfrombubsimportContextualizedEmbedding,load_weights_from_npzfrombubs.helpersimportInputEncoderMAX_TOKEN_SEQUENCE_LEN=125MAX_CHAR_SEQUENCE_LEN=2500"""Load the default weights (provided with this package). If you would like to provide your own weights, you may pass a path to the weights npz file to the load_weights_from_npz() function."""weights=load_weights_from_npz()context_embedding_layer=ContextualizedEmbedding(MAX_TOKEN_SEQUENCE_LEN,weights)"""Required: define inputs to the ContextualizedEmbedding layer"""forward_input=Input(shape=(None,),name="forward_input",dtype="int16")backward_input=Input(shape=(None,),name="backward_input",dtype="int16")forward_index_input=Input(batch_shape=(None,MAX_TOKEN_SEQUENCE_LEN,2),name="forward_index_input",dtype="int32")forward_mask_input=Input(batch_shape=(None,MAX_TOKEN_SEQUENCE_LEN),name="forward_mask_input",dtype="float32")backward_index_input=Input(batch_shape=(None,MAX_TOKEN_SEQUENCE_LEN,2),name="backward_index_input",dtype="int32")backward_mask_input=Input(batch_shape=(None,MAX_TOKEN_SEQUENCE_LEN),name="backward_mask_input",dtype="float32")all_inputs=[forward_input,backward_input,forward_index_input,backward_index_input,forward_mask_input,backward_mask_input,]forward_embeddings,backward_embeddings=context_embedding_layer(all_inputs)model=Model(inputs=all_inputs,outputs=[forward_embeddings,backward_embeddings])model.compile(optimizer=Adam(),loss="categorical_crossentropy")

现在,让我们把每一个标记的上下文嵌入到两个句子中。

^{pr2}$

每个输出的形状将为(22125,1024):

  • 2句话
  • 一个填充句中的125个单词=MAX_TOKEN_SEQUENCE_LEN
  • 1024:每个单词的嵌入维数

请注意,输出从左起用零填充。例如,要在第一个句子中前后嵌入单词“Bubs”,您需要对模型输出中的以下位置进行索引: forward_embedding[0, -5]backward_embedding[0, -5]

单词“cat”的嵌入是:forward_embedding[0, -2]backward_embedding[0, -2]

安装

{24}

许可证

根据Apache2.0许可证授权。除非适用法律要求或书面同意,否则根据许可证分发的软件是按“原样”分发的,无任何明示或暗示的保证或条件。请参阅许可证,以了解在许可证下管理权限和限制的特定语言。

版权所有2019 Kensho Technologies,Inc

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

推荐PyPI第三方库


热门话题
java检查整数是0还是检查变量是null更好?   java Android Kotlin(初学者)使用File(),并从ACTION\u GET\u内容返回Uri   java JavaFx在“内部场景”和根场景之间切换   spring将XMLBean配置转换为java配置   java JPA HIBERNATE映射列两次(embeddedID和POJO)   c#单态模式模型在什么情况下适用?   java请求。getRemoteUser在特定时间后返回null?   spring boot中PUT api控制器的java my单元测试用例失败   java在字符串中互换地解析和替换值   java Android JNI在应用程序中检测到错误:调用JNI GetMethodID时出现挂起异常   JavaSpringDataMongo:使用非简单键持久化映射   爪哇玻璃鱼连接被拒绝   java如何在用户注册时发送特定电子邮件id的自动回复?   Java列表:实例化时和之后的赋值之间的差异