机器学习 blog《test》
机器学习《test》
#!/usr/bin/python # -*- coding: UTF-8 -*- import collections import re path ='big.txt' ## 定义 words() 函数,用来取出文本库的每一个词 def words(text): return re.findall('[a-z]+', text.lower()) ## 定义一个 train() 函数,用来建立一个"字典"结构。文本库的每一个词,都是这个"字典"的键;它们所对应的值,就是这个词在文本库的出现频率。 def train(words): model = collections.defaultdict(lambda: 1) for word in words: model[word] += 1 return model ''' collections.defaultdict(lambda: 1)的意思是,每一个词的默认出现频率为1。这是针对那些没有出现在文本库的词。 如果一个词没有在文本库出现,我们并不能认定它就是一个不存在的词,因此将每个词出现的默认频率设为1。以后每出现一次,频率就增加1。 ''' NWORDS = train(words( open(path).read() )) ## 定义edits1()函数,用来生成所有与输入参数word的"编辑距离"为1的词 alphabet = 'abcdefghijklmnopqrstuvwxyz' def edits1(word): ## 将word依次按照每一位分割成前后两半。比如,'abc'会被分割成 [('', 'abc'), ('a', 'bc'), ('ab', 'c'), ('abc', '')] splits = [(word[:i], word[i:]) for i in range(len(word) + 1)] ## 依次删除word的每一位后、所形成的所有新词。比如,'abc'对应的deletes就是 ['bc', 'ac', 'ab'] 。 deletes = [a + b[1:] for a, b in splits if b] ## 依次交换word的邻近两位,所形成的所有新词。比如,'abc'对应的transposes就是 ['bac', 'acb'] 。 transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b) > 1] ## 将word的每一位依次替换成其他25个字母,所形成的所有新词。 # 比如,'abc'对应的replaces就是 ['abc', 'bbc', 'cbc', ... , 'abx', ' aby', 'abz' ] ,一共包含78个词(26 × 3)。 replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b] ## 在word的邻近两位之间依次插入一个字母,所形成的所有新词。 ## 比如,'abc' 对应的inserts就是['aabc', 'babc', 'cabc', ..., 'abcx', 'abcy', 'abcz'],一共包含104个词(26 × 4)。 inserts = [a + c + b for a, b in splits for c in alphabet] return set(deletes + transposes + replaces + inserts) ## 定义edit2()函数,用来生成所有与word的"编辑距离"为2的词语 def edits2(word): return set(e2 for e1 in edits1(word) for e2 in edits1(e1)) ## 但是这样的话,会返回一个 (54n+25) * (54n+25) 的数组,实在是太大了。 ## 因此,我们将edit2()改为known_edits2()函数,将返回的词限定为在文本库中出现过的词。 def known_edits2(word): return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS) # 定义correct()函数,用来从所有备选的词中,选出用户最可能想要拼写的词。 def known(words): return set(w for w in words if w in NWORDS) def correct(word): candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word] return max(candidates, key=NWORDS.get) ''' (1)如果word是文本库现有的词,说明该词拼写正确,直接返回这个词; (2)如果word不是现有的词,则返回"编辑距离"为1的词之中,在文本库出现频率最高的那个词; (3)如果"编辑距离"为1的词,都不是文本库现有的词,则返回"编辑距离"为2的词中,出现频率最高的那个词; (4)如果上述三条规则,都无法得到结果,则直接返回word。 '''
公式 ::a