首页 > 编程 > Golang > 正文

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

2020-04-01 19:14:50
字体:
来源:转载
供稿:网友

本文给大家分享的是一段GO语言利用K近邻算法实现小说鉴黄的方法,本方法的鉴别的关键是关键是向量点的选择和阈值的判定,推荐给大家,有需要的小伙伴可以参考下。

Usuage:

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

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

样本数据来自国家新闻出版总署发布通知公布的《40部淫秽色情网络小说名单》

 

 
  1. package main 
  2.  
  3. import ( 
  4. "bufio" 
  5. "flag" 
  6. "fmt" 
  7. "io" 
  8. "log" 
  9. "math" 
  10. "os" 
  11. "path" 
  12. "path/filepath" 
  13.  
  14. var debug bool = false 
  15. var data_dir string = "./moyan" //文件存放目录 
  16. var limen float64 = 0.1159203888322267 //阈值 
  17.  
  18. const ( 
  19. MIN_HANZI rune = 0x3400 
  20. MAX_HANZI rune = 0x9fbb 
  21.  
  22. var labels []rune = []rune{ 
  23. 0x817f, 0x80f8, 0x4e73, 0x81c0, 
  24. 0x5c41, 0x80a1, 0x88f8, 0x6deb, 
  25.  
  26. func errHandle(err error) { 
  27. if err != nil { 
  28. log.Fatal(err) 
  29.  
  30. func load(name string) (m map[rune]int, err error) { 
  31. f, err := os.Open(name) 
  32. if err != nil { 
  33. return nil, err 
  34. defer f.Close() 
  35. buf := bufio.NewReader(f) 
  36. m = make(map[rune]int
  37. var r rune 
  38. for { 
  39. r, _, err = buf.ReadRune() 
  40. if err != nil { 
  41. if err == io.EOF { 
  42. break 
  43. return nil, err 
  44. if r >= MIN_HANZI && r <= MAX_HANZI { 
  45. m[r] += 1 
  46. return m, nil 
  47. func classify(m map[rune]int) (idv []float64, dis float64) { 
  48. len_m := len(m) 
  49. for i, v := range labels { 
  50. if debug { 
  51. fmt.Println(i, m[v], string(v), float64(m[v])/float64(len_m)) 
  52. idv = append(idv, float64(m[v])/float64(len_m)) 
  53. for _, v := range idv { 
  54. dis += math.Pow(v, 2) 
  55. dis = math.Sqrt(dis) 
  56. return 
  57. func check(fp string, dis float64) { 
  58. switch { 
  59. case dis >= limen: 
  60. fmt.Println(fp, dis, "涉黄"
  61. case dis == 1.0: 
  62. fmt.Println(fp, dis, "你在作弊吗"
  63. case dis == 0: 
  64. fmt.Println(fp, dis, "检查一下文件字符编码是不是utf8格式吧"
  65. default
  66. fmt.Println(fp, dis, "正常"
  67.  
  68. func walkFunc(fp string, info os.FileInfo, err error) error { 
  69. if path.Ext(fp) == ".txt" { 
  70. m, err := load(fp) 
  71. errHandle(err) 
  72. _, dis := classify(m) 
  73. check(fp, dis) 
  74. return err 
  75.  
  76. var file string 
  77.  
  78. func init() { 
  79. _, err := os.Stat(data_dir) 
  80. if err != nil { 
  81. err = os.Mkdir(data_dir, os.ModePerm) 
  82. errHandle(err) 
  83. flag.StringVar(&file, "file""""file read in,if you don't give the file read in,"
  84. "it will create a data dictionary,just pust your files in it"
  85.  
  86. func main() { 
  87. flag.Parse() 
  88. if file == "" { 
  89. filepath.Walk(data_dir, walkFunc) 
  90. return 
  91. m, err := load(file) 
  92. errHandle(err) 
  93. _, dis := classify(m) 
  94. check(file, dis) 
  95.  

以上所述就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表