2016-09-14 8 views
14

J'utilise le modèle Gensim Doc2Vec, en essayant de grouper des parties d'une conversation de support client. Mon objectif est de donner à l'équipe de support des suggestions de réponse automatique.Comment décomposer des données de conversation en paires de (Contexte, Réponse)

Figure 1: montre une conversation d'échantillons où la question de l'utilisateur est ANSWERED la ligne suivante de conversation, le rendant facile d'extraire les données:

Figure 1

pendant la conversation "bonjour" et « Nos bureaux sont situés à New York » devrait être suggéré


Figure 2: décrit une conversation où les questions et les réponses ne sont pas synchronisés

Figure 2

pendant la conversation "bonjour" et "Nos bureaux sont situés à New York" devrait être suggéré


Figure 3: décrit une conversation où le contexte de la réponse est construit au fil du temps, et à des fins de classification (je suppose) certaines des lignes sont redondantes.

Figure 3

pendant la conversation "voici un lien pour le compte d'essai gratuit" devrait être proposé


J'ai les données suivantes par ligne de conversation (simplifiée):
qui a écrit la ligne (utilisateur ou agent), le texte, l'horodatage

J'utilise t il code suivant pour former mon modèle:

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') 

Q: Comment dois-je structurer mes données de formation et ce que heuristiques pourrait être appliquée afin d'extraire des données brutes?

+0

Entraînez-vous sur ceux où vous êtes * seulement *? Puis prédire lequel des choix désynchronisés est préférable et l'ajouter à l'ensemble d'entraînement? –

+0

Merci pour la réponse, malheureusement, je ne peux pas vraiment être sûr quelle partie du contexte a déclenché la réponse de l'agent. J'apprécierai n'importe quelle approche qui me déplacera vers l'avant –

+1

Question bien construite mais c'est un peu général. Quelles techniques connaissez-vous et dans quels domaines vous sentiriez-vous à l'aise? Peut-être que cela peut aider à le réduire. – wheaties

Répondre

5

Pour former un modèle, je commencerais par concaténer des séquences consécutives de messages. Ce que je ferais est, en utilisant les horodatages, concaténer les messages sans n'importe quel message entre de l'autre entité.

Par exemple:

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

serait:

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

Je formerait un modèle avec des phrases dans ce format.Je ferais cela parce que je suppose que les conversations ont un «sujet unique» tout le temps entre les interactions des entités. Et dans ce scénario suggérant un seul message Hi What error do you get? serait totalement bien.

Regardez également les données. Si les questions des utilisateurs sont généralement à condamnation unique (comme dans les exemples), la détection des phrases pourrait être très utile. Dans ce cas, j'appliquerais la détection de phrase sur les chaînes concaténées (nltk pourrait être une option) et n'utiliserait que des questions à une seule personne pour l'entraînement. De cette façon, vous pouvez éviter le problème de désynchronisation lorsque vous entraînez le modèle au prix d'une réduction de la taille de l'ensemble de données.

D'autre part, je voudrais vraiment envisager de commencer avec une méthode très simple. Par exemple, vous pouvez marquer des questions par tf-idf et, pour obtenir une suggestion, vous pouvez prendre la question la plus similaire dans votre jeu de données par rapport à une métrique (par exemple la similarité cosinus) et suggérer la réponse à cette question. Cela fonctionnera très mal dans les phrases avec des informations de contexte (par exemple how do you do it?) mais peut bien fonctionner dans des phrases comme where are you based?. Ma dernière suggestion est parce que traditional methods perform even better than complex NN methods when the dataset is small. Quelle est la taille de votre jeu de données?

Comment vous formez une méthode NN est également crucial, il y a beaucoup d'hyper-paramètres, et les désintéressent correctement peut être difficile, c'est pourquoi avoir une base avec une méthode simple peut vous aider beaucoup à vérifier comment Eh bien, vous faites. Dans cet autre paper ils comparent les différents hyper-paramètres pour doc2vec, peut-être que vous le trouvez utile.

Modifier: une option complètement différente serait de former un modèle pour «lier» des questions avec des réponses. Mais pour cela, vous devez marquer chaque question manuellement avec la réponse correspondante et ensuite former un modèle d'apprentissage supervisé sur ces données. Cela pourrait potentiellement généraliser, mais avec l'effort supplémentaire d'étiqueter manuellement les phrases et pourtant cela ne me semble pas un problème facile.

+0

Merci pour la réponse détaillée, beaucoup à digérer. Mon DB est énorme, pour les tests, je ne prends qu'une petite partie (environ 500.000 lignes de conversations). La plupart des conversations couvrent plus d'un sujet, et la distribution des sujets n'est pas équilibrée (60% sujet A, 20 sujet B, et le reste distribué à 8 autres sujets, plus ou moins). L'étiquetage manuel est une option, mais je préfère envisager une sorte d'automatisation. Découvrez google [réponse intelligente] (http://arxiv.org/pdf/1606.04870v1.pdf), il pourrait donner une nouvelle direction. –

+2

Le fait que les conversations aient plus d'un sujet ne poserait aucun problème dans la méthodologie que j'ai décrite dans la mesure où les sujets sont séparés par des messages de l'autre entité (par exemple: «J'ai un problème pour installer sw X et btw vous basé? '* serait * un problème). Je suis également venu avec le papier de réponse intelligent de google, mais malheureusement je n'ai pas le temps de l'étudier maintenant, ce pourrait être un bon endroit pour commencer. Enfin, je vous encourage à recommencer avec une méthode simple et à améliorer cela. Venez avec une métrique pour comparer les modèles et voir comment vous faites bien. –

+1

Problème très intéressant, j'espère que j'ai aidé :) –