extractarea.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package main
  2. import (
  3. "qfw/util"
  4. )
  5. var CityConfig map[string]interface{}
  6. var AreaGet DFA //敏感词
  7. func initarea() {
  8. util.ReadConfig("city.json", &CityConfig)
  9. cp := CityConfig["city"].(map[string]interface{})
  10. citys := []string{}
  11. for k, _ := range cp {
  12. citys = append(citys, k)
  13. }
  14. AreaGet = DFA{}
  15. AreaGet.AddWord(citys...)
  16. }
  17. type DFA struct {
  18. Link map[string]interface{}
  19. }
  20. func (d *DFA) AddWordAll(haskey bool, keys ...string) {
  21. if d.Link == nil {
  22. d.Link = make(map[string]interface{})
  23. }
  24. for _, key := range keys {
  25. nowMap := &d.Link
  26. for i := 0; i < len(key); i++ {
  27. kc := key[i : i+1]
  28. if v, ok := (*nowMap)[kc]; ok {
  29. nowMap, _ = v.(*map[string]interface{})
  30. } else {
  31. newMap := map[string]interface{}{}
  32. newMap["YN"] = "0"
  33. (*nowMap)[kc] = &newMap
  34. nowMap = &newMap
  35. }
  36. if i == len(key)-1 {
  37. (*nowMap)["YN"] = "1"
  38. if haskey {
  39. (*nowMap)["K"] = key
  40. }
  41. }
  42. }
  43. }
  44. }
  45. func (d *DFA) AddWord(keys ...string) {
  46. d.AddWordAll(false, keys...)
  47. }
  48. //适合一次查找
  49. func (d *DFA) CheckSensitiveWord(src string) (b bool) {
  50. pos := 0
  51. nowMap := &d.Link
  52. for i := 0; i < len(src); i++ {
  53. word := src[i : i+1]
  54. nowMap, _ = (*nowMap)[word].(*map[string]interface{})
  55. if nowMap != nil { // 存在,则判断是否为最后一个
  56. if pos == 0 {
  57. pos = i
  58. }
  59. if "1" == util.ObjToString((*nowMap)["YN"]) { // 如果为最后一个匹配规则,结束循环,返回匹配标识数
  60. b = true
  61. break
  62. }
  63. } else {
  64. nowMap = &d.Link
  65. if pos > 0 {
  66. i = pos
  67. pos = 0
  68. }
  69. }
  70. }
  71. return
  72. }