14

我正在使用 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')

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

4

1 回答 1

6

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

例如:

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 方法还要好。你的数据集有多大?

你如何训练一个神经网络方法也很关键,有很多超参数,并且正确地调整它们可能很困难,这就是为什么用一个简单的方法建立一个基线可以帮助你检查你的表现如何。在另一篇论文中,他们比较了 doc2vec 的不同超参数,也许你觉得它很有用。

编辑:一个完全不同的选择是训练一个模型来“链接”问题和答案。但是为此,您应该使用相应的答案手动标记每个问题,然后在该数据上训练一个监督学习模型。这可能会更好地概括,但是通过手动标记句子的额外努力,对我来说仍然不是一个简单的问题。

于 2016-09-20T16:30:32.383 回答