Python NLTK代码片段训练分类器(朴素贝叶斯)使用特征频率

3 投票
3 回答
8206 浏览
提问于 2025-04-15 18:38

我想知道有没有人能帮我理解一段代码,这段代码演示了如何使用特征频率的方法来训练朴素贝叶斯分类器,而不是使用特征存在的方法。

我推测下面的内容,如第六章所示,链接文本,是指使用特征存在(FP)来创建特征集的。

def document_features(document): 
    document_words = set(document) 

    features = {}
    for word in word_features:
        features['contains(%s)' % word] = (word in document_words)

    return features

请给我一些建议。

3 个回答

0

这里有一个方法可以帮助你:

''' Returns the frequency of letters '''
def get_freq_letters(words):
    fdist = nltk.FreqDist([char.lower() for word in words for char in word if char.isalpha()])
    freq_letters = {}
    for key,value in fdist.iteritems():
        freq_letters[key] = value
    return freq_letters
3

在训练的时候,你需要先创建合适的频率分布(FreqDists),这样才能用它们来生成概率分布(ProbDists),然后把这些概率分布传给朴素贝叶斯分类器(NaiveBayesClassifier)。不过,分类的过程实际上是基于特征集进行的,而特征集使用的是布尔值(也就是真或假),而不是频率。所以,如果你想根据频率分布来进行分类,你就得自己实现一个分类器,而不是使用NLTK提供的特征集。

3

在你发的链接里说,这个函数是一个特征提取器,它的作用就是检查这些单词是否出现在给定的文档中。

下面是整个代码,每一行都有编号:

1     all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
2     word_features = all_words.keys()[:2000] 

3     def document_features(document): 
4          document_words = set(document) 
5          features = {}
6          for word in word_features:
7               features['contains(%s)' % word] = (word in document_words)
8          return features

第1行创建了一个包含所有单词的列表。

第2行选取了出现频率最高的2000个单词。

第3行是函数的定义。

第4行把文档列表(我觉得应该是个列表)转换成一个集合。

第5行声明了一个字典。

第6行遍历这2000个最常见的单词。

第7行创建一个字典,其中键是'contains(theword)',值是布尔值,表示这个单词是否在文档中。如果在文档中就是true,不在就是false。

第8行返回这个字典,显示文档中是否包含这2000个最常见的单词。

这样回答你的问题了吗?

撰写回答