GO语言如何利用K近邻算法实现小说鉴黄

发布时间:2021-09-17 15:37:35 作者:柒染
来源:亿速云 阅读:105

本篇文章为大家展示了GO语言如何利用K近邻算法实现小说鉴黄,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Usuage:
  go run kNN.go --file="data.txt"

关键是向量点的选择和阈值的判定

package main
 
import (
  "bufio"
  "flag"
  "fmt"
  "io"
  "log"
  "math"
  "os"
  "path"
  "path/filepath"
)
 
var debug bool = false
var data_dir string = "./moyan"    //文件存放目录
var limen float64 = 0.1159203888322267 //阈值
 
const (
  MIN_HANZI rune = 0x3400
  MAX_HANZI rune = 0x9fbb
)
 
var labels []rune = []rune{
  0x817f, 0x80f8, 0x4e73, 0x81c0,
  0x5c41, 0x80a1, 0x88f8, 0x6deb,
}
 
func errHandle(err error) {
  if err != nil {
    log.Fatal(err)
  }
}
 
func load(name string) (m map[rune]int, err error) {
  f, err := os.Open(name)
  if err != nil {
    return nil, err
  }
  defer f.Close()
  buf := bufio.NewReader(f)
  m = make(map[rune]int)
  var r rune
  for {
    r, _, err = buf.ReadRune()
    if err != nil {
      if err == io.EOF {
        break
      }
      return nil, err
    }
    if r >= MIN_HANZI && r <= MAX_HANZI {
      m[r] += 1
    }
  }
  return m, nil
}
func classify(m map[rune]int) (idv []float64, dis float64) {
  len_m := len(m)
  for i, v := range labels {
    if debug {
      fmt.Println(i, m[v], string(v), float64(m[v])/float64(len_m))
    }
    idv = append(idv, float64(m[v])/float64(len_m))
  }
  for _, v := range idv {
    dis += math.Pow(v, 2)
  }
  dis = math.Sqrt(dis)
  return
}
func check(fp string, dis float64) {
  switch {
  case dis >= limen:
    fmt.Println(fp, dis, "涉黄")
  case dis == 1.0:
    fmt.Println(fp, dis, "你在作弊吗")
  case dis == 0:
    fmt.Println(fp, dis, "检查一下文件字符编码是不是utf8格式吧")
  default:
    fmt.Println(fp, dis, "正常")
  }
}
 
func walkFunc(fp string, info os.FileInfo, err error) error {
  if path.Ext(fp) == ".txt" {
    m, err := load(fp)
    errHandle(err)
    _, dis := classify(m)
    check(fp, dis)
  }
  return err
}
 
var file string
 
func init() {
  _, err := os.Stat(data_dir)
  if err != nil {
    err = os.Mkdir(data_dir, os.ModePerm)
    errHandle(err)
  }
  flag.StringVar(&file, "file", "", "file read in,if you don't give the file read in,"+
    "it will create a data dictionary,just pust your files in it")
}
 
func main() {
  flag.Parse()
  if file == "" {
    filepath.Walk(data_dir, walkFunc)
    return
  }
  m, err := load(file)
  errHandle(err)
  _, dis := classify(m)
  check(file, dis)
 
}

上述内容就是GO语言如何利用K近邻算法实现小说鉴黄,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 用Python做了鉴黄模型,内含多20万张“不可描述”图片
  2. 【学习笔记】K近邻归类算法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go语言 k近邻算法

上一篇:RPM包知识点详细介绍

下一篇:如何在Windows10中手动设置代理

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》