Создать модель, чтобы классифицировать предложение логично или нет - PullRequest
0 голосов
/ 01 июня 2019

Как упомянуто в названии, как я могу обучить модель для классификации следующих предложений, логичных или нелогичных?

«У него две ноги» - логический «У него шесть ног» - логический

Решение, которое я пробовал:

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?

Есть предложения? Спасибо

1 Ответ

1 голос
/ 04 июня 2019

Проблема 6. Языковая модель не подходит для этой задачи? является основной проблемой. Языковые модели построены так, чтобы иметь смысл входного текста с точки зрения использования языка (синтаксис, семантика и т. Д.) И не делать логических выводов. Таким образом, вы можете не получить хороших результатов даже при большом количестве данных или очень глубоких моделях. Проблема, которую вы пытаетесь решить, является чрезвычайно сложной. Вы можете захотеть взглянуть на Символический ИИ . В этой области ведется множество исследований .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...