这个仓库包含了参加金融大脑-金融智能NLP服务大赛的两个模型。目前这个比赛,已经开通了学习赛,可随时参加打擂,还有奖金。
问题相似度计算,即给定客服里用户描述的两句话,用算法来判断是否表示了相同的语义。
示例:
- “花呗如何还款” --“花呗怎么还款”:同义问句
- “花呗如何还款” -- “我怎么还我的花被呢”:同义问句
- “花呗分期后逾期了如何还款”-- “花呗分期后逾期了哪里还款”:非同义问句
对于例子a,比较简单的方法就可以判定同义;对于例子b,包含了错别字、同义词、词序变换等问题,两个句子乍一看并不类似,想正确判断比较有挑战;对于例子c,两句话很类似,仅仅有一处细微的差别 “如何”和“哪里”,就导致语义不一致。
- Model 1: A Decomposable Attention Model for Natural Language Inference
- Model 2: Improving Language Understanding with Unsupervised Learning
我们现在的文字系统最早起源于古时候的象形文字,形状来自于人们眼睛所看到的事物,有一些“所见即所得”的意味。而如今的计算机应用,是基于二进制表达的算法、逻辑、图像、声音等的元素构成的。文字在这些系统里的表示,也仅仅是一个数字,不包含真实的语义。在传统的基于统计学的方法中,通过统计词频,计算一些数值,如tf-idf,我们可以得到一篇文档或者长文本的表示。不同主题的文档,得到的这种表示的分布是可以进行区分的。但是其中,并不包含具体的语义。但这种方案在处理短文本时,就显得捉襟见肘了。自然语言进入到深度学习时代,词语要以什么方式来构建神经网络输入层呢?因此,文字或者词语在计算机中如何进行表示,是利用深度学习方法进行自然语言处理首先要考虑的问题。
一个最简单的输入表示,就是把词语转换成one-hot向量。但是这么做的缺点是当面对特别大的词表时,one-hot向量的维度将会变的特别大,容易造成维数灾难。并且,表示成one-hot,我们也没有办法计算相似词语之间的语义或语法近似程度。因此,Hinton大佬在1986年的论文Learning Distributed Representations of Concepts中提出用一个固定长度的 实值向量 来表示任意词。
在我们的任务钟,我们也使用了词向量来表示每一个词或字,然后把句子表示为向量序列输入到模型中。data文件夹中,包含了表示词所使用的词向量。 由于该赛题任务有一定的应用背景,在进行分词的时候,我们发现有些专有词汇,如花呗、借呗等,很难用现有的分词工具精确的识别出来。 因此,我们根据赛题提供的数据,建立了自己的字典。 但是,这个字典并不能覆盖所有的情况。 我们使用已经训练好的中文词向量作为一个比较权威的词库。 用赛题提供的语料进行分词,与上述词库进行对比,整理出了一份新词表。 新词表中列出的词没有放到用户字典里进行分词,因为它们已经是通过分词工具确定出来的词语了。 基于上述分词和新词,我们尝试自己训练了一份词向量,其中包含11829个单词。 训练所使用的语料仅包含204954条句子,数据量还是太少了。 不过针对特殊背景的语料,采用一些技术精调后,或许是有用的。(P.S. 如何精调还是个问题=, =)