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

时间:2010-01-29 14:58:20

标签: python nlp nltk stanford-nlp

我想知道是否有人可以通过代码片段来帮助我,该代码片段演示了如何使用特征频率方法而不是特征存在来训练朴素贝叶斯分类器。

我认为第6章link text中所示的以下内容是指使用Feature Presence(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 :(得分: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。如果文档中存在该单词,则为True,否则为false

8返回字典,该字典显示文档是否包含最常用的2000个单词。

这会回答你的问题吗?

答案 1 :(得分:3)

对于训练,创建可用于创建ProbDists的适当FreqDists,然后将其传递给NaiveBayesClassifier。但是分类实际上适用于特征集,它使用布尔值而不是频率。因此,如果您想基于FreqDist进行分类,则必须实现自己的分类器,而不使用NLTK功能集。

答案 2 :(得分: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