我正在使用Gensim Doc2Vec模型,尝试集中部分客户支持对话。我的目标是为支持团队提供自动回复建议。
图1:显示了一个示例对话,其中用户问题在下一个对话行中得到了回答,从而可以轻松提取数据:
会话期间"你好" 和"我们的办事处位于纽约市,建议
图2:描述了问题和答案不同步的对话
会话期间"你好" 和"我们的办事处位于纽约市,建议
图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')
问:我应该如何构建我的训练数据以及可以应用哪些启发式方法从原始数据中提取它?
答案 0 :(得分: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?
这样的句子中表现良好。
我的最后一个建议是因为traditional methods perform even better than complex NN methods when the dataset is small。你的数据集有多大?
你如何训练一个NN方法也很关键,有很多超参数,并且正确调整它们可能很困难,这就是为什么用一个简单方法的基线可以帮助你要检查你的表现如何。在另一个paper中,他们比较了doc2vec的不同超参数,也许你觉得它很有用。
编辑:一个完全不同的选择是培训模型,将问题与答案“链接”起来。但为此,您应该使用相应的答案手动标记每个问题,然后针对该数据培训监督学习模型。这可能会更好地概括,但是通过手动标记句子的额外努力仍然对我来说看起来不是一个容易的问题。