完成parser_trainsitions.py
init:
self.stack = ["ROOT"]
self.buffer = copy.deepcopy(sentence)
self.dependencies = []
parse_step:
if transition == "S":
word = self.buffer.pop(0)
self.stack.append(word)
elif transition == "LA":
self.dependencies.append((self.stack[-1], self.stack[-2]))
self.stack.pop(-2)
else:
self.dependencies.append((self.stack[-2], self.stack[-1]))
self.stack.pop(-1)
minibatch_parse:
partial_parses = [PartialParse(sentence) for sentence in sentences]
unfinished_parses = partial_parses[:]
n = len(unfinished_parses)
while (n > 0):
l = min(n, batch_size)
transitions = model.predict(unfinished_parses[:l])
for parse, trans in zip(unfinished_parses[:l], transitions):
parse.parse_step(trans)
if len(parse.stack) == 1:
unfinished_parses.remove(parse)
n -= 1
dependencies = [partial_parses.dependencies for partial_parses in partial_parses]
完成 parser_model.py
init:
# Input Layer
self.embed_to_hidden = nn.Linear(self.n_features * self.embed_size, self.hidden_size)
nn.init.xavier_uniform_(self.embed_to_hidden.weight)
# Dropout Layer
self.dropout = nn.Dropout(self.dropout_prob)
# Output Layer
self.hidden_to_logits = nn.Linear(self.hidden_size, self.n_classes)
nn.init.xavier_uniform_(self.hidden_to_logits.weight)
embedding_lookup:
x = self.pretrained_embeddings(t)
x = x.view(x.shape[0], -1)
forward:
embeddings = self.embedding_lookup(t)
hidden = self.embed_to_hidden(embeddings)
hidden = nn.ReLU()(hidden)
hidden = self.dropout(hidden)
logits = self.hidden_to_logits(hidden)
train:
optimizer = optim.Adam(parser.model.parameters(), lr=lr)
loss_func = nn.CrossEntropyLoss()
train_for_epoch:
logits = parser.model(train_x)
loss = loss_func(logits, train_y)
loss.backward()
optimizer.step()