加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python、机器学习和 NLTK 库的菜鸟解析

发布时间:2020-05-28 21:26:17 所属栏目:Python 来源:互联网
导读:Python、机器学习和 NLTK 库的菜鸟解析

对python这个高级语言感兴趣的小伙伴,下面一起跟随脚本之家 jb51.cc的小编两巴掌来看看吧!

挑战:使用机器学习对 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

执行 Python 程序同样很简单。获得一个名称为 locomotive_main.py 的程序和三个参数,然后您就可以使用 Python 程序编译并执行它:


$ python locomotive_main.py arg1 arg2 arg3

# End www.jb51.cc

Python 使用 清单 1 中的 if __name__ == "__main__": 语法来确定文件本身是从命令行执行的还是从其他代码导入的。为了让文件变得可以执行,需要添加 "__main__" 检测。

清单 1. Main 检测


# @param 探索 Python、机器学习和 NLTK 库
# @author 脚本之家 jb51.cc|jb51.cc 

import sys
import time
import locomotive
 
if __name__ == "__main__":
    start_time = time.time()
    if len(sys.argv) > 1:
        app = locomotive.app.Application()
        ... additional logic ...

# End www.jb51.cc

virtualenv

大多数 Ruby 开发人员熟悉系统范围的库或 gem 的问题。使用一组系统范围内的库的做法一般是不可取的,因为您的其中一个项目可能依赖于某个给定的库的版本 1.0.0,而另一个项目则依赖于版本 1.2.7。同样,Java 开发人员都知道系统范围的 CLASSPATH 存在同样的问题。就像 Ruby 社区使用其 rvm 工具,而 Python 社区使用 virtualenv 工具(请参阅 参考资料,以获得相关链接)来创建独立的执行环境,其中包含特定版本的 Python 和一组库。清单 2 中的命令显示了如何为您 p1 项目创建一个名为 p1_env 的虚拟环境,其中包含 feedparser、numpy、scipy 和 nltk 库。

清单 2. 使用 virualenv 创建一个虚拟环境的命令


$ sudo pip install virtualenv
$ cd ~
$ mkdir p1
$ cd p1
$ virtualenv p1_env --distribute
$ source p1_env/bin/activate 
(p1_env)[~/p1]$ pip install feedparser
(p1_env)[~/p1]$ pip install numpy
(p1_env)[~/p1]$ pip install scipy
(p1_env)[~/p1]$ pip install nltk
(p1_env)[~/p1]$ pip freeze

# End www.jb51.cc

每次在一个 shell 窗口使用您的项目时,都需要 “获得” 您的虚拟环境激活脚本。请注意,在激活脚本被获得后,shell 提示符会改变。当在您的系统上创建和使用 shell 窗口,轻松地导航到您的项目目录,并启动其虚拟环境时,您可能想在您的 ~/.bash_profile 文件中添加以下条目:


$ alias p1="cd ~/p1 ; source p1_env/bin/activate"

# End www.jb51.cc

代码库结构

在完成简单的单文件 “Hello World” 程序的编写之后,Python 开发人员需要理解如何正确地组织其代码库的目录和文件名。Java 和 Ruby 语言在这方面都有各自的要求,Python 也没有什么不同。简单来说,Python 使用包 的概念对相关的代码进行分组,并提供了明确的名称空间。出于演示目的,在本文中,代码存在于某个给定项目的根目录中,例如 ~/p1。在这个目录中,存在一个用于相同名称的 Python 包的 locomotive 目录。 清单 3 显示了这个目录结构。

清单 3. 示例目录结构


locomotive_main.py
locomotive_tests.py
 
locomotive/
    __init__.py
    app.py
    capture.py
    category_associations.py
    classify.py
    news.py
    recommend.py
    rss.py
 
locomotive_tests/
    __init__.py
    app_test.py
    category_associations_test.py
    feed_item_test.pyc
    rss_item_test.py

# End www.jb51.cc

请注意名称古怪的 __init__.py 文件。这些文件指示 Python 为您的包加载必要的库和特定的应用程序代码文件,它们都位于相同的目录中。 清单 4 显示了文件 locomotive/__init__.py 的内容。

清单 4. locomotive/__init__.py


# @param 探索 Python、机器学习和 NLTK 库
# @author 脚本之家 jb51.cc|jb51.cc 

# system imports; loads installed packages
import codecs
import locale
import sys
 
# application imports; these load your specific *.py files
import app
import capture
import category_associations
import classify
import rss
import news
import recommend

# End www.jb51.cc

有了结构如 清单 4 所示的 locomotive 包之后,在项目的根目录中的主程序就可以导入并使用它。例如,文件 locomotive_main.py 包含以下导入:


# @param 探索 Python、机器学习和 NLTK 库
# @author 脚本之家 jb51.cc|jb51.cc 

import sys         # >-- system library
import time        # >-- system library
import locomotive  # >-- custom application code library in the "locomotive" directory

# End www.jb51.cc

测试

Python unittest 标准库提供一个非常好的测试解决方案。熟悉 JUnit 的 Java 开发人员和熟悉 Test::Unit 框架的 Ruby 开发人员应该会觉得 清单 5 中的 Python unittest 代码很容易理解。

清单 5. Python unittest


# @param 探索 Python、机器学习和 NLTK 库
# @author 脚本之家 jb51.cc|jb51.cc 

class AppTest(unittest.TestCase):
 
    def setUp(self):
        self.app = locomotive.app.Application()
 
    def tearDown(self):
        pass
 
    def test_development_feeds_list(self):
        feeds_list = self.app.development_feeds_list()
        self.assertTrue(len(feeds_list) == 15)
        self.assertTrue('feed://news.yahoo.com/rss/stock-markets' in feeds_list)

# End www.jb51.cc

清单 5 中的代码还演示了 Python 的一个显著的特点:所有的代码必须一致缩进,否则无法成功编译。tearDown(self) 方法可能在开始时看起来有点古怪。您可能会问,为什么测试总是被硬编码为通过?事实上并非如此。这只是在 Python 中编写空方法的一种方式。

工具

我真正需要的是一个具备语法突出显示、代码完成和断点调试功能的集成开发环境 (IDE),用该环境帮助我掌握我的 Python 学习曲线。作为使用 Eclipse IDE 进行 Java 开发的一名用户,pyeclipse 插件是我考虑的下一个工具。虽然该插件有时比较慢,但它工作得相当不错。我最终投资了 PyCharm IDE,它满足了我的所有 IDE 要求。

在掌握了 Python 及其生态系统的基本知识之后,终于来到开始实现机器学习解决方案的时候。

使用 Python 和 NLTK 实现分类

实现解决方案涉及捕获模拟的 RSS 提要、整理其文本、使用一个 NaiveBayesClassifier 和 kNN 算法对类别进行分类。下面将会介绍这些操作中的每一个。

捕获和解析提要

该项目特别具有挑战性,因为客户还没有定义目标 RSS 提要列表。因此,也不存在 “训练数据”。所以,在初始开发期间必须模拟提要和训练数据。

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读