Как получить основной смысл предложения, используя spacy или nltk? - PullRequest
2 голосов
/ 05 февраля 2020

У меня есть сценарий использования, когда я хочу извлечь основную значимую часть предложения, используя spacy или nltk или любые библиотеки НЛП.

Пример предложения1:" Как я могу поднять свой голос против преследования " Намерение будет: " поднять голос против преследования "

Пример предложения2: " Каким мультипликатором или каким Дональдом Даком создается человек / кого? " Намерением будет:"Дональд Дак создан"

Пример предложения3:"Как получить основное намерение предложения, используя spacy или nltk"? Intent:"получить основное намерение предложения, используя spacy nltk"

Я новичок в разборе зависимостей и точно не знаю, как это сделать. Пожалуйста, помогите мне.

1 Ответ

4 голосов
/ 10 февраля 2020

TL; DR

Вы должны определить конечную задачу, которую хотите выполнить, и определить, что именно является «намерением» / «основной информацией» или «смыслом текста».

В Длинный

На первый взгляд кажется, что вы пытаетесь волшебным образом решить проблему естественного языка. Но давайте посмотрим на вопрос и то, что вы на самом деле спрашиваете, давайте избежим всех понятий намерения / меток или языка (на некоторое время) и просто посмотрим, что входит в / вывод:

[in]:  "How Can I raise my voice against harassment"
[out]: "raise voice against harassment"

[in]:  "Donald Duck is created by which cartoonist/which man/whom ?" 
[out]: "Donald duck is created by"

[in]:  "How to retrieve the main intent of a sentence using spacy or nltk ?" 
[out]: "retrieve main intent of sentence using spacy nltk"

Кажется, что все ваши выходные токены / слова являются просто цитатой из вашего ввода, в этом случае, что если вы просто рассматриваете свою проблему как задачу «span / sequence annotation», т.е.

[in]:  "How Can I raise my voice against harassment"
[out]: [0, 0, 0, 1, 0, 1, 1, 1] 

[in]:  "Donald Duck is created by which cartoonist/which man/whom ?" 
[out]: [1, 1, 1, 1, 0, 0, 0]

[in]:  "How to retrieve the main intent of a sentence using spacy or nltk ?" 
[out]: [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

Предполагая, что каждый слово - это двоичная метка, выход должен помечать 1 для слов, которые вы хотите извлечь из ввода, и 0 для тех, которые вы не делаете.

Теперь, учитывая, что это простая двоичная маркировка последовательности задание можно было бы просто выполнить:

Но немного отступите назад,

  • Действительно ли это правда, что намерение всегда будет частью ввода?
  • Что именно является намерением? Как это определяется?
  • Что произойдет, если намерение отсутствует во входе?

Хорошо, даже если мы не говорим о «намерении» и просто хотим извлечь основное значение,

  • в чем именно смысл предложения, так ли это? просто извлечь "важные слова"? Если так, что делает слова «важными»? Как определяется «важный»?
  • Разве не важны только безостановочные слова? Если это так, то вы можете просто удалить стоп-слова, например, Удаление стоп-слова с помощью NLTK . А также, что тогда являются стоп-словами?

Но я слышал, что люди делают это с разбором зависимостей

Что такое разбор зависимостей?

Короче говоря, он обеспечивает структурированное представление текста. Но не структура в традиционном формализме зависимости имеет понятие «намерение».

Доказательство: CTR + F при https://web.stanford.edu/~jurafsky/slp3/15.pdf

Так что я не думаю, что простой анализ текста с деревьями зависимостей поможет, если только понятие "намерение" лучше определено в вашем сценарии.

Как насчет этого инструмента SpaCy, который обучает модель намерению?

С https://github.com/explosion/spaCy/blob/master/examples/training/train_intent_parser.py

Да, это пример использования комбинированных меток синтаксического анализа и маркировки последовательности и определения его как «намерения», более конкретно, мы видим примеры из https://github.com/explosion/spaCy/blob/master/examples/training/train_intent_parser.py#L31

TRAIN_DATA = [
    (
        "find a cafe with great wifi",
        {
            "heads": [0, 2, 0, 5, 5, 2],  # index of token head
            "deps": ["ROOT", "-", "PLACE", "-", "QUALITY", "ATTRIBUTE"],
        },
    ),
    (
        "find a hotel near the beach",
        {
            "heads": [0, 2, 0, 5, 5, 2],
            "deps": ["ROOT", "-", "PLACE", "QUALITY", "-", "ATTRIBUTE"],
        },
    ),

Каждые обучающие данные состоят из

  1. text
  2. индекса головки зависимости
  3. меток "намерений", связанных с головой зависимости

И пример в / output из https://github.com/explosion/spaCy/blob/master/examples/training/train_intent_parser.py#L173

[in]:  find a hotel with good wifi
[out]:
    [
      ('find', 'ROOT', 'find'),
      ('hotel', 'PLACE', 'find'),
      ('good', 'QUALITY', 'wifi'),
      ('wifi', 'ATTRIBUTE', 'hotel')
    ]

Приведенный выше пример показывает, что весь список триплетов определяется как намерение, а не просто необработанный строки. Триплеты относятся к (dependent, relation, head), например, hotel - это PLACE до find из триплетов ('hotel', 'PLACE', 'find').

Примечание: Это исключительно понятие SpaCy «семантика» или «намерение», которое не является неправильным, но четко определено, и, следовательно, модель для выполнения этой задачи обучаема в контролируемом машинном обучении. парадигма. Подробности см. https://spacy.io/usage/examples

В зависимости от того, как и что вы определяете как намерение / семантика, вход / выход будет меняться, и модель для обучения может отличаться.

Но почему вы должны сделать это настолько сложным, я просто хочу строку намерения?!

Потому что означает «основное значение» или «намерение», если это просто строка?

Мы go возвращаемся к отсутствию определения, которое делает задачу магической, а не той, которую могут выполнять компьютеры.

...