Shl*_*rtz 14 python text-mining gensym doc2vec
我正在使用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')
Run Code Online (Sandbox Code Playgroud)
问:我应该如何构建我的训练数据以及可以应用哪些启发式方法从原始数据中提取它?
为了训练模型,我将首先连接连续的消息序列.我要做的是,使用时间戳,连接消息,而在其他实体之间没有任何消息.
例如:
Hello
I have a problem
I cannot install software X
Hi
What error do you get?
Run Code Online (Sandbox Code Playgroud)
将会:
Hello I have a problem I cannot install software X
Hi What error do you get?
Run Code Online (Sandbox Code Playgroud)
然后我会训练一个带有该格式句子的模型.我会这样做,因为我假设对话在实体的交互之间始终具有"单一主题".在这种情况下,建议单个消息Hi What error do you get?将是完全正常的.
另外,看看数据.如果来自用户的问题通常是单句(如在示例中),则句子检测可以帮助很多.在这种情况下,我会对连接的字符串应用句子检测(nltk可能是一个选项),并且只使用单句式问题进行训练.这样,在以减小数据集大小为代价训练模型时,可以避免不同步问题.
另一方面,我真的会考虑从一个非常简单的方法开始.例如,您可以通过tf-idf对问题进行评分,并且为了获得建议,您可以在数据集中采用最相似的问题(例如余弦相似度)并建议该问题的答案.这将在具有上下文信息(例如how do you do it?)的句子中表现非常差,但在句子中可以表现得很好where are you based?.
我的最后一个建议是,当数据集很小时,传统方法的表现甚至比复杂的NN方法更好.你的数据集有多大?
如何训练NN方法也很重要,有很多超参数,并且正确调整它们可能很困难,这就是为什么使用简单方法获得基线可以帮助您检查自己的表现.在另一篇论文中,他们比较了doc2vec的不同超参数,也许你发现它很有用.
编辑:一个完全不同的选择是训练模型将问题与答案"链接".但为此,您应该使用相应的答案手动标记每个问题,然后针对该数据培训监督学习模型.这可能会更好地概括,但手动标记句子的额外努力仍然对我来说看起来不是一个容易的问题.