Python NLTK代码片段训练分类器(朴素贝叶斯)使用特征频率
我想知道有没有人能帮我理解一段代码,这段代码演示了如何使用特征频率的方法来训练朴素贝叶斯分类器,而不是使用特征存在的方法。
我推测下面的内容,如第六章所示,链接文本,是指使用特征存在(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个最常见的单词。
这样回答你的问题了吗?