设为首页 收藏本站
查看: 1092|回复: 0

[经验分享] 拼写检查算法 Golang 版

[复制链接]

尚未签到

发表于 2018-9-20 07:21:22 | 显示全部楼层 |阅读模式
  最近看了 阮一峰的一篇文章介绍使用贝叶斯推断方法做拼写检查的文章,该文章的易懂程度输于 Google 技术总监写的原文,其优秀的译文。
  说明了啥,越是大师级的人写的文章往往越易懂。所以关于贝叶斯方法我就不解释了。只帖代码
  我使用golang对照实现了一遍:
  一是为了弄懂其算法细节
  二是不使前段时间看的golang语法忘记
  就像几年前在学校时候对着C版的数据结构书用C#去实现一样。

  package main
  

  

import (  

    "fmt"  

    "io/ioutil"  

    "regexp"  

)  

  

var (  

    NWORDS map[string]int  

)  

  

const (  

    alphabet = "abcdefghijklmnopqrstuvwxyz"  

)  

  

func words(text string) []string {  

    regex, _ := regexp.Compile("[a-z]+")  

    return regex.FindAllString(text, -1)  

}  

  

func train(features []string) map[string]int {  

    result := make(map[string]int)  

    for i := range features {  

        _, isexist := result[features]  

        if !isexist {  

            result[features] = 1  

        } else {  

            result[features] += 1  

        }  

    }  

  

    return result  

}  

  

func edit1(word string) []string {  

    type tuple struct{ a, b string }  

    var splits []tuple  

    for i := 0; i < len(word)+1; i++ {  

        splits = append(splits, tuple{word[:i], word[i:]})  

    }  

  

    var deletes []string  

    for _, t := range splits {  

        if len(t.b) > 0 {  

            deletes = append(deletes, t.a+t.b[1:])  

        }  

    }  

  

    var transposes []string  

    for _, t := range splits {  

        if len(t.b) > 1 {  

            transposes = append(transposes, t.a+string(t.b[1])+string(t.b[0])+t.b[2:])  

        }  

    }  

  

    var replaces []string  

    for _, c := range alphabet {  

        for _, t := range splits {  

            if len(t.b) > 0 {  

                replaces = append(replaces, t.a+string(c)+t.b[1:])  

            }  

        }  

    }  

  

    var inserts []string  

    for _, c := range alphabet {  

        for _, t := range splits {  

            inserts = append(inserts, t.a+string(c)+t.b)  

        }  

    }  

  

    //concat this slice   

    deletes = append(deletes, transposes...)  

    deletes = append(deletes, replaces...)  

    deletes = append(deletes, inserts...)  

  

    return set(deletes)  

}  

  

func known_edits2(word string) []string {  

    var arr []string  

    for _, e1 := range edit1(word) {  

        for _, e2 := range edit1(e1) {  

            if _, ok := NWORDS[e2]; ok {  

                arr = append(arr, e2)  

            }  

        }  

    }  

    return set(arr)  

}  

  

func known(words []string) []string {  

    var knows []string  

    for _, value := range words {  

        if _, ok := NWORDS[value]; ok {  

            knows = append(knows, value)  

        }  

    }  

    return knows  

}  

  

func appendIfMissing(slice []string, i string) []string {  

    for _, ele := range slice {  

        if ele == i {  

            return slice  

        }  

    }  

    return append(slice, i)  

}  

  

func set(arr []string) []string {  

    var result []string  

    for _, ele := range arr {  

        result = appendIfMissing(result, ele)  

    }  

    return result  

}  

  

func correct(word string) string {  

    candidates := known([]string{word})  

    if len(candidates)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-597550-1-1.html 上篇帖子: golang中使用mongodb的操作类以及如何封装 下篇帖子: Golang 中的指针 - Pointer
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表