wangchuanjin 4 年之前
父節點
當前提交
318150f9cf
共有 3 個文件被更改,包括 117 次插入144 次删除
  1. 1 70
      src/jfw/front/swordfish.go
  2. 1 74
      src/jfw/modules/app/src/app/front/swordfish.go
  3. 115 0
      src/jfw/public/recomKws.go

+ 1 - 70
src/jfw/front/swordfish.go

@@ -29,7 +29,6 @@ import (
 
 	"github.com/go-xweb/httpsession"
 	"github.com/go-xweb/xweb"
-	. "github.com/thinxer/go-word2vec"
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/bson/primitive"
 )
@@ -40,14 +39,8 @@ const (
 	bidSearch_sort    = `{"publishtime":-1}`
 )
 
-var M *Model
-var recomKWChan chan bool = make(chan bool, 1)
 var listlock = &sync.Mutex{}
 
-func init() {
-	M, _ = Load("./zb.bin")
-}
-
 //剑鱼标讯推送三级页点赞暂弃 改成剑鱼标讯实验室点赞功能
 func (m *Front) Praise() error {
 	defer util.Catch()
@@ -1501,70 +1494,8 @@ func (f *Front) MyFeedbacks() error {
 	return nil
 }
 func (f *Front) GetRecomKWs() {
-	maxCount := 500
-	recomKWChan <- true
-	defer func() {
-		<-recomKWChan
-	}()
-	value := f.GetString("value")
 	count, _ := f.GetInteger("count")
-	ves := strings.Split(value, " ")
-	var pairs []map[string]interface{}
-	for _, v := range ves {
-		//获取随机数
-		arr := generateRandomNumber(0, maxCount, count)
-		Pw, _ := M.MostSimilar(strings.Split(v, "+"), []string{}, maxCount)
-		for k, p := range Pw {
-			sim := p.Sim
-			word := p.Word
-			// if sim < float32(config.Sysconfig["recommendThreshold"].(float64)) {
-			// 	continue
-			// }
-			if !isinByInt(k, arr) {
-				continue
-			}
-			if strings.HasSuffix(word, "路") || public.DealString(word) {
-				continue
-			}
-			pairs = append(pairs, map[string]interface{}{
-				"sim":  sim,
-				"word": word,
-			})
-
-		}
-	}
-	f.ServeJson(pairs)
-}
-
-//随机数查询
-func generateRandomNumber(start int, end int, count int) []int {
-	//范围检查
-	if end < start || (end-start) < count {
-		return nil
-	}
-	//存放结果的slice
-	nums := make([]int, 0)
-	m := map[int]bool{}
-	//随机数生成器,加入时间戳保证每次生成的随机数不一样
-	r := rand.New(rand.NewSource(time.Now().UnixNano()))
-	for len(nums) < count {
-		//生成随机数
-		num := r.Intn((end - start)) + start
-		if !m[num] {
-			m[num] = true
-			nums = append(nums, num)
-		}
-	}
-	return nums
-}
-
-func isinByInt(i int, arr []int) bool {
-	for _, v := range arr {
-		if i == v {
-			return true
-		}
-	}
-	return false
+	f.ServeJson(public.RecomKws.GetRecomKws(f.GetString("value"), count))
 }
 
 //记录用户行为--推荐关键词

+ 1 - 74
src/jfw/modules/app/src/app/front/swordfish.go

@@ -19,7 +19,6 @@ import (
 	"time"
 
 	"github.com/go-xweb/httpsession"
-	. "github.com/thinxer/go-word2vec"
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/bson/primitive"
 )
@@ -33,14 +32,8 @@ const (
 	bidSearch_sort    = `{"publishtime":-1}`
 )
 
-var M *Model
-var recomKWChan chan bool = make(chan bool, 1)
 var listlock = &sync.Mutex{}
 
-func init() {
-	M, _ = Load("./zb.bin")
-}
-
 //剑鱼标讯推送三级页点赞暂弃 改成剑鱼标讯实验室点赞功能
 func (m *Front) Praise() error {
 	defer util.Catch()
@@ -625,74 +618,8 @@ func wxvisitD(sid, userId string) (objdata map[string]interface{}) {
 	return obj
 }
 func (f *Front) GetRecomKWs() {
-	maxCount := 500
-	recomKWChan <- true
-	defer func() {
-		<-recomKWChan
-	}()
-	value := f.GetString("value")
 	count, _ := f.GetInteger("count")
-	ves := strings.Split(value, " ")
-	var pairs []map[string]interface{}
-	for _, v := range ves {
-		Pw, _ := M.MostSimilar(strings.Split(v, "+"), []string{}, maxCount)
-		arr := generateRandomNumber(0, maxCount, count)
-		for k, p := range Pw {
-			sim := p.Sim
-			word := p.Word
-			// if sim < float32(config.Sysconfig["recommendThreshold"].(float64)) {
-			// 	continue
-			// }
-			if !isinByInt(k, arr) {
-				continue
-			}
-			if strings.HasSuffix(word, "路") || public.DealString(word) {
-				continue
-			}
-			pairs = append(pairs, map[string]interface{}{
-				"sim":  sim,
-				"word": word,
-			})
-		}
-	}
-	f.ServeJson(pairs)
-}
-
-//随机数查询
-func generateRandomNumber(start int, end int, count int) []int {
-	//范围检查
-	if end < start || (end-start) < count {
-		return nil
-	}
-	//存放结果的slice
-	nums := make([]int, 0)
-	//随机数生成器,加入时间戳保证每次生成的随机数不一样
-	r := rand.New(rand.NewSource(time.Now().UnixNano()))
-	for len(nums) < count {
-		//生成随机数
-		num := r.Intn((end - start)) + start
-		//查重
-		exist := false
-		for _, v := range nums {
-			if v == num {
-				exist = true
-				break
-			}
-		}
-		if !exist {
-			nums = append(nums, num)
-		}
-	}
-	return nums
-}
-
-func isinByInt(i int, arr []int) bool {
-	for _, v := range arr {
-		if i == v {
-			return true
-		}
-	}
-	return false
+	f.ServeJson(public.RecomKws.GetRecomKws(f.GetString("value"), count))
 }
 
 //记录用户行为--推荐关键词

+ 115 - 0
src/jfw/public/recomKws.go

@@ -0,0 +1,115 @@
+package public
+
+import (
+	"math/rand"
+	. "qfw/util"
+	"sort"
+	"strings"
+	"sync"
+	"time"
+
+	. "github.com/thinxer/go-word2vec"
+)
+
+var RecomKws = &recomKws{
+	reqPool: make(chan bool, 5),
+}
+
+func init() {
+	RecomKws.model, _ = Load("./zb.bin")
+}
+
+type recomKws struct {
+	reqPool chan bool
+	model   *Model
+}
+
+func (rk *recomKws) GetRecomKws(value string, count int) []*map[string]interface{} {
+	rk.reqPool <- true
+	defer func() {
+		<-rk.reqPool
+	}()
+	recomPool := make(chan bool, 5)
+	wait := &sync.WaitGroup{}
+	lock := &sync.Mutex{}
+	maxCount := count * 3
+	if maxCount > 100 {
+		maxCount = 100
+	}
+	keys := strings.Split(value, " ")
+	wordMap := map[string]bool{}
+	randomNum := rk.generateRandomNumber(maxCount, count)
+	keyMap := map[string]bool{}
+	allKeyMap := map[string]bool{}
+	for _, key := range keys {
+		for _, v := range strings.Split(key, "+") {
+			v = strings.TrimSpace(v)
+			if v == "" {
+				continue
+			}
+			allKeyMap[v] = true
+		}
+	}
+	sl := &ComSortList{
+		SortKeys: []*ComSortKey{
+			&ComSortKey{
+				Keys:  []string{"sim"},
+				Order: -1,
+				Type:  "float",
+			},
+		},
+		List: []*map[string]interface{}{},
+	}
+	for _, key := range keys {
+		key = strings.TrimSpace(key)
+		if keyMap[key] {
+			continue
+		}
+		keyMap[key] = true
+		recomPool <- true
+		wait.Add(1)
+		go func(v string) {
+			defer func() {
+				<-recomPool
+				wait.Done()
+			}()
+			//获取随机数
+			pw, _ := rk.model.MostSimilar(strings.Split(v, "+"), []string{}, maxCount)
+			for k, p := range pw {
+				p.Word = strings.TrimSpace(p.Word)
+				if p.Word == "" || !randomNum[k] || allKeyMap[p.Word] || len([]rune(p.Word)) == 1 {
+					continue
+				}
+				if strings.HasSuffix(p.Word, "路") || DealString(p.Word) {
+					continue
+				}
+				lock.Lock()
+				if !wordMap[p.Word] {
+					sl.List = append(sl.List, &map[string]interface{}{
+						"sim":  p.Sim,
+						"word": p.Word,
+					})
+				}
+				wordMap[p.Word] = true
+				lock.Unlock()
+			}
+		}(key)
+	}
+	wait.Wait()
+	sort.Sort(sl)
+	if len(sl.List) > 100 {
+		return sl.List[:100]
+	}
+	return sl.List
+}
+
+//随机数查询
+func (rk *recomKws) generateRandomNumber(max int, count int) map[int]bool {
+	nums := map[int]bool{}
+	//随机数生成器,加入时间戳保证每次生成的随机数不一样
+	r := rand.New(rand.NewSource(time.Now().UnixNano()))
+	for len(nums) < count {
+		nums[r.Intn(max)] = true
+	}
+	return nums
+}