自然语言处理意图识别
自然语言处理一直是机器学习方面的一个难题,最近在参加竞赛时需要进行意图识别的相关探索学习,本文大致对我个人对意图识别的理解和做法进行一个简要的整理。
开始时思考的其实并不容易,因为作为大学生对机器学习和深度学习的底子比较薄,并且做过的跟机器学习有关的项目勉勉强强只能算是有一个,所以开始整理思路时就参考了《美团机器学习实践》这本书,确实获益匪浅,光笔记我就用typora打了40多页,确实值得大家去看一下。
从中我大概了解了整个自然语言处理的综合步骤以及相关做法,然后对意图识别这个名词有了一定的了解,它可以说是电商搜索和推荐的开门砖,从用户的搜索输入中提取最为关键的分类信息,即查找用户搜索的相关商品的门类,再从本门类(无论一级分类如食物、旅游或者二级分类面食类、肉类等精细分类)搜索或者执行推荐算法推荐相似度较高的产品时(当然这种推荐不包括如adaboost这样的相关性商品推荐),会大大减小搜索耗时以及推荐复杂度,很好的节省了系统开销,可以说是大型互联网公司搜索系统的必备杀器。
其中不妨有参考各路大神的代码,如有雷同,还请见谅。
这次意图识别为了同时提高准确率和召回率,我选择使用组合模型进行相应的处理,通过结合ElasticSearch的精确以及快速搜索功能以及综合word2vec词语相似度和LSTM模型两种方法来完成意图准确识别
本文使用的工具和包较多,大体罗列下:
- ElasticSearch工具以及Elastic包
- jieba分词包(fool分词)
- gensim的word2vec相关模块
- keras深度学习包LSTM等模块
- sklearn的测试集抽取方法train_test_split方法
- pickle包进行词向量集以及索引集的保存
- json包进行LSTM训练保存
- flask框架
- mongodb数据库
那么对于意图识别实践我的基本思路是:
- 获取项目相关的语料库,进行预处理(最好能够获取比较纯净的与项目相关性较大的语料库),使用jieba分词,并将语句、分词结果、关键词等预处理内容保存入mongodb数据库中,方便后续训练。
- 通过语料库来训练gensim的word2vec模块来完成词向量模型的构建(这一步至关重要,直接决定模型最终成型情况),并将model以及词向量字典、索引字典进行保存,以便下次查询不需要重新进行训练。
- 训练LSTM模型并进行保存,训练模型的所有操作都应在另一个api或者线程进行,并且在使用之前就已经训练并保存完毕,这样将不影响接口的调用。
- 使用jieba包对测试的中文语句进行HMM以及搜索模式分词以及提取关键词,当然选择傻瓜分词fool也未尝不可。
- 优先选择使用elasticsearch进行索引快速搜索,对句子中的关键词进行快速全局搜索,取得最大匹配分值的词语所在类别即可完成意图识别,当然这里要设定最小匹配分值,最小匹配分值可以根据实际情况动态调配,在性能和准确率之间进行综合衡量。
- 如果全局最大匹配分值低于最小要求匹配分值,即关键词在整个词库中没有记录,则进行LSTM模型预测或word2vec相似词类别加权平均预测。(当然进入到这一步必然会多消耗一定时间,所以最小匹配分值一定要相对合理)
- LSTM (长短时记忆神经网络)在自然语言处理处理上的性能相当优秀,由于它基于RNNs(循环神经网络),能够对上下文语境进行一定的反应,其准确性明显胜于词袋模型,但是损耗性能当然也是巨大的。
- word2vec相似词类别加权平均预测也算是本人的一个简单的理论创新,通过寻找在词库中已经存在的与现有关键词相似的词集通过相似度加权平均的方式来实现最终的意图判定。
具体代码会在之后博客里面慢慢分享给大家,一次写的太多可能确实也难以理解,我会把每一步的内容在以后的博客进行进一步细致分析和整理,感谢大佬们!