大家好,今天我给大家演讲的主题是"给题目打上多个知识点标签", 也就是幻灯片上的"Text Multiple Classification"。
关于这个项目, @连华 是我的指导老师,2014 年十月份他在 芥末堆 发表了一篇《题目知识点标签自动挖掘技术》,分 上 下 两部分。上部分是业务,涉及到题库背景, 三种知识点推荐方向,对问题的重新定义,下部分是技术,比如朴素贝叶斯分类模型, 数学公式等特征抽取 难等若干挑战, 最后是产品和团队。推荐大家去看看,里面有很多经验和思考。
我先给大家做一个项目演示,http://xk.17zuoye.net/editor/questions/5f39c8358b555e12fa9f1090 。 这个前端是初中 @俊杰 团队的 @刘充 同学做的。演示中 ......
回到演讲主题,接下来我讲的是用 Python 实现的 TextMulClassify 框架,而 @连华 老师写的是 C++ 版本。这里我稍微说下其中关系,这个项目还有另外两个人 @俊晨 和 @李恒, @俊晨 把 C++ 代码改写为 Python 代码,@李恒 做了一些优化。原来我在 @连华 的指导下,对小学英语用 Python 做了一版推荐,但是在初中题库 里的效果不太行。基于这套代码结构,我又把他俩的代码迁移到我这边来,最终形成了 TextMulClassify 框 架。这个迁移主要是把效果迁移过来,对于一个规模和复杂度还可以的项目。
这个迁移过程也是相当痛苦,主要是把代码组织和数据结构按我个人的风格重写。这两年我有印象的也做过几个项 目二次维护开发, 如果你想略过对项目代码的各个层次细节和历史的理解,而直接像原作者一样马上开发的话, 非常难。如果某个项目是基于某个框架,你恰好也熟悉这个框架, 然后项目功能也足够简单,用框架自身组合一下 完全满足项目需求,相当于看一篇鲁迅先生的短篇小说,那半天上手也是完全可能的。
这里是演讲议程,先介绍 TextMulClassify 框架依赖的几个概率算法模型,后介绍项目代码架构。
现在我们来谈谈如何基于某个具体文档推导出它应该关联到哪些知识点。稍微了解点人工智能的人都知道,目前的科技 水平来处理日常事务还是非常艰难的, iPhone 上的 SIRI 是给大家调戏用的,我也没见过在日常中有多少人比较频繁 地用她。相反现在成功的机器学习大都是依赖于概率统计,比如大家日常用的 Google 翻译。我们这个项目用到了几个 常见的概率模型,如 TFIDF, 信息熵,余弦相似度,朴素贝叶斯, 等。这些概率模型我是以自己理解的通俗直观的物理 意义来讲解的,作为数据挖掘方面的新手,所以讲得不对的地方还请各位指正。
第一个统计方法是 TFIDF , 在搜索引擎里经常用到。
来读一下维基百科里对它的原理介绍,"TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且 在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上是:TF * IDF, TF词频(Term Frequency),IDF逆向文件频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。"
我们来看一些数据,这边 IDF 的数据我是从初中数学的 IDF 缓存文件里取出来的,可以看到IDF最低的是"一个",最高 的是"三个", 这个也符合我们的日常经验,而且"两个"的IDF值更靠近"一个",说明我们平常用的更多的是"一个"和"两个", 而"三个"相对来说就比较少用了。
通常每篇文章里几乎都会出现"的"字, 而技术一点的"熵"字就相对来说很少出现了,两者相差频率可远不止一个数量级。 但是我们可以用取对数的技巧让这个分布波动不要太陡峭,比如我们看到这两个相差一万倍的数字,取对数后就只有五倍 差距了。
大概讲了 TDIDF 的相关知识后,我们也明白了,只要把每个知识点标签下出现的高频词抽取出来,就可以在很大程度 上知道某个题目和哪个知识点有关联。但是 TFIDF 有个缺点是,它把特征词的分布情况给忽略了。所以我们又加了另外 一个概率模型, 信息熵。