![enter image description here][1]
例子:涉及一个特征器,给定一个姓名分析出是男性名字还是女性名字
分析:男性和女性的名字有一些鲜明的特点。以a,e 和i 结尾的很可能是女性,而
以k,o,r,s 结尾的很可能是男性。让我们建立一个分类器更精确地模拟这些差异。
![enter image description here][2]
![enter image description here][3]
![enter image description here][4]
>>classifier=nltk.NaiveBayesClassifier.train(train_set)
>> print nltk.classify.accuracy(classifier, test_set)
0.758
>> classifier.show_most_informative_features(5)
我们可以看出最有区分度的5个特征
Most Informative Features
last_letter = ‘a’ female : male = 38.3 : 1.0
last_letter = ‘k‘ male : female = 31.4 : 1.0
last_letter = ‘f’ male : female = 15.3 : 1.0
last_letter = ‘p‘ male : female = 10.6 : 1.0
last_letter = ‘w’ male : female = 10.6 : 1.0
>>def gender_features2(name):
features = {}
features["firstletter"] = name[0].lower()
features["lastletter"] = name[–1].lower()
for letter in ‘abcdefghijklmnopqrstuvwxyz‘:
features["count(%s)" % letter] = name.lower().count(letter)
features["has(%s)" % letter] = (letter in name.lower())
return features
>> gender_features2(‘John‘)
{‘count(j)‘: 1, ‘has(d)‘: False, ‘count(b)‘: 0, ...}
>>> print nltk.classify.accuracy(classifier, test_set)
0.748
结果精度下降了一个百分点,事实告诉我们不是特征越多越好给定的学习算法的特征的数目是有限的,如果你提供太多的特征,那么该算法将高度依赖训练数据的特性而一般化到新的例子的效果不会很好。这个问题被称为过拟合一旦初始特征集被选定,完善特征集的一个非常有成效的方法是错误分析。首先,我们选择一个开发集,包含用于创建模型的语料数据。然后将这种开发集分为训练集和开发测试集。
>>> train_names = names[1500:]
>>> devtest_names = names[500:1500]
>>> test_names = names[:500]
![enter image description here][5]
我们用这个思路看下第一个特征抽取器能不能给我们带来什么启发
>>> train_set = [(gender_features(n), g) for (n,g) in train_names]
>>> devtest_set = [(gender_features(n), g) for (n,g) in devtest_names]
>>> test_set = [(gender_features(n), g) for (n,g) in test_names]
>>> classifier = nltk.NaiveBayesClassifier.train(train_set)
原文:http://www.cnblogs.com/tychyg/p/5277202.html