Python NLTK代码片段,用于使用特性频率训练分类器(naive bayes)

2024-04-18 05:17:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我假设下面如第6章所示的link text是指使用Feature Presence(FP)创建一个featureset-

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

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

    return features

请告知


Tags: 方法代码textin分类器link特征document
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行,它创建了一个包含所有单词的列表。

在第二行中,最常用的是2000个单词。

3功能的定义

4转换文档列表(我认为它必须是列表)并将列表转换为集合。

5声明字典

在所有最频繁的2000个单词中重复6次

7创建一个字典,其中键为“contains(theword)”,值为true或false。如果文档中有单词,则为True;否则为false

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

这能回答你的问题吗?

对于训练,创建适当的频率检测器,可以用来创建probdist,然后可以传递到NaiveBayesClassifier。但这种分类实际上适用于使用布尔值而不是频率的特征集。因此,如果您想基于FreqDist进行分类,就必须实现自己的分类器,它不使用NLTK特性集。

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

''' 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

相关问题 更多 >