Как разбить данные разговора на пары (Контекст, Ответ)

Я использую модель Gensim Doc2Vec, пытаясь кластеризовать части разговоров службы поддержки. Моя цель - дать команде поддержки автоответчик с предложениями.

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

Рисунок 1

во время разговора следует предложить "привет" и "наши офисы расположены в Нью-Йорке"


Рисунок 2: описывает разговор, в котором вопросы и ответы не синхронизированы

фигура 2

во время разговора следует предложить "привет" и "наши офисы расположены в Нью-Йорке"


Рисунок 3: описывает разговор, в котором контекст для ответа строится с течением времени, и для целей классификации (я предполагаю) некоторые строки являются избыточными.

Рисунок 3

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


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

Я использую следующий код для обучения моей модели:

from gensim.models import Doc2Vec
from gensim.models.doc2vec import TaggedLineDocument
import datetime

print('Creating documents',datetime.datetime.now().time())
context = TaggedLineDocument('./test_data/context.csv')

print('Building model',datetime.datetime.now().time())

model = Doc2Vec(context,size = 200, window = 10, min_count = 10, workers=4)
print('Training...',datetime.datetime.now().time())

for epoch in range(10):
    print('Run number :',epoch)
    model.train(context)

model.save('./test_data/model')

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

1 ответ

Решение

Для обучения модели я бы начал с конкатенации последовательных последовательностей сообщений. Что бы я сделал, используя временные метки, объединял сообщения без какого-либо промежуточного сообщения от другого объекта.

Например:

Hello
I have a problem
I cannot install software X
                                       Hi
                                       What error do you get?

было бы:

Hello I have a problem I cannot install software X
                                       Hi What error do you get?

Затем я тренировал модель с предложениями в этом формате. Я сделал бы это, потому что я предполагаю, что разговоры все время имеют "одну тему" ​​между взаимодействиями от сущностей. И в этом сценарии, предлагая одно сообщение Hi What error do you get? было бы совершенно нормально.

Также взгляните на данные. Если вопросы пользователей, как правило, с одним предложением (как в примерах), обнаружение предложений может сильно помочь. В этом случае я бы применил определение предложения к объединенным строкам (nltk может быть вариант) и использовать только вопросы с одним предложением для обучения. Таким образом, вы можете избежать несинхронной проблемы при обучении модели за счет уменьшения размера набора данных.

С другой стороны, я действительно хотел бы начать с очень простого метода. Например, вы можете оценивать вопросы по tf-idf и, чтобы получить предложение, вы можете взять наиболее похожий вопрос в своем наборе данных с некоторой метрикой (например, косинусное сходство) и предложить ответ на этот вопрос. Это будет очень плохо в предложениях с контекстной информацией (например, how do you do it?) но может хорошо выступать в таких предложениях, как where are you based?,

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

То, как вы тренируете метод NN, также имеет решающее значение, есть много гиперпараметров, и их правильная настройка может быть сложной, поэтому наличие базового уровня с помощью простого метода может очень помочь вам проверить, насколько хорошо вы делаете. В этой другой статье они сравнивают различные гиперпараметры для doc2vec, возможно, вы найдете это полезным.

Изменить: совершенно другой вариант будет обучать модель "связывать" вопросы с ответами. Но для этого вы должны вручную пометить каждый вопрос соответствующим ответом, а затем обучить контролируемую модель обучения этим данным. Это может потенциально лучше обобщить, но с дополнительным усилием вручную пометить предложения, и все же это не выглядит для меня легкой проблемой.

Другие вопросы по тегам