挑战:使用机器学习对 RSS 提要进行分类
最近,我接到一项任务,要求为客户创建一个 RSS 提要分类子系统。 目标是读取几十个甚至几百个 RSS 提要,将它们的许多文章自动分类到几十个预定义的主题领域当中。客户网站的内容、 导航和搜索功能都将由这个每日自动提要检索和分类结果驱动。
客户建议使用机器学习,或许还会使用 Apache Mahout 和 Hadoop 来实现该任务,因为客户最近阅读了有关这些技术的文章。但是,客户的开发团队和我们的开发团队都 更熟悉 Ruby,而不是 Java 技术。本文将介绍解决方案的技术之旅、学习过程和最终实现。
什么是机器学习?
我的第一个问题是,“究竟什么是机器学习?” 我听说过这个术语,并且隐约知道超级计算机 IBM Watson 最近使 用该技术在一场 Jeopardy 比赛中击败了人类竞争者。作为购物者和社交网络活动参与者,我也知道 Amazon.com 和 Facebook 根据其购物者数据在提供建议(如产品和人)方面表现良好。总之,机器学习取决于 IT、数学和自然语言的交集 。它主要关注以下三个主题,但客户的解决方案最终仅涉及前两个主题:
分类。根据类似项目的一组训练 数据,将相关的项分配到任意预定义的类别
建议。根据类似项目的观察来建议采用的项
集群。在一组数据内确定子组
Mahout 和 Ruby 的选择
理解了机器学习是什么之后,下一步是确 定如何实现它。根据客户的建议,Mahout 是一个合适的起点。我从 Apache 下载了代码,并开始了学习使用 Mahout 及其 兄弟 Hadoop 实现机器学习的过程。不幸的是,我发现即使对于有经验的 Java 开发人员而言,Mahout 的学习曲线也很陡 峭,并且不存在可用的样例代码。同样不幸的是,机器学习缺乏基于 Ruby 的框架或 gem。
发现 Python 和 NLTK
我继续搜索解决方案,并且在结果集中一直遇到 "Python"。作为一名 Ruby 开发人员,虽然我还没 有学过该语言,但我也知道 Python 是一个面向相似对象的、基于文本的、可理解和动态的编程语言。尽管两种语言之间存 在一些相似之处,但我多年来都忽视了学习 Python,将它视为一项多余的技能集。Python 是我的 “盲点”,我怀疑许多 Ruby 开发人员同行都是这样认为的。
搜索机器学习的书籍,并更深入研究它们的目录,我发现,有相当高比例的此 类系统在使用 Python 作为其实现语言,并使用了一个被称为 Natural Language Toolkit(NLTK,自然语言工具包)的库 。通过进一步的搜索,我发现 Python 的应用比我意识到的还要广泛,如 Google App Engine、YouTube 和使用 Django 框 架构建的网站。它甚至还预安装在我每天都使用的 Mac OS X 工作站上!此外,Python 为数学、科学和工程提供了有趣的 标准库(例如,NumPy 和 SciPy)。
我决定推行一个 Python 解决方案,因为我找到了非常好的编码示例。例如, 下面这一行代码就是通过 HTTP 读取 RSS 提要并打印其内容所需的所有代码:
print feedparser.parse("http://feeds.nytimes.com/nyt/rss/Technology")
快速掌握 Python
在学习一门新的编程语言时,最容易的部分往往是学习语言本身。较难的部分是了解它的生态 系统:如何安装它、添加库、编写代码、构造代码文件、执行它、调试它并编写单元测试。本节将简要介绍这些主题;请务 必参阅 参考资料,以获得有关详细信息的链接。