util.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package main
  2. import (
  3. util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  4. "regexp"
  5. "strings"
  6. )
  7. type TagMatching struct {
  8. tagName string //标签名称
  9. tagCode string //标签值(保存)
  10. matchField []string //关键词匹配字段,title,detail
  11. matchKey string //匹配的词语,多个使用逗号连接,"部队,国防,军事,军用"
  12. matchKeyReg []*RegexpInfo //关键词的正则
  13. addField []string //附加词匹配字段
  14. addKey string //附件词匹配关键词
  15. addKeyReg []*RegexpInfo //附加次的正则
  16. excludeField []string //排除词匹配字段
  17. excludeKey string //排除词匹配词
  18. excludeKeyReg []*RegexpInfo //排除词正则
  19. //clearKey []string //清理词匹配字段跟关键词一样
  20. }
  21. type RegexpInfo struct {
  22. keyStr string
  23. regs *regexp.Regexp
  24. }
  25. // GetRegex 根据关键词或者对应正则
  26. func GetRegex(key string) []*RegexpInfo {
  27. var infos []*RegexpInfo
  28. for _, s := range strings.Split(key, ",") {
  29. if strings.Contains(s, "&&") || strings.Contains(s, "&!") {
  30. info := &RegexpInfo{
  31. keyStr: s,
  32. regs: nil,
  33. }
  34. infos = append(infos, info)
  35. } else {
  36. info := &RegexpInfo{
  37. keyStr: s,
  38. regs: regexp.MustCompile(".*(?i)" + s + ".*"),
  39. }
  40. infos = append(infos, info)
  41. }
  42. }
  43. return infos
  44. }
  45. // TaskTags 根据数据和正则规则,验证数据标签
  46. func TaskTags(tmp map[string]interface{}, regs []TagMatching) (tags []string, keyWord, addWord, exWord string) {
  47. // 在匹配字段里,比如标题满足了关键词,详情满足附加词,关键词的匹配字段含有标题,附加词的匹配字段含有详情;就符合条件
  48. Loop:
  49. for _, v := range regs {
  50. keyR := false // 关键词匹配结果
  51. addR := false //附加次匹配结果
  52. // 1.排除词
  53. if len(v.excludeField) > 0 && len(v.excludeKeyReg) > 0 {
  54. // 遍历排除词对应的tmp字段信息
  55. for _, f := range v.excludeField {
  56. if val := util.ObjToString(tmp[f]); val != "" {
  57. if rs, ex := getRegsResult(val, v.excludeKeyReg); rs {
  58. //有排除词,直接判断下一个规则
  59. exWord = ex
  60. continue Loop
  61. }
  62. }
  63. }
  64. }
  65. // 清理词;目的把 类似 fuck的单词替换为空字符串
  66. //if len(v.clearKey) > 0 && len(v.matchField) > 0 {
  67. // for _, s := range v.clearKey {
  68. // for _, f := range v.matchField {
  69. // if val := util.ObjToString(tmp[f]); val != "" {
  70. // tmp[f] = strings.ReplaceAll(val, s, "")
  71. // }
  72. // }
  73. // }
  74. //}
  75. // 关键词
  76. if len(v.matchField) > 0 && len(v.matchKeyReg) > 0 {
  77. for _, f := range v.matchField {
  78. if val := util.ObjToString(tmp[f]); val != "" {
  79. if rs, da := getRegsResult(val, v.matchKeyReg); rs {
  80. keyR = true
  81. keyWord = da
  82. //log.Print("key", da)
  83. break
  84. }
  85. }
  86. }
  87. }
  88. // 附加词
  89. if len(v.addField) > 0 && len(v.addKeyReg) > 0 && keyR {
  90. for _, f := range v.addField {
  91. if val := util.ObjToString(tmp[f]); val != "" {
  92. if rs, da := getRegsResult(val, v.addKeyReg); rs {
  93. addR = true
  94. addWord = da
  95. //log.Println("add", da)
  96. break
  97. }
  98. }
  99. }
  100. } else {
  101. addR = true
  102. }
  103. // 满足 关键词和附加词条件
  104. if keyR && addR {
  105. // 去重相同标签
  106. if !IsInStringArray(v.tagName, tags) {
  107. tags = append(tags, v.tagName)
  108. }
  109. }
  110. }
  111. return
  112. }
  113. // getRegsResult 验证数据是否符合数组正则
  114. func getRegsResult(data string, regs []*RegexpInfo) (res bool, a string) {
  115. for _, e1 := range regs {
  116. if e1.regs != nil && e1.regs.MatchString(data) {
  117. return true, e1.regs.String()
  118. } else {
  119. // && 特殊处理
  120. if strings.Contains(e1.keyStr, "&&") {
  121. flag := true
  122. for _, s := range strings.Split(e1.keyStr, "&&") {
  123. if !strings.Contains(data, s) {
  124. flag = false
  125. break
  126. }
  127. }
  128. if flag {
  129. return true, e1.keyStr
  130. }
  131. }
  132. // 前面是必须有的关键词&!,后面是不能有的关键词;比如 军队&!点军队,
  133. if strings.Contains(e1.keyStr, "&!") {
  134. keys := strings.Split(e1.keyStr, "&!")
  135. if strings.Contains(data, keys[0]) && !strings.Contains(data, keys[1]) {
  136. return true, e1.keyStr
  137. }
  138. }
  139. }
  140. }
  141. return false, ""
  142. }
  143. // dealName 处理名称中中英文括号
  144. func dealName(name string) string {
  145. name = strings.Replace(name, "(", "(", -1)
  146. name = strings.Replace(name, ")", ")", -1)
  147. return name
  148. }