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

下一步的挑战性之大是出乎意料的。现在,我有了样例提要数据,必须对它进行分类,以便将它用作训练数据。训练数据 是向您的分类算法提供的数据集,以便您能从中进行学习。

例如,我使用的样例提要包括了体育电视网络公司 ESPN。提要的项目之一是关于 Denver Broncos 橄榄球队的 Tim Tebow 被转会到 New York Jets 橄榄球队,在同一时间,Broncos 签了他们新的四分卫 Peyton Manning。提要结果中的另一个项目是 Boeing Company 和它的新喷气式飞机 (jet)。所以,这里的问题是,应该将哪些具体的类别值分配给第一个故事?tebow、broncos、manning、jets、quarterback、trade 和 nfl 这些值都是合适的。但只有一个值可以在训练数据中被指定为训练数据类别。同样,在第二个故事中,类别应该是 boeing 还是 jet?困难的部分在于这些细节。如果您的算法要产生精确的结果,那么大型训练数据集的准确手工分类非常关键。要做到这一点,不应该低估所需的时间。

我需要使用更多的数据,而且这些数据必须已进行了准确的分类,这种情况很快就变得明显。我可以在哪里找到这样的数据呢?进入 Python NLTK。除了是一个出色的语言文本处理库之外,它甚至还带有可下载的示例数据集,或是其术语中的文集,以及可以轻松访问此下载数据的应用程序编程接口。要安装 Reuters 文集,可以运行如下所示的命令。会有超过 10,000 篇新闻文章将下载到您的 ~/nltk_data/corpora/reuters/ 目录中。与 RSS 提要项目一样,每篇 Reuters 新闻文章中都包含一个标题和一个正文,所以这个 NLTK 预分类的数据非常适合于模拟 RSS 提要。

1
2
3
4
$ python               # enter an interactive Python shell
>>> import nltk        # import the nltk library
>>> nltk.download()    # run the NLTK Downloader, then enter 'd' Download
Identifier> reuters    # specify the 'reuters' corpus

特别令人感兴趣的是文件 ~/nltk_data/corpora/reuters/cats.txt。它包含了一个列表,其中包含文章文件名称,以及为每个文章文件分配的类别。文件看起来如下所示,所以,子目录 test 中的文件 14828 中的文章与主题 grain 有关。

1
2
test/14826 trade
test/14828 grain

自然语言是混乱的

RSS 提要分类算法的原始输入,当然是以英语书写的文本。原始,确实如此。

从计算机处理的角度来看,英语或任何自然语言(口语或普通的语言)都是极不规范和不准确的。首先,存在大小写的问题。单词 Bronco 是否等于 bronco?答案是,也许是。接下来,您要应付标点和空格。bronco. 是否等于 bronco 或 bronco,?算是吧。然后,有复数形式和相似的单词。run、running 和 ran 是否相等?这取决于不同的情况。这三个词有一个共同的 词根。如果将自然语言词汇嵌入在标记语言(如 HTML)中,情况会怎么样呢?在这种情况下,您必须处理像 <strong>bronco</strong> 这样的文本。最后,还有一个问题,就是那些经常使用但基本上毫无意义的单词,像 a、and 和 the。这些所谓的停用词非常碍事。自然语言非常凌乱;在处理之前,需要对它们进行整理。

幸运的是,Python 和 NLTK 让您可以收拾这个烂摊子。在 清单 7 中,RssItem 类的 normalized_words 方法可以处理所有这些问题。请特别注意 NLTK 如何只使用一行代码就能够清洁嵌入式 HTML 标记的原始文章文本!使用一个正则表达式删除标点,然后每个单词被拆分,并规范化为小写。

清单 7. RssItem 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class RssItem:
    ...
    regex = re.compile('[%s]' % re.escape(string.punctuation))
    ...
    def normalized_words(self, article_text):
        words   = []
        oneline = article_text.replace('\n'' ')
        cleaned = nltk.clean_html(oneline.strip())
        toks1   = cleaned.split()
        for t1 in toks1:
            translated = self.regex.sub('', t1)
            toks2 = translated.split()
            for t2 in toks2:
                t2s = t2.strip().lower()
                if self.stop_words.has_key(t2s):
                    pass
                else:
                    words.append(t2s)
        return words

相关教程