如何将对话数据拆分成(上下文,回复)的一对

13

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

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

Figure 1

在对话期间,“hello”和“我们的办公室位于纽约”应该被建议


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

Figure 2

在对话期间,“hello”和“我们的办公室位于纽约”应该被建议


图3:描述了一个对话,其中答案的上下文逐渐建立,并且出于分类目的(我假设),某些行是冗余的。

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

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


只在你确定的那些上进行训练?然后预测哪个不同步的选择最好,并将其添加到训练集中? - Has QUIT--Anony-Mousse
谢谢回复,不幸的是我无法确定上下文的哪个部分触发了代理的响应。我将感激任何能让我前进的方法。 - Shlomi Schwartz
1
问题提得很好,但有点泛泛。你熟悉哪些技术,哪些领域你感觉使用起来比较舒适?也许这可以帮助缩小范围。 - wheaties
1个回答

6

为了训练模型,我会开始连接连续的消息序列。我的做法是,利用时间戳将消息连接起来,没有其他实体之间的消息。

例如:

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

would be:

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

然后,我会使用这种格式的句子来训练模型。之所以这样做,是因为我假设交互实体之间始终有一个“单一主题”的对话。在这种情况下,建议一个单一信息“嗨,你遇到了什么错误?”完全没有问题。
此外,请查看数据。如果用户的问题通常只有一个句子(如示例中),那么句子检测可以提供很大帮助。在这种情况下,我会在连接的字符串上应用句子检测(nltk可能是一个选项),并仅使用单个句子进行训练。这样,您就可以避免在训练模型时出现不同步的问题,但代价是减少数据集的大小。
另一方面,我真的会考虑从非常简单的方法开始。例如,您可以通过tf-idf对问题进行评分,并为了获得建议,您可以选择与某些度量(例如余弦相似度)相关的数据集中最相似的问题,并为该问题提供答案。这种方法在具有上下文信息的句子(例如“你怎么做到的?”)中表现非常糟糕,但在像“你在哪里?”这样的句子中表现良好。
我的最后建议是因为传统方法在数据集很小的时候表现比复杂的NN方法更好。你的数据集有多大?
如何训练NN方法也非常关键,有很多超参数,适当地调整它们可能很困难,这就是为什么用简单的方法建立一个基准可以帮助你检查自己的表现如何。在这篇论文中,他们比较了doc2vec的不同超参数,也许对您有用。 编辑:另一种完全不同的选择是训练一个模型来“链接”问题和答案。但是,为此,您应该手动标记每个问题与相应的答案,然后在该数据上训练监督学习模型。这可能具有更好的泛化性能,但需要手动标记句子并且在我看来仍不像一个容易的问题。

感谢您详细的回复,需要消化的内容很多。我的数据库非常庞大,为了测试,我只取了一小部分(约50万行对话)。大多数对话涵盖多个主题,并且主题分布不平衡(60%的主题A,20%的主题B,其余分布在另外8个主题上,多或少)。手动标记是一种选择,但我更喜欢研究某种自动化方式。请查看Google的“智能回复”(smart reply),它可能会给出新的方向。 - Shlomi Schwartz
2
在我描述的方法论中,对话有多个主题并不是一个问题,只要这些主题与其他实体的消息分开(例如,“我安装软件X时遇到了问题,顺便问一下,你在哪里?”将会是一个问题)。我也想到了谷歌智能回复论文,但不幸的是我现在没有时间去研究它,这可能是一个很好的起点。最后,我再次鼓励您从简单的方法开始,并在此基础上进行改进。制定一个比较模型的指标,看看您的表现如何。 - Álvaro Marco
1
非常有趣的问题,希望我能帮到你 :) - Álvaro Marco
如果这个答案有帮助,请考虑为悬赏奖励投票 :) - Álvaro Marco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接