Многоцелевая обработка и классификация естественного языка - PullRequest
0 голосов
/ 09 мая 2019

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

Например:

I have my data for one of my intents (same format for all) 

{"intent_name": "music.off" , "examples": ["turn off the music" , "kill 
the music" , "cut the music"]}

, и запрос, указанный пользователем, будетбыть:

'dim the lights, cut the music and play Black Mirror on tv'

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

['dim the lights', 'cut the music', 'play black mirror on tv']

однако я могу 't просто используйте re.split в предложении с and и , в качестве разделителей для разделения, как если бы пользователь спрашивает:

'turn the lights off in the living room, dining room, kitchen and bedroom'

это будет разбито на

['turn the lights off in the living room', 'kitchen', 'dining room', 'bedroom']

, которые не могут быть использованы с моим определением намерений

это моя проблема, заранее спасибо

ОБНОВЛЕНИЕ

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

import nltk
import spacy
import os
import json
#import difflib
#import substring
#import re
#from fuzzysearch import find_near_matches
#from fuzzywuzzy import process

text = "dim the lights, shut down the music and play White Collar"

commands = []

def get_matches():

    for root, dirs, files in os.walk("./data"):  

        for filename in files:

            f = open(f"./data/{filename}" , "r")
            file_ = f.read()
            data = json.loads(file_)

            choices.append(data["examples"])

        for set_ in choices:

            command = process.extract(text, set_ , limit=1)

            commands.append(command)

    print(f"all commands : {commands}")

это возвращает [('dim the lights') , ('turn off the music') , ('play Black Mirror')], что является правильным намерением, но я не могу узнать, какая часть запроса относится к каждому намерению - это главная проблема

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

play.json

{"intent_name": "play.device" , "examples" : ["play Black Mirror" , "play Netflix on tv" , "can you please stream Stranger Things"]}


music.json

{"intent_name": "music.off" , "examples": ["turn off the music" , "cut the music" , "kill the music"]}


lights.json

{"intent_name": "lights.dim" , "examples" : ["dim the lights" , "turn down the lights" , "lower the brightness"]}

1 Ответ

0 голосов
/ 12 мая 2019

Похоже, вы смешиваете две проблемы в своих вопросах:

  1. Несколько независимых намерений в одном запросе (например, shut down the music and play White Collar)
  2. Несколько слотов (с использованием структуры заполнения формы) в одном намерении (например, turn the lights off in the living room bedroom and kitchen).

Эти проблемы совершенно разные. Однако и то, и другое можно сформулировать как проблему пометки слов (аналогично пометке POS) и решить с помощью машинного обучения (например, CRF или bi-LSTM для вложенных слов с предварительной подготовкой, меткой предсказания для каждого слова).

Метки намерений для каждого слова могут быть созданы с использованием нотации BIO, например,

shut   B-music_off
down   I-music_off
the    I-music_off
music  I-music_off
and    O
play   B-tv_on
White  I-tv_on
Collar I-tv_on

turn    B-light_off
the     I-light-off
lights  I-light-off 
off     I-light-off
in      I-light-off
the     I-light-off
living  I-light-off
room    I-light-off
bedroom I-light-off
and     I-light-off
kitchen I-light-off

Модель будет читать предложение и предсказывать метки. Это должно быть обучено по крайней мере на сотнях примеров - вы должны генерировать или добывать их.

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

turn    B-action
the     I-action
lights  I-action
off     I-action
in      O
the     B-place
living  I-place
room    I-place
bedroom B-place
and     O
kitchen B-place   

Теперь разметка BIO очень полезна: тег the B-place отделяет bedroom от the living room.

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

...