今天在实验室看了一下午的朴素贝叶斯的基本理论,不得不说之前的我对很多理论的学习态度是不求甚解,这就导致了今天下午看深入的时候很是费劲,无奈中途只好停歇了,然后拿了一个具体的实例来学习这种随处可见的贝叶斯思想,不得不说,现实生活中只要是牵涉到概率的地方就都可以使用到Bayes理论来解决事情,今天学习的实例是朴素贝叶斯纠正错误拼写问题 ,当然这篇文章的目的不是说为了讲解这个理论,在前面的博客里转载了那个学习的文章,写得很不错,浅显易懂,今天主要是学习了一下在错误拼写纠正模型中使用到的python中的一个类Counter,这个类是python内置模块collections中的一个类,可以说很好用,最常用的功能莫过于在一个容器包括:列表、字典、字符串等中计算元素重复的次数,好了,别的就不多说了,直接看测试代码即可,需要补充的在代码中都已经给出来了说明,还是很好理解的,下面是代码:
#!/usr/bin/env python
#encoding:utf-8
'''
功能:测试使用python内置模块collections
查了一些collections的资料如下:
官方文档:http://docs.python.org/2/library/collections.html
collections模块自Python 2.4版本开始被引入,包含了dict、set、list、tuple以外的一些特殊的容器类型,分别是:
deque:双向队列。引入自2.4。
defaultdict:使用工厂函数创建字典,使不用考虑缺失的字典键。引入自2.5。
namedtuple()函数:命名元组,是一个工厂函数。引入自2.6。
OrderedDict类:排序字典,是字典的子类。引入自2.7。
Counter类:为hashable对象计数,是字典的子类。引入自2.7。
Antuor:沂水寒城
'''
from collections import Counter
def collections_test():
#Counter类
#是一个无序容器,存储元素形式为:key-value,key代表元素,value代表元素的出现频数
string='we are family and we love peace.We have the Greatwall and the yellow river!'
str_dict={'A':2,'B':5,'G':7,'E':90,'M':6,'N':6, 'x':20,'z':30}
cou0 = Counter()#创建出来一个空的Counter类
print cou0
cou1 = Counter(string)#以字符串形式创建Counter类
print 'cou1 为:------>', cou1
cou2 = Counter(str_dict)#以字典形式创建Counter类
print 'cou2 为:------>', cou2
cou3 = Counter(A=1, B=2, x=23, y=34, z=45, o=-5, m=0)#以类字典形式创建即使用键值组合直接创建
print 'cou3 为:------>', cou3
print 'cou3中所有元素计数总数为:'
print sum(cou3.values())
print '将cou3中的键转为列表为:'
print list(cou3)
print '将cou3中的键转为集合为:'
print set(cou3)
print '将cou3中的键转为列表为:'
print dict(cou3)
print '将cou3中的键值转为(elem, count)形式为:'
print cou3.items()
print '取出计数值最小的前4个元素:'
print cou2.most_common()[:-4:-1]
cou1.update('balabalabalabalabala')#增加
print 'b 的值为------>', cou1['b']
print 'a 的值为------>', cou1['a']
cou2.subtract('AA')#这样导致‘A’的值为0但是并不是删除了key值
cou2.subtract('MMMMMMMMMM')#这样的话‘M’的值就是负数了
print 'A 的值为------>', cou2['A']
print 'M 的值为------>', cou2['M']
print 'cou2 为:------>', cou2
#上面A并没有被删除,删除需要使用del方法
del cou2['A']
print 'cou2 为:------>', cou2#这里就没有A的key值了
#elements()方法
#返回元素重复次数大于等于1的元素
print list(cou3.elements())
#一般的运算操作也是满足的
print 'cou2 和 cou3之和为:'
print cou2+cou3
print 'cou2 和 cou3并集为:'
print cou2| cou3
print 'cou2 和 cou3差集为:'
print cou2 & cou3
print 'cou2 和 cou3之差为:'
print cou2 - cou3
collections_test()
下面是结果:
Counter()
cou1 为:------> Counter({' ': 13, 'e': 13, 'a': 8, 'l': 6, 'r': 4, 'w': 4, 'h': 3, 't': 3, 'v': 3, 'd': 2, 'i': 2, 'o': 2, 'n': 2, 'y': 2, '!': 1, '.': 1, 'G': 1, 'W': 1, 'c': 1, 'f': 1, 'm': 1, 'p': 1})
cou2 为:------> Counter({'E': 90, 'z': 30, 'x': 20, 'G': 7, 'M': 6, 'N': 6, 'B': 5, 'A': 2})
cou3 为:------> Counter({'z': 45, 'y': 34, 'x': 23, 'B': 2, 'A': 1, 'm': 0, 'o': -5})
cou3中所有元素计数总数为:
100
将cou3中的键转为列表为:
['A', 'B', 'y', 'x', 'z', 'm', 'o']
将cou3中的键转为集合为:
set(['A', 'B', 'm', 'o', 'y', 'x', 'z'])
将cou3中的键转为列表为:
{'A': 1, 'B': 2, 'y': 34, 'x': 23, 'z': 45, 'm': 0, 'o': -5}
将cou3中的键值转为(elem, count)形式为:
[('A', 1), ('B', 2), ('y', 34), ('x', 23), ('z', 45), ('m', 0), ('o', -5)]
取出计数值最小的前4个元素:
[('A', 2), ('B', 5), ('N', 6)]
b 的值为------> 5
a 的值为------> 18
A 的值为------> 0
M 的值为------> -4
cou2 为:------> Counter({'E': 90, 'z': 30, 'x': 20, 'G': 7, 'N': 6, 'B': 5, 'A': 0, 'M': -4})
cou2 为:------> Counter({'E': 90, 'z': 30, 'x': 20, 'G': 7, 'N': 6, 'B': 5, 'M': -4})
['A', 'B', 'B', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z']
cou2 和 cou3之和为:
Counter({'E': 90, 'z': 75, 'x': 43, 'y': 34, 'B': 7, 'G': 7, 'N': 6, 'A': 1})
cou2 和 cou3并集为:
Counter({'E': 90, 'z': 45, 'y': 34, 'x': 23, 'G': 7, 'N': 6, 'B': 5, 'A': 1})
cou2 和 cou3差集为:
Counter({'z': 30, 'x': 20, 'B': 2})
cou2 和 cou3之差为:
Counter({'E': 90, 'G': 7, 'N': 6, 'o': 5, 'B': 3})