首页 > 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 w in item.all_words: words.append(w) return all_words def identify_top_words( self , all_words): freq_dist = nltk.FreqDist(w.lower() for w 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): f = 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 w in top_words: features[ "w_%s" % w] = (w in word_set) return features |