zoukankan      html  css  js  c++  java
  • 机器学习《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

  • 相关阅读:
    Linux内核的整体框架
    Unix环境高级编程_文件和目录
    Unix环境高级编程_文件I/O
    u-boot启动的第二阶段
    linux基础之vi编辑器设置文件模板
    ARM linux开发之安装配置tftp
    STM32笔试题笔记
    linux基础之find命令常用用法
    ARM linux开发之根文件系统
    ARM linux开发之linux内核启动简介
  • 原文地址:https://www.cnblogs.com/vincentbnu/p/9427954.html
Copyright © 2011-2022 走看看