在进行句子分析任务时,我希望将与句子相关的词性标签序列作为单词输入到我的模型中。
我使用GloVe来生成句子中每个单词的表示,并使用SpaCy生成词性标签。然而,GloVe嵌入对于词性标签来说意义不大。因此,我需要为每个词性标签创建嵌入。如何以最佳方式为词性标签创建嵌入,以便我可以像输入句子一样将词性序列输入到模型中?有谁能提供在Python中使用GloVe实现此操作的代码示例吗?
添加背景
我的任务是对句子对进行二元分类,基于它们的相似性(相同意义与不同意义)。
我希望将词性标签作为单词使用,这样词性标签可以作为比较句子的额外信息。我当前的模型并未使用LSTM来预测序列。
回答:
大多数词嵌入模型仍然依赖于一个基本假设,即单词的含义是由其使用语境诱导的。例如,使用skipgram或连续词袋模型学习word2vec嵌入,隐式地假设了一个模型,其中单词的表示向量基于与目标单词共现的上下文单词,通过学习创建最能解决区分上下文共现的单词对与随机单词对的分类任务的嵌入(所谓的负采样)。
但是,如果输入变为离散标签序列(词性标签),这种假设似乎不必保持准确或合理。词性标签具有指定的含义,这种含义并不是由周围其他词性标签的语境诱导的,因此,当将词性标签视为来自一个小得多的词汇表的单词时,标准的学习任务不太可能有效。
在您的情况下,整体句子分析任务是什么?
在问题更新为当前学习任务后添加。
假设您可以为每个句子示例创建词性输入向量。如果可能的词性标签有N种,这意味着您的输入将包括一个来自词嵌入的向量和另一个长度为N的向量,其中组件i
的值表示输入句子中具有词性标签P_i
的术语数量。
例如,假设可能的词性标签只有’article’、’noun’和’verb’,您有一个句子[‘article’, ‘noun’, ‘verb’, ‘noun’]。那么这将转换为[1, 2, 1]
,您可能希望通过句子长度对其进行归一化。让我们将句子1的输入称为pos1
,句子2的输入称为pos2
。
让我们将句子1的词嵌入向量输入称为sentence1
。sentence1
将通过查找每个单词嵌入来自单独的来源(如预训练的word2vec模型、fastText或GloVe)并将它们相加来计算(使用连续词袋)。对sentence2
也是如此。
假设您的训练数据批次已经处理成这些向量格式,因此给定的单个输入将是四个向量的4元组:查找的句子1的CBOW嵌入向量,句子2的相同处理,以及计算的句子1的词性标签的离散表示向量,以及句子2的相同处理。
可以从这些数据中工作的模型可能是这样的:
from keras.engine.topology import Inputfrom keras.layers import Concatenatefrom keras.layers.core import Activation, Densefrom keras.models import Modelsentence1 = Input(shape=word_embedding_shape)sentence2 = Input(shape=word_embedding_shape)pos1 = Input(shape=pos_vector_shape)pos2 = Input(shape=pos_vector_shape)# 注意:这里只是选择128作为嵌入空间维度或中间# 层大小...在您的实际案例中,您将根据想要建模或实验的内容选择这些形状参数# 它们在这里没有任何意义。sentence1_branch = Dense(128)(sentence1)sentence1_branch = Activation('relu')(sentence1_branch)# ... 对sentence1进行其他处理sentence2_branch = Dense(128)(sentence2)sentence2_branch = Activation('relu')(sentence2_branch)# ... 对sentence2进行其他处理pos1_embedding = Dense(128)(pos1)pos1_branch = Activation('relu')(pos1_embedding)# ... 对pos1进行其他处理pos2_embedding = Dense(128)(pos2)pos2_branch = Activation('relu')(pos2_embedding)# ... 对pos2进行其他处理unified = Concatenate([sentence1_branch, sentence2_branch, pos1_branch, pos2_branch])# ... 对连接的中间表示进行密集层处理,等等# 最终将其简化为您使用的最终预测任务,# 是否是预测句子相似性得分(Dense(1)),# 或者预测一个二元标签,指示句子对是否相似(Dense(2)然后跟随softmax激活,# 或者Dense(1)然后跟随某种类型的概率激活如sigmoid)。# 假设您的数据是针对相似句子的二元标记...unified = Activation('softmax')(Dense(2)(unified))unified.compile(loss='binary_crossentropy', other parameters)# 进行训练以学习权重...# 一个单独的模型,将仅从词性输入向量产生嵌入输出,# 依赖于训练过程中学到的权重。pos_embedding_model = Model(inputs=[pos1], outputs=[pos1_embedding])