Определить, является ли предложение запросом - PullRequest
20 голосов
/ 03 ноября 2010

Как я могу определить, имеет ли поисковый запрос форму вопроса?

Например, клиент может выполнить поиск «как я могу отслеживать мой заказ» (не обращайте внимания на знак вопроса).

Я предполагаю, что большинство прямых вопросов будет соответствовать определенной грамматике.

Очень простой подход к догадкам:

START WORDS = [who, what, when, where, why, how, is, can, does, do]

isQuestion(sentence):
  sentence ends with '?'
  OR sentence starts with one of START WORDS

Список START WORDS может быть длиннее.Область действия - это окно поиска по веб-сайту, поэтому я полагаю, что в список не нужно включать слишком много слов.

Есть ли библиотека, которая может сделать это лучше, чем мой простой метод предположения?Какие-нибудь улучшения в моем подходе?

Ответы [ 6 ]

17 голосов
/ 03 ноября 2010

См. Также: Как узнать, является ли предложение вопросом (вопросительным)?

Мой ответ на этот вопрос:

В синтаксическом разборевопрос (полученный с помощью инструментария, такого как nltk), правильная структура будет иметь вид:

(SBARQ (WH+ (W+) ...)
       (SQ ...*
           (V+) ...*)
       (?))

Итак, используя любой из доступных синтаксических анализаторов, дерево с узлом SBARQ, имеющим встроенный SQ (опционально) будет индикатором ввода является вопрос.Узел WH + (WHNP / WHADVP / WHADJP) содержит основание вопроса (кто / что / когда / где / почему / как), а SQ содержит перевернутую фразу.

, то есть:

(SBARQ 
  (WHNP 
    (WP What)) 
  (SQ 
    (VBZ is) 
    (NP 
      (DT the) 
      (NN question)))
  (. ?))

Конечно, наличие множества предыдущих пунктов приведет к ошибкам при разборе (которые можно обойти), как и к действительно плохо написанным вопросам.Например, заголовок этого поста "Как узнать, является ли предложение вопросом?"будет иметь SBARQ, но не SQ.

15 голосов
/ 03 ноября 2010

Вам понадобится гораздо более продвинутая форма лингвистического анализа, чтобы осуществить это. Нужно доказательство? Хорошо ...

Являются ли самки оленя.

Там, где есть воля, там есть путь.

Когда придет время, я прыгну!

Почему нет. У меня нет никакого насоса.

8 голосов
/ 04 ноября 2010

Выяснить, является ли предложение вопросом, не самая простая задача, потому что есть много способов, как люди задают вопросы, многие из них не следуют правилам грамматики.Поэтому трудно найти хороший набор правил для обнаружения.В таких ситуациях я бы пошел на машинное обучение и обучил алгоритм, используя аннотированный текстовый корпус (создание корпуса и выбор набора функций может занять некоторое время).Распознавание, основанное на машинном обучении, должно помочь вам лучше вспомнить, чем подход, основанный на правилах.Вот пошаговая инструкция:

  1. Ручное создание набора данных о поездах: получите аннотированный - с информацией, если это вопрос или нет - сбор текста или создайте такой корпус самостоятельно(это должно быть более 100 документов, и многие вопросы не должны быть простыми вопросами)
  2. Найдите самые важные функции - извлеките часть речи, 5W1H (что, что, ..., как), получитьположение глагола в каждом из предложений и другие вещи, которые могут быть полезны при распознавании вопроса
  3. Создайте вектор для каждого из предложений признаков (вам нужны как положительные, так и отрицательные примеры)на основе извлеченной информации, например,

    |Имеет?|Глагол на второй позиции |Имеет 5W1H |5W1H на 1-й позиции в предложении |... |длина предложения |Является ли вопрос |

  4. Используйте векторы для обучения алгоритма машинного обучения , например, MaximumEntropy, SVM (вы можете использовать Wekka или Knime )

  5. Используйте обученный алгоритм для распознавания вопроса.

  6. При необходимости (новыйпримеры вопросов), повторите шаги.

7 голосов
/ 03 ноября 2010

В поддержку ответа JohnFx становится еще хуже.Ясно, что следующие вопросы:

  • Есть ли у вас какие-либо вопросы
  • Достаточно ли этого ответа?И тогда вы обнаружите, что пользователи начинают вводить следующие типы запросов:
    • Я хотел бы знать, что такое вопросы.

    Это вообще вопрос?Синтаксически нет, но он заслуживает ответа, который можно легко назвать ответом.(Эти типы запросов могут быть довольно распространенными, в зависимости от количества пользователей.)

    Итог: если вы не собираетесь обрабатывать вопросы особым, лингвистически сложным способом (таким как создание прямого ответа)использование естественного языка), их распознавание может даже не быть интересным.Выбор правильных ключевых слов из запроса может быть гораздо более полезным.

7 голосов
/ 03 ноября 2010

Чтобы определить начальные слова в предложениях вопроса, вы должны пройти через большой текстовый корпус в поисках предложений, заканчивающихся на ?, и найти наиболее часто встречающиеся начальные слова, которые вы найдете в них.

Некоторые из тех, которые вы пропустили, которые приходят на ум, включают в себя то, что, AM, ARE, WAS, WERE, MAY, MIGHT, CAN, COULD, WILL, SHALL, WALLD, SHULD, HAS, HAVE, HAD и DID.Возможно также, ЕСЛИ идти с КОГДА.Также рассмотрите IN, AT, TO, FROM и ON, а также, возможно, UNDER и OVER.Все зависит от типа системы запросов, которую вы имеете, и от того, сколько широты в запросах на естественном языке вы надеетесь предоставить своим пользователям.

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

Это должно найти множество вопросов;Являются ли императивы также возможностью?

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

В Википедии есть пара статей по ответы на вопросы и поисковые системы на естественном языке .У обоих есть ссылки, которые вы можете использовать.Вы также можете просмотреть следующие документы в формате PDF:

Наконец, система ответов на вопросы на естественном языке START от MIT кажется интересной.

0 голосов
/ 02 августа 2018

Я попробовал сделать это ... моя цель состояла в том, чтобы сделать что-то легковесное, которое не требовало бы дополнительных библиотек, и дало бы каждому разработчику возможность контролировать несколько необходимых элементов - таких как заполнение определенных символов, используя отрицательные сокращениятолько как позиция первого слова и допускает общие элементы вопроса.Я создал две функции, которые, когда вы передаете значение из HTML-страницы Angular6, в большинстве моих случаев работают довольно хорошо ...

Я не включаю "не" какстартовое слово, потому что это может быть утверждение столько раз, сколько вопрос.Вам не кажется?

Угловой HTML:

          <input matInput type="text" placeholder="{{Prompt}}" [(ngModel)]="value">

.ts Функции:

  isQuestion(sentence: string = this.value){
    var q_elements : string[] = ["who", "what", "when", "where", "why", "how", "?"];
    var q_starters : string[] = ["which", "won't", "can't", "isn't", "aren't", "is", "do", "does", "will", "can", "is"];
    var temp = sentence.toLowerCase();
    var padChars : string[] = ["?", "-", "/"];
    var i : number = 0;
    for (i=0; i < padChars.length; i++) {
      temp = this.padChar(temp, padChars[i]);
    }
    var splitted = temp.split(" ");
    // console.log(splitted);
    if (q_starters.includes(splitted[0])) {
      // console.log('found a question with a starter');
      return true;
    } else {
      return q_elements.some(function (v) {
        return splitted.indexOf(v) >= 0;
      });
    }
  }

  padChar(myString : string, myChar : string) {
    var position = myString.indexOf(myChar);
    var output : string = myString;
    while(position > 0 && position < output.length) {
      if (output.charAt(position - 1) != " ") {
        output = [output.slice(0, position), " ", output.slice(position)].join('');
        position = output.indexOf(myChar, position);
      }
      if (position + 1 < output.length) {
        if (output.charAt(position + 1) != " ") {
          output = [output.slice(0, (position + 1)), " ", output.slice(position + 1)].join('');
          position = output.indexOf(myChar, position);
        }
      }
      position = output.indexOf(myChar, position + 1);
    }
    return output;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...