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

只需这一行代码就可以从 NLTK 获得停用词列表;并且还支持其他自然语言:

1
nltk.corpus.stopwords.words('english')

NLTK 还提供了一些 “词干分析器” 类,以便进一步规范化单词。请查看有关词干、词形归并、句子结构和语法的 NLTK 文档,了解有关的更多信息。

使用 Naive Bayes 算法进行分类

算法在 NLTK 中被广泛使用并利用nltk.NaiveBayesClassifier 类实现。Bayes 算法根据特性在其数据集中的每个存在或不存在对项目进行分类。在 RSS 提要项目的情况下,每一个特性都是自然语言的一个给定的(清洁过的)单词。该算法是 “朴实” 的,因为它假设特性(在本例中,单词)之间没有任何关系。

然而,英语这种语言包含超过 250,000 个单词。当然,我不希望为了将 RSS 提要项目传递给算法就要为每个 RSS 提要项目创建一个包含 250,000 个布尔值的对象。那么,我会使用哪些单词?简单来说,答案是在培训数据组中除了停用词之外最常见的单词。NLTK 提供了一个优秀的类,即 nltk.probability.FreqDist,我可以用它来识别这些最常用的单词。在 清单 8 中,collect_all_words 方法返回来自所有培训文章的所有单词的一个数组。

然后,此数组被传递给 identify_top_words 方法,以确定最频繁的单词。nltk.FreqDist 类的一个有用的特性是,它实质上是一个散列,但是它的键按其对应的值或计数 排序。因此,使用 [:1000] Python 语法可以轻松获得最频繁的 1000 个单词。

清单 8. 使用 nltk.FreqDist 类

1
2
3
4
5
6
7
8
9
10
def collect_all_words(self, items):
    all_words = []
    for item in items:
        for in item.all_words:
            words.append(w)
    return all_words
 
def identify_top_words(self, all_words):
    freq_dist = nltk.FreqDist(w.lower() for in all_words)
    return freq_dist.keys()[:1000]

对于利用 NLTK Reuters 文章数据模拟的 RSS 提要项目,我需要确定每个项目的类别。为此,我读取前面提到的 ~/nltk_data/corpora/reuters/cats.txt 文件。用 Python 读取一个文件非常简单,如下所示:

1
2
3
4
5
def read_reuters_metadata(self, cats_file):
    = open(cats_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

接下来的步骤是获得每个 RSS 提要项目的特性。RssItem 类的 features 方法(如下所示)可以做到这一点。在该方法中,在文章中的 all_words 数组首先被减少到一个较小的 set 对象,以消除重复的单词。然后会遍历 top_words,并在该 set 中进行比较,确定是否存在重复的单词。随后返回 1000 个布尔值组成的一个散列,以 w_ 为键,后面是单词本身。这个 Python 非常简洁。

1
2
3
4
5
6
def features(self, top_words):
    word_set = set(self.all_words)
    features = {}
    for in top_words:
        features["w_%s" % w] = (w in word_set)
    return features

相关教程