在前面的n-gram代码示例中,有一个很明显的问题,就是包含太多重复的2-gram序列。程序把每个2-gram序列都加入了列表,没有统计序列的频率。掌握2-gram序列的频率,而不是知道某个序列是否已经存在,这不仅有助于对比不同的数据清洗和数据标准化算法的效果。如果数据标准化成功了,那么唯一的n-gram序列数量就会减少,而n-gram序列的总数(任何一个n-gram序列和与之重复的序列被看成一个n-gram序列)不变。也就是说,同样数量的n-gram序列,经过去重之后“容量”(bucket)会减少。这样就可以在前面的代码中增加标准化特征。
不过Python字典是无序的,不能像数组一样直接对n-gram序列频率进行排序。字典内部元素的位置不是固定的,排序之后再次使用时还是会变化,除非你把排序过的字段的值复制到其他类型中进行排序。在Python的collections库里面有一个OrderedDict可以解决这个问题:
改进后的程序代码如下:
from urllib.request import urlopen
from bs4 import BeautifulSoup
from collections import OrderedDict