如何将对话数据分解成对(上下文,响应)

How to break conversation data into pairs of (Context , Response)

我正在使用 Gensim Doc2Vec 模型,试图对客户支持对话的各个部分进行聚类。我的目标是为支持团队提供自动回复建议。

图 1: 显示了一个示例对话,其中在下一个对话行中回答了用户问题,使得提取数据变得容易:

在对话中"hello""Our offices are located in NYC"应该被建议


图 2: 描述了一个问题和答案不同步的对话

在对话中"hello""Our offices are located in NYC"应该被建议


图 3: 描述了一个对话,其中答案的上下文是随着时间的推移而建立的,并且出于分类目的(我假设)一些行是多余的。

对话中"here is a link for the free trial account"应该建议


每个对话行我有以下数据(简化):
谁写了行(用户或代理)、文本、时间戳

我正在使用以下代码来训练我的模型:

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

:我应该如何构建我的训练数据以及可以应用哪些启发式方法以便从原始数据中提取它?

为了训练模型,我将从连接连续的消息序列开始。我要做的是,使用时间戳连接消息,中间没有来自其他实体的任何消息。

例如:

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?

然后我会用那种格式的句子训练一个模型。我会这样做,因为我假设对话在实体交互之间始终具有 "single topic"。在那种情况下,建议一条消息 Hi What error do you get? 就完全没问题了。

另外,看看数据。如果用户的问题通常是单句的(如示例中所示),那么句子检测可能会有很大帮助。在那种情况下,我会在连接的字符串上应用句子检测(nltk 可能是一个选项)并且只使用单句问题进行训练。这样你就可以在训练模型时以减少数据集的大小为代价避免不同步的问题。

另一方面,我会真的考虑从一个非常简单的方法开始。例如,您可以通过 tf-idf 对问题进行评分,并且为了获得建议,您可以将数据集中最相似的问题与某些指标(例如余弦相似度)结合起来,并为该问题建议答案。这在带有上下文信息的句子中表现非常糟糕(例如 how do you do it?),但在 where are you based?.

这样的句子中表现很好

我最后的建议是因为 traditional methods perform even better than complex NN methods when the dataset is small。您的数据集有多大?

如何训练 NN 方法也很重要,有很多超参数,正确调整它们可能很困难,这就是为什么要有一个简单的基线方法可以帮助您检查自己的表现。在另一个 paper 中,他们比较了 doc2vec 的不同超参数,也许您会发现它有用。

编辑: 一个完全不同的选择是将模型训练为 "link" 有答案的问题。但是为此,您应该用相应的答案手动标记每个问题,然后在该数据上训练监督学习模型。这可能会更好地泛化,但需要付出更多的努力来手动标记句子,但对我来说这仍然不是一个简单的问题。