Как упомянуто в названии, как я могу обучить модель для классификации следующих предложений, логичных или нелогичных?
«У него две ноги» - логический «У него шесть ног» - логический
Решение, которое я пробовал:
1: Обучить классификатор по cnn
Я делал это раньше, он работает очень хорошо, если у вас достаточно данных.Проблема в том, что у меня нет огромного набора данных, который поставляется с «логическими» или «нелогичными» метками для этого случая.
2: Использовать языковую модель
Обучить языковую модель, представленную gluonnlp, накакой-то набор данных, например, вики, используйте его, чтобы узнать вероятность предложений.Если вероятность предложений высока, пометьте ее как логическую и наоборот.Проблема в том, что результаты не очень хорошие.
Способ оценки вероятности
def __predict(self):
lines = self.__text_edit_input.toPlainText().split("\n")
result = ""
for line in lines:
result += str(self.__sentence_prob(line, 10)) + "\n"
self.__text_edit_output.setPlainText(result)
def __prepare_sentence(self, text, max_len):
result = mx.nd.zeros([max_len, 1], dtype='float32')
max_len = min(len(text), max_len)
i = max(max_len - len(text), 0)
j = 0
for index in range(i, max_len):
result[index][0] = self.__vocab[text[j]]
j = j + 1
return result
def __sentence_prob(self, text, max_len):
hiddens = self.__model.begin_state(1, func=mx.nd.zeros, ctx=self.__context)
tokens = self.__tokenizer(text)
data = self.__prepare_sentence(tokens, max_len)
output, _ = self.__model(data, hiddens)
prob = 0
for i in range(max_len):
total_prob = mx.nd.softmax(output[i][0])
prob += total_prob[self.__vocab[i]].asscalar()
return prob / max_len
Возможные проблемы языковых моделей:
1. Do not use correct way to split the sentences(I am using jieba to split the Chinese senteces)
2. Number of vocab is too small/big(test 10000, 15000 and 30000)
3. Loss too high(ppl around 190) after 50 epochs?
4. Number of sentences length should be larger/smaller(tried 10,20,35)
5. The data I use do not meet my requirements(not every sentences are logical)
6. Language model is not appropriate for this task?
Есть предложения? Спасибо