VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 探索 Python、机器学习和 NLTK 库(3)

测试

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

清单 5. Python unittest

1
2
3
4
5
6
7
8
9
10
11
12
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)

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

工具

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

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

使用 Python 和 NLTK 实现分类

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

捕获和解析提要

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

我用来获得示例提要数据的第一个方法是只提取在某个文本文件中指定的列表中的 RSS 提要。Python 提供了一个很好的 RSS 提要解析库,其名称为 feedparser,它抽象不同的 RSS 和 Atom 格式之间的差异。简单的基于文本的对象序列化的另一个有用的库被幽默地称为 pickle(泡菜)。这两个库在 清单 6 的代码中均有使用,清单 6 中的代码将每一个 RSS 提要捕获为 “腌制过的” 对象文件,以备后用。如您所见,Python 代码非常简洁,且功能强大。

清单 6. CaptureFeeds 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import feedparser
import pickle
 
class CaptureFeeds:
 
    def __init__(self):
        for (i, url) in enumerate(self.rss_feeds_list()):
            self.capture_as_pickled_feed(url.strip(), i)
 
    def rss_feeds_list(self):
        = open('feeds_list.txt''r')
        list = f.readlines()
        f.close
        return list
 
    def capture_as_pickled_feed(self, url, feed_index):
        feed = feedparser.parse(url)
        = open('data/feed_' + str(feed_index) + '.pkl''w')
        pickle.dump(feed, f)
        f.close()
 
if __name__ == "__main__":
    cf = CaptureFeeds()

相关教程