机器学习《test》

机器学习 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

原文地址:https://www.cnblogs.com/vincentbnu/p/9427954.html