标题意图识别
目前聊天机器人的重要一部分就是识别用户的意图。
比如,
- 帮我预定晚上的餐馆 -> 餐馆预定
- 明天天气如何 -> 天气查询
但由于语言的复杂性,用户通常会使用各式各样的表达方式,比如
- 明天天气如何? = 明天会晴天还是阴天?
上边两种表述其实都是对天气状况的查询。 Chatbot需要识别出这类近似表达,从而准确的判断出用户的实际意图,为后续的处理(NER, 对话管理)奠定基础。
常见的意图识别方法
在神经网络的兴起前,BOW(Bag-of-words), N-Gram, TFIDF等基于词频统计的手段,通常用于句子的向量表示。再通过某些分类算法(SVM, Adaboost, Random Forest)对句子进行分类。
这种手段最大的问题是忽视了词语间的关联和词语本身的理解。
2013年,Google的Mikolov, Tomas发布了Word2Vec算法(Efficient Estimation of Word Representations in Vector Space),用于对词进行Word Embeding. 将训练集中的词语映射到一个高维空间里。在这个空间里,词语的距离远近能反应出词语本身的相似程度。更神奇的是,词向量本身的加减可以进行含义的转换。
当然它本身还存在一些缺点,比如无法处理异义词。但Word2Vec以及后续的GloVe, FastText极大的推动了NLP的发展。
意图识别准确性比较
目前我比较了4个常见的方法。
- Simple sum of wordembeding, 基于GloVe的词向量进行简单求和得到句子向量
- Facebook InferSent. Facebook出的句向量表示。
- TF-IDF. 基于传统的TF-IDF
- Semhash, Subword Semantic Hashing for Intent Classification on Small Datasets
准确性统计
你可以获取所有的测试代码从github
结论
简单对词向量进行累加,能很好的反应句子本身的意义,至少从分类角度。但这个仍然是个黑盒,欠缺理论解释。