utils.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package main
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/PuerkitoBio/goquery"
  7. zhipu "github.com/itcwc/go-zhipu/model_api"
  8. "github.com/volcengine/volcengine-go-sdk/service/arkruntime"
  9. "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
  10. "github.com/volcengine/volcengine-go-sdk/volcengine"
  11. util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  12. "log"
  13. "regexp"
  14. "strings"
  15. "time"
  16. )
  17. func HtmlToText(content string) string {
  18. doc2, _ := goquery.NewDocumentFromReader(strings.NewReader(content))
  19. //log.Println(doc2.Html())
  20. doc2.Find("h1").Each(func(i int, selection *goquery.Selection) {
  21. selection.AfterHtml(string(rune(10)))
  22. })
  23. //log.Println(doc2.Html())
  24. return doc2.Text()
  25. }
  26. // getLastMonthFirstDayTimestamp 获取上月 1 号的时间戳
  27. func getLastMonthFirstDayTimestamp() int64 {
  28. now := time.Now()
  29. // 获取上月
  30. lastMonth := now.AddDate(0, -1, 0)
  31. // 设置为上月 1 号的 0 点 0 分 0 秒
  32. firstDayOfLastMonth := time.Date(lastMonth.Year(), lastMonth.Month(), 1, 0, 0, 0, 0, lastMonth.Location())
  33. // 返回时间戳
  34. return firstDayOfLastMonth.Unix()
  35. }
  36. // isOutData 判断数据是否符合排除规则
  37. func isOutData(tmp map[string]interface{}) (bool, int) {
  38. title := util.ObjToString(tmp["title"])
  39. detail := util.ObjToString(tmp["detail"])
  40. if GF.Env.TitleOut != "" {
  41. titleOutReg := regexp.MustCompile(GF.Env.TitleOut)
  42. titleOutMatchs := titleOutReg.FindAllString(title, -1)
  43. //标题排除词
  44. if len(titleOutMatchs) > 0 {
  45. return true, 0
  46. }
  47. }
  48. if GF.Env.DetailOut != "" {
  49. //内容排除词
  50. detailOutReg := regexp.MustCompile(GF.Env.DetailOut)
  51. detailOutMatchs := detailOutReg.FindAllString(detail, -1)
  52. if len(detailOutMatchs) > 0 {
  53. return true, 0
  54. }
  55. }
  56. titleMatchReg := regexp.MustCompile(GF.Env.TitleMatch)
  57. titleMatchs := titleMatchReg.FindAllString(title, -1)
  58. if len(titleMatchs) > 0 {
  59. return false, 1
  60. } else {
  61. return false, 3
  62. }
  63. }
  64. // ZpRelated 调用智普,获取相关度和权重
  65. func ZpRelated(apiKey, model, title, content string) (rest map[string]interface{}) {
  66. expireAtTime := int64(1719803252) // token 过期时间
  67. sys := "你是一名嗅觉敏感的商人,根据新闻描述,判断是否存在一下情况:\n1、存在医院、学校、银行、事业单位的办公楼新建、扩建、搬迁等\n2、存在公司或机构的办公地点变更\n3、存在公司注册资金增资、合并、收购等\n4、存在医院、学校、银行、公司、商场、事业单位等成立分支机构或部门等\n5、存在相关企事业单位招聘新员工\n6、存在所有行业竞得用地、竞拍所得土地等\n7、存在建筑类工程项目开工、投产、封顶等类似场景,并且不得存在:桥梁建设、小区建设等场景\n8、文中要真实明确的存在上述情况,不要联想猜测\n9、输出结果格式如下:\n{\"type_ai\": \"(存在/不存在)\",\n\"type_weight\": (0-1之间),\n\"name\":\"(新建的组织机构名称、企业单位名称)\"\n}\n\n输出结果以JSON形式返回;相关标签 只有存在和不存在二个结果;相关权重是0-1之间的数字;严格按照JSON的格式返回我三个字段 type_ai、type_weight和name 。按照以上要求输出,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写;不要给我返回多个主体单位,我只要一个。我的标题是:%s。我的内容是:%s"
  68. text := fmt.Sprintf(sys, title, content)
  69. //text := fmt.Sprintf(`你是一家打印机供应商,请根据我给你提供的线索评测是否有购入打印机的需求,并给出权重;同时把主体单位给出来,主体单位只要一个。通常需要新购打印机的场景有:通常需要新购打印机的场景有:\\n1、相关医院、学校、银行、事业单位的办公楼新建、扩建、搬迁等\\n2、相关新公司成立、公司变更地址等\\n3、相关公司注册资金增资、公司合并或收购其他公司等\\n4、相关医院、学校、银行、公司、商场、事业单位拓展成立新增分支机构或部门等\\n5、相关企事业单位招聘新员工公告等\\n6、相关所有行业竞得用地、竞拍所得土地等\\n7、相关建筑类工程项目开工、投产、封顶等类似场景。 输出结果格式如下:\n\n {"type_ai": "相关", "type_weight": 0.9, "name": "优领域创作者"} \n 输出结果以JSON形式返回;相关标签 只有相关和不相关二个结果;相关权重是0-1之间的数字;严格按照JSON的格式返回我三个字段 type_ai、type_weight和name 。按照以上要求输出,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写;不要给我返回多个主体单位,我只要一个。我的标题是:%s。我的内容是:%s `, title, content)
  70. mssage := zhipu.PostParams{
  71. Model: model,
  72. Messages: []zhipu.Message{
  73. {
  74. Role: "user", // 消息的角色信息 详见文档
  75. Content: text,
  76. },
  77. },
  78. }
  79. postResponse, err := zhipu.BeCommonModel(expireAtTime, mssage, apiKey)
  80. if err != nil {
  81. fmt.Println(err)
  82. return
  83. }
  84. if choices, ok := postResponse["choices"].([]interface{}); ok {
  85. if choice, ok2 := choices[0].(map[string]interface{}); ok2 {
  86. if message, ok3 := choice["message"].(map[string]interface{}); ok3 {
  87. if content, ok4 := message["content"].(string); ok4 {
  88. content = strings.ReplaceAll(content, "\n", "")
  89. content = strings.ReplaceAll(content, "json", "")
  90. content = strings.ReplaceAll(content, "`", "")
  91. err = json.Unmarshal([]byte(content), &rest)
  92. if err != nil {
  93. log.Println("Unmarshal err", err, "content:", content)
  94. }
  95. }
  96. }
  97. }
  98. }
  99. return
  100. }
  101. // CozeChat coze 扣子模型
  102. func CozeChat(title, content string) (rest map[string]interface{}) {
  103. client := arkruntime.NewClientWithApiKey("f9fd581f-8bea-488a-86b1-49c7d46176b5")
  104. ctx := context.Background()
  105. fmt.Println("----- standard request -----")
  106. req := model.ChatCompletionRequest{
  107. Model: "ep-20240726175416-5x8pq",
  108. Messages: []*model.ChatCompletionMessage{
  109. {
  110. Role: model.ChatMessageRoleSystem,
  111. Content: &model.ChatCompletionMessageContent{
  112. //StringValue: volcengine.String("你是一家打印机供应商,请根据我给你提供的线索评测是否有购入打印机的需求,并给出权重。\n通常需要新购打印机的场景有:\n1、医院、学校、事业单位的办公楼新建、扩建、搬迁\n2、新公司成立、公司变更地址\n我的正文如下:"),
  113. StringValue: volcengine.String(`你是一家打印机供应商,请根据我给你提供的线索评测是否有购入打印机的需求,并给出权重;同时把主体单位给出来,主体单位只要一个。通常需要新购打印机的场景有:通常需要新购打印机的场景有:\\n1、相关医院、学校、银行、事业单位的办公楼新建、扩建、搬迁等\\n2、相关新公司成立、公司变更地址等\\n3、相关公司注册资金增资、公司合并或收购其他公司等\\n4、相关医院、学校、银行、公司、商场、事业单位拓展成立新增分支机构或部门等\\n5、相关企事业单位招聘新员工公告等\\n6、相关所有行业竞得用地、竞拍所得土地等\\n7、相关建筑类工程项目开工、投产、封顶等类似场景。 输出结果格式如下:\n\n {"type_ai": "相关", "type_weight": 0.9, "name": "优领域创作者"} \n 输出结果以JSON形式返回;相关标签 只有相关和不相关二个结果;相关权重是0-1之间的数字;严格按照JSON的格式返回我三个字段 type_ai、type_weight和name 。按照以上要求输出,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写;不要给我返回多个主体单位,我只要一个 `),
  114. },
  115. },
  116. {
  117. Role: model.ChatMessageRoleUser,
  118. Content: &model.ChatCompletionMessageContent{
  119. StringValue: volcengine.String(fmt.Sprintf("我的标题是: %s。我的内容是:%s", title, content)),
  120. },
  121. },
  122. },
  123. }
  124. resp, err := client.CreateChatCompletion(ctx, req)
  125. if err != nil {
  126. fmt.Printf("standard chat error: %v\n", err)
  127. return
  128. }
  129. //fmt.Println(*resp.Choices[0].Message.Content.StringValue)
  130. err = json.Unmarshal([]byte(*resp.Choices[0].Message.Content.StringValue), &rest)
  131. if err != nil {
  132. log.Println("Unmarshal err", err, "content:", content)
  133. }
  134. return
  135. }