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"],
},
),
Каждые обучающие данные состоят из
- text
- индекса головки зависимости
- меток "намерений", связанных с головой зависимости
И пример в / 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 возвращаемся к отсутствию определения, которое делает задачу магической, а не той, которую могут выполнять компьютеры.