wcc 11 місяців тому
батько
коміт
b88b7a8d26
9 змінених файлів з 361 додано та 94 видалено
  1. 24 74
      doubao/main.go
  2. 15 10
      yuqing/config.go
  3. 2 1
      yuqing/config.toml
  4. 7 1
      yuqing/go.mod
  5. 16 1
      yuqing/go.sum
  6. 116 7
      yuqing/main.go
  7. 135 0
      yuqing/utils.go
  8. 46 0
      yuqing/y_test.go
  9. BIN
      yuqing/重客类型.xlsx

+ 24 - 74
doubao/main.go

@@ -10,11 +10,30 @@ import (
 
 func main() {
 	//botChat()
-	zhiPu()
+	//zhiPu()
+	title := "采埃孚官宣大幅裁员,1.4万人受影响"
+	content := `近日,德国汽车零部件巨头采埃孚宣布,预计将在2028年底前,将其德国员工人数从目前的5.4万人,逐步削减1.1万~1.4万人。另外,采埃孚计划在德国进行必要的工厂整合,根据预期的持续疲软的市场需求调整产能。同时,由于竞争激烈、成本压力及电动汽车需求疲软,此次调整的重点之一是采埃孚的电驱传动技术事业部。
+01大幅精简人员及架构
+事实上,采埃孚裁员的消息最初是在今年1月公布的,当时的官方消息是,到2030年,采埃孚将分两批裁员1.2万人。不过,也有一些员工代表称,公司管理层告诉自己,公司理论上最多可能裁掉1.8万人。
+而今,裁员规模正式敲定了下来,为1.1万~1.4万人,且是在2028年底前,较原计划有所提前。目前,采埃孚在全球拥有约16.87万名员工,其中德国员工共计5.4万人。这意味着,将有约1/4的德国员工不得不离开采埃孚,这是一个相当高的比例。
+此次大规模裁员,伴随着采埃孚德国板块的业务调整和架构重组。采埃孚指出,公司将进一步加大对商用车技术、底盘解决方案、工业技术和售后市场部门的投资。
+同时,采埃孚计划在德国进行必要的工厂整合,部分工厂可能会关闭,产能方面也会进行调整。“正如采埃孚一再指出的那样,如果事实证明无法为个别基地找到长期前景,或者无法永久提高竞争力,那么重组或关闭也是一种选择。”该公司在一份声明中表示。
+负责生产的采埃孚董事彼得·莱尔指出:“我们希望整合德国的基地,并将它们合并成几个基地网络。我们的目标是,一方面建立一个高效的生产网络,另一方面建立一个高效的研发组织。”近年来,由于一系列重大收购,例如2015年收购天合,2020年收购威伯科等,采埃孚在德国的基地规模逐渐扩大,公司有意对小规模的基地分阶段进行精简与合并,组合成几个较大的基地。
+架构精简的背后自然伴随着人员的减少。采埃孚表示,人员削减将尽可能以对社会负责的方式进行,例如提前退休、支付遣散费等,而员工精简之后,更高程度的自动化、数字化有助于提高其竞争力。这一做法也并非行业内的个例,从去年至今,博世、大陆集团、佛瑞亚、法雷奥、奥托立夫等零部件厂商也宣布了各自的裁员计划,且力度颇大。
+当然,采埃孚此次大幅调整的背后,一方面是行业转型的需要,另一方面也是因为其背负着较大的债务压力。近年来,采埃孚一直在努力偿还为收购天合及威伯科而借入的资金。在过去的2023年,采埃孚偿还了约20亿欧元的债务,净债务减少4亿欧元,降至100亿欧元以下。正是考虑到面向电动化转型的财务压力及百亿欧元债务,采埃孚计划在2025年底前将成本支出减少总计60亿欧元。
+02电动动力总成产能过剩
+值得注意的是,欧美市场电动汽车需求放缓,给包括采埃孚在内的零部件厂商带来了较大压力。采埃孚希望通过调整架构,提高其竞争力,并应对移动出行领域的变化,特别是在电动汽车领域。
+采埃孚此次战略调整的重点之一就是其电驱传动技术事业部,该事业部于2021年1月成立,英文名为Electrified Powertrain Technology Division,由原乘用车传动技术事业部和电驱动技术事业部合并而来。作为采埃孚“下一代出行”战略的重要组成部分,该事业部是采埃孚转型最核心的驱动力之一。
+不过,采埃孚方面指出,乘用车动力总成市场竞争激烈,面临着较大的成本压力,电动汽车利润率仍然普遍较低,而行业向电动汽车的转变也将导致用于传统车和混合动力车的变速器数量下降,再加上目前电动汽车需求明显疲软,这导致该公司投入巨资建立的电动动力总成生产线产能过剩。
+考虑到这些因素,采埃孚将重点审查和改进电驱传动技术事业部的工作流程和架构。采埃孚CEO柯皓哲(Holger Klein)一方面强调:“不管目前的市场状况如何,有一件事是明确的,未来属于电动汽车。我们在这里进行了积极的投资,并将继续在这一领域进行大量投资。”另一方面,柯皓哲也指出,市场前景的变化和电动动力总成技术的激烈竞争也需要开放的合作态度和强有力的伙伴关系。“除了我们自己的承诺,即在电动汽车方面取得进一步进展,我们还需要研究这些选项。”他说。
+很显然,采埃孚希望在电动化领域寻求更多订单。不过,在电动汽车市场需求放缓,主机厂纷纷下调电动汽车产量的情况下,这显然并不是一件容易的事。在欧洲尤其是补贴提前取消的德国,电动汽车市场表现并不乐观。今年上半年,德国乘用车市场实现了5.4%的增长,达到147万辆,但其中,电动汽车销量同比下滑9%,为27.37万辆,市占率也由去年同期的近25%下滑至18.6%。
+尽管如此,正如柯皓哲指出的那样,谋求转型的传统汽车零部件供应商并没有放弃在电动化领域的投资,这是其未来保持持续增长的关键。以采埃孚为例,在今年3月的财报会议上,采埃孚提出到 2025 年底减少60亿欧元成本的同时,也宣布到 2026 年底在全球范围内投资近180 亿欧元,其中约106亿欧元将用于研发。
+`
+	normalChat(title, content)
 }
 
 // normalChat 豆包普通对话
-func normalChat() {
+func normalChat(title, content string) {
 	client := arkruntime.NewClientWithApiKey("f9fd581f-8bea-488a-86b1-49c7d46176b5")
 	ctx := context.Background()
 
@@ -25,13 +44,14 @@ func normalChat() {
 			{
 				Role: model.ChatMessageRoleSystem,
 				Content: &model.ChatCompletionMessageContent{
-					StringValue: volcengine.String("你是一家打印机供应商,请根据我给你提供的线索评测是否有购入打印机的需求,并给出权重。\n通常需要新购打印机的场景有:\n1、医院、学校、事业单位的办公楼新建、扩建、搬迁\n2、新公司成立、公司变更地址\n我的正文如下:"),
+					//StringValue: volcengine.String("你是一家打印机供应商,请根据我给你提供的线索评测是否有购入打印机的需求,并给出权重。\n通常需要新购打印机的场景有:\n1、医院、学校、事业单位的办公楼新建、扩建、搬迁\n2、新公司成立、公司变更地址\n我的正文如下:"),
+					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对应的值填写;不要给我返回多个主体单位,我只要一个 `),
 				},
 			},
 			{
 				Role: model.ChatMessageRoleUser,
 				Content: &model.ChatCompletionMessageContent{
-					StringValue: volcengine.String("2024年7月4日,来源于国家金融监督管理总局威海监管分局的消息,泰山财产保险股份有限公司威海市荣成支公司获批变更营业场所。经审查,同意其营业场所由原“荣成市南山中路19号二楼(201、202、203、204、205)”变更为“荣成市明珠路203号楼303一楼(部分区域)、二楼”。变更营业场所后,公司不得在原址再行办理保险业务,并须及时拆除原址标识及标牌。\n关注同花顺财经(ths518),获取更多机会\n\n输出结果格式如下:\n相关标签:相关/不相关 相关权重:0-1之间,以JSON格式给我"),
+					StringValue: volcengine.String(fmt.Sprintf("我的标题是: %s。我的内容是:%s", title, content)),
 				},
 			},
 		},
@@ -44,74 +64,4 @@ func normalChat() {
 	}
 	fmt.Println(*resp.Choices[0].Message.Content.StringValue)
 
-	//fmt.Println("----- streaming request -----")
-	//req = model.ChatCompletionRequest{
-	//	Model: "${YOUR_ENDPOINT_ID}",
-	//	Messages: []*model.ChatCompletionMessage{
-	//		{
-	//			Role: model.ChatMessageRoleSystem,
-	//			Content: &model.ChatCompletionMessageContent{
-	//				StringValue: volcengine.String("你是豆包,是由字节跳动开发的 AI 人工智能助手"),
-	//			},
-	//		},
-	//		{
-	//			Role: model.ChatMessageRoleUser,
-	//			Content: &model.ChatCompletionMessageContent{
-	//				StringValue: volcengine.String("常见的十字花科植物有哪些?"),
-	//			},
-	//		},
-	//	},
-	//}
-	//stream, err := client.CreateChatCompletionStream(ctx, req)
-	//if err != nil {
-	//	fmt.Printf("stream chat error: %v\n", err)
-	//	return
-	//}
-	//defer stream.Close()
-	//
-	//for {
-	//	recv, err := stream.Recv()
-	//	if err == io.EOF {
-	//		return
-	//	}
-	//	if err != nil {
-	//		fmt.Printf("Stream chat error: %v\n", err)
-	//		return
-	//	}
-	//
-	//	if len(recv.Choices) > 0 {
-	//		fmt.Print(recv.Choices[0].Delta.Content)
-	//	}
-	//}
-}
-
-// botChat coze智能体;代码有问题,暂时未解决,BotId 不对
-func botChat() {
-	client := arkruntime.NewClientWithApiKey("f9fd581f-8bea-488a-86b1-49c7d46176b5")
-	ctx := context.Background()
-
-	fmt.Println("----- standard request -----")
-	req := model.BotChatCompletionRequest{
-		BotId: "7396876125751836712",
-		Messages: []*model.ChatCompletionMessage{
-			{
-				Role: model.ChatMessageRoleUser,
-				Content: &model.ChatCompletionMessageContent{
-					StringValue: volcengine.String("2024年7月4日,来源于国家金融监督管理总局威海监管分局的消息,泰山财产保险股份有限公司威海市荣成支公司获批变更营业场所。经审查,同意其营业场所由原“荣成市南山中路19号二楼(201、202、203、204、205)”变更为“荣成市明珠路203号楼303一楼(部分区域)、二楼”。变更营业场所后,公司不得在原址再行办理保险业务,并须及时拆除原址标识及标牌。\n关注同花顺财经(ths518),获取更多机会\n\n输出结果格式如下:\n相关标签:相关/不相关 相关权重:0-1之间,以JSON格式给我"),
-				},
-			},
-		},
-	}
-
-	resp, err := client.CreateBotChatCompletion(ctx, req)
-	if err != nil {
-		fmt.Printf("standard chat error: %v\n", err)
-		return
-	}
-	fmt.Println(*resp.Choices[0].Message.Content.StringValue)
-	if resp.References != nil {
-		for _, ref := range resp.References {
-			fmt.Printf("reference url: %s\n", ref.Url)
-		}
-	}
 }

+ 15 - 10
yuqing/config.go

@@ -19,14 +19,19 @@ type GlobalConf struct {
 }
 
 type EnvConf struct {
-	Files    []string
-	Start    int
-	End      int
-	Shour    int
-	Ehour    int
-	Coll1    string
-	Coll2    string
-	Collb    string
-	Keyword  string
-	Specials []string
+	Files      []string
+	Start      int
+	End        int
+	Shour      int
+	Ehour      int
+	Coll1      string
+	Coll2      string
+	Collb      string
+	Keyword    string
+	Specials   []string
+	TitleOut   string
+	DetailOut  string
+	TitleMatch string
+	Key        string
+	Model      string
 }

Різницю між файлами не показано, бо вона завелика
+ 2 - 1
yuqing/config.toml


+ 7 - 1
yuqing/go.mod

@@ -3,19 +3,24 @@ module yuqing
 go 1.18
 
 require (
+	github.com/PuerkitoBio/goquery v1.8.0
+	github.com/itcwc/go-zhipu v0.0.0-20240626065325-ffc8bf1cfaaa
 	github.com/spf13/viper v1.16.0
+	github.com/volcengine/volcengine-go-sdk v1.0.151
 	github.com/xuri/excelize/v2 v2.8.0
 	go.uber.org/zap v1.22.0
 	jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20230815064446-4eb5ba934271
 )
 
 require (
-	github.com/PuerkitoBio/goquery v1.8.0 // indirect
 	github.com/andybalholm/cascadia v1.3.1 // indirect
 	github.com/dchest/captcha v1.0.0 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
+	github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
 	github.com/golang/snappy v0.0.1 // indirect
+	github.com/google/uuid v1.3.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
+	github.com/jmespath/go-jmespath v0.4.0 // indirect
 	github.com/klauspost/compress v1.13.6 // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
@@ -30,6 +35,7 @@ require (
 	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
 	github.com/subosito/gotenv v1.4.2 // indirect
+	github.com/volcengine/volc-sdk-golang v1.0.23 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.1 // indirect
 	github.com/xdg-go/stringprep v1.0.3 // indirect

+ 16 - 1
yuqing/go.sum

@@ -44,6 +44,7 @@ github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0g
 github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
 github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
 github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
 github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -76,6 +77,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2
 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
+github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -134,6 +137,8 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe
 github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
@@ -143,7 +148,11 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/itcwc/go-zhipu v0.0.0-20240626065325-ffc8bf1cfaaa h1:iOly0dSYv9AdoWfWt3uk4IF4O/nW+fyXV9rnC87UC7s=
+github.com/itcwc/go-zhipu v0.0.0-20240626065325-ffc8bf1cfaaa/go.mod h1:z7QZm7ol2nikFFGHwArJr1NTtBSE0M0g9MvHKxm1Sw0=
+github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
 github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
@@ -153,6 +162,7 @@ github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQ
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
@@ -215,6 +225,10 @@ github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8
 github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/volcengine/volc-sdk-golang v1.0.23 h1:anOslb2Qp6ywnsbyq9jqR0ljuO63kg9PY+4OehIk5R8=
+github.com/volcengine/volc-sdk-golang v1.0.23/go.mod h1:AfG/PZRUkHJ9inETvbjNifTDgut25Wbkm2QoYBTbvyU=
+github.com/volcengine/volcengine-go-sdk v1.0.151 h1:MZ2FX4MfJIBok9vQ0+gxymYhw09lEzyHYNmwIL2yy/M=
+github.com/volcengine/volcengine-go-sdk v1.0.151/go.mod h1:oht5AKDJsk0fY6tV2ViqaVlOO14KSRmXZlI8ikK60Tg=
 github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
@@ -577,8 +591,9 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
 google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=

+ 116 - 7
yuqing/main.go

@@ -8,6 +8,7 @@ import (
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils"
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	llog "log"
 	"os"
 	"regexp"
 	"strconv"
@@ -25,6 +26,7 @@ var (
 	insertUrl = make(map[string]bool, 0)
 	//specialChars = []string{"�", "Γ", "ΩΙ", "Δ", "Σ", "≤", "ζ", "Ψ", "®", "Φ", "ώ", "≈",
 	//	"’Ώ", "μ", "Λ", "Θ", "ß", "±", "Ύ", "©", "φ", "¬", "≤", "Й", "ж", "Щ", "Ъ"}
+	zkMap = make(map[string]string) //重客类型
 )
 
 func InitConfig() (err error) {
@@ -99,7 +101,8 @@ func main() {
 	InitConfig()
 	InitLog()
 	InitMgo()
-	//readFile()
+	//readFile() // 读文件写入数据库
+	readZK() //
 
 	exportFiles()
 
@@ -162,6 +165,19 @@ func readFile() {
 				if len(rows[i]) > 6 {
 					insert["wtype"] = rows[i][6]
 				}
+				if len(rows[i]) > 7 {
+					insert["rule_type"] = rows[i][7]
+				}
+				//大模型给的是否相关
+				if len(rows[i]) > 8 {
+					insert["model_ai"] = rows[i][8]
+				}
+				if len(rows[i]) > 9 {
+					insert["model_weight"] = rows[i][9]
+				}
+				if len(rows[i]) > 10 {
+					insert["l2"] = rows[i][10]
+				}
 				MgoN.Save(GF.MongoN.Coll, insert)
 			}
 
@@ -203,12 +219,13 @@ func exportFiles() {
 		if infourl != "" {
 			infourls[infourl] = true
 		}
-		if count%1000 == 0 {
+		if count%10000 == 0 {
 			log.Info("infourl", zap.Int("current", count))
 		}
 	}
 	log.Info("infourl", zap.Int("来源网址数量:", len(infourls)))
-
+	//上月1号时间戳
+	lastMonthTimestamp := getLastMonthFirstDayTimestamp()
 	//2.官网数据
 	var data = make([]map[string]interface{}, 0)
 	count2 := 0
@@ -237,12 +254,25 @@ func exportFiles() {
 				continue
 			}
 
+			//标题内容排除词
+			rsa, rsb := isOutData(tmp)
+			if rsa {
+				continue
+			} else {
+				tmp["typea"] = rsb
+			}
+
 			datetime, _ := ParseDateString(util.ObjToString(tmp["pubulishtime"]))
+			////发布时间,小于上月1号,直接过滤
+			if datetime < lastMonthTimestamp || datetime > time.Now().Unix() {
+				continue
+			}
+
 			if datetime > 0 {
 				tmp["pubulishtime"] = time.Unix(datetime, 0).Format("2006-01-02")
 			}
 			tmp["wtype"] = "官网-python"
-
+			tmp["zk"] = zkMap[util.ObjToString(tmp["site"])] //重客类型
 			data = append(data, tmp)
 			insertUrl[infourl] = true
 		}
@@ -272,6 +302,13 @@ func exportFiles() {
 			if contains(util.ObjToString(tmp["detail"]), GF.Env.Specials) {
 				continue
 			}
+			//标题内容排除词
+			rsa, rsb := isOutData(tmp)
+			if rsa {
+				continue
+			} else {
+				tmp["typea"] = rsb
+			}
 
 			if util.ObjToString(tmp["site"]) == "" && util.ObjToString(tmp["searchwords"]) != "" {
 				res, _ := Mgo.FindOne(GF.Env.Keyword, map[string]interface{}{"key": tmp["searchwords"]})
@@ -280,10 +317,16 @@ func exportFiles() {
 			}
 
 			datetime, _ := ParseDateString(util.ObjToString(tmp["pubulishtime"]))
+			////发布时间,小于上月1号,直接过滤
+			if datetime < lastMonthTimestamp || datetime > time.Now().Unix() {
+				continue
+			}
+
 			if datetime > 0 {
 				tmp["pubulishtime"] = time.Unix(datetime, 0).Format("2006-01-02")
 			}
 			tmp["wtype"] = "百度-Python"
+			tmp["zk"] = zkMap[util.ObjToString(tmp["site"])] //重客类型
 			data = append(data, tmp)
 			insertUrl[infourl] = true
 		}
@@ -314,12 +357,25 @@ func exportFiles() {
 					continue
 				}
 
+				//标题内容排除词
+				rsa, rsb := isOutData(tmp)
+				if rsa {
+					continue
+				} else {
+					tmp["typea"] = rsb
+				}
 				datetime := util.Int64All(tmp["publishtime"])
+				////发布时间,小于上月1号,直接过滤
+				if datetime < lastMonthTimestamp || datetime > time.Now().Unix() {
+					continue
+				}
+
 				if datetime > 0 {
 					tmp["pubulishtime"] = time.Unix(datetime, 0).Format("2006-01-02")
 				}
 				tmp["infourl"] = tmp["href"]
 				tmp["wtype"] = "官网-lua"
+				tmp["zk"] = zkMap[util.ObjToString(tmp["site"])] //重客类型
 				data = append(data, tmp)
 				insertUrl[infourl] = true
 			}
@@ -353,7 +409,7 @@ func exportFiles() {
 	_ = xlsx.SetColWidth(sheet, "E", "E", 45)
 	_ = xlsx.SetColWidth(sheet, "F", "F", 20)
 
-	subtitles := []interface{}{"发布日期", "来源单位", "标题", "正文内容", "来源网址", "重客类型", "采集方式"}
+	subtitles := []interface{}{"发布日期", "来源单位", "标题", "正文内容", "来源网址", "重客类型", "采集方式", "规则相关度", "ai相关度", "ai权重", "L2"}
 	line++
 	//设置第一行title
 	_ = xlsx.SetSheetRow(sheet, fmt.Sprintf("%s%d", "A", line), &subtitles)
@@ -361,11 +417,39 @@ func exportFiles() {
 	//file := "20230825惠普_舆情.xlsx"
 	fmt.Println("导出数据总数:-------", len(data))
 	for k, _ := range data {
-		fmt.Println("导出数据-------", k)
+		llog.Println("导出数据-------", k)
 		line++
 		val := []interface{}{
-			data[k]["pubulishtime"], data[k]["site"], data[k]["title"], data[k]["detail"], data[k]["infourl"], "", data[k]["wtype"],
+			data[k]["pubulishtime"], data[k]["site"], data[k]["title"], data[k]["detail"], data[k]["infourl"], data[k]["zk"], data[k]["wtype"], data[k]["typea"],
+		}
+		//调用智普AI
+		if GF.Env.Key != "" && GF.Env.Model != "" {
+			res := ZpRelated(GF.Env.Key, GF.Env.Model, util.ObjToString(data[k]["title"]), util.ObjToString(data[k]["detail"]))
+			//res := normalChat(util.ObjToString(data[k]["title"]), util.ObjToString(data[k]["detail"]))
+			val = append(val, res["type_ai"])
+			val = append(val, res["type_weight"])
+			//只要在L0 名单里,就不需要返回L2,否则返回大模型识别的主体
+			if zkMap[util.ObjToString(data[k]["site"])] != "" {
+				val = append(val, res["name"])
+			}
+		}
+
+		insert := map[string]interface{}{
+			"pubulishtime": strings.Replace(util.ObjToString(data[k]["pubulishtime"]), "/", "-", -1),
+			"site":         data[k]["site"],
+			"title":        data[k]["title"],
+			"detail":       data[k]["detail"],
+			"infourl":      data[k]["infourl"],
+			"type":         data[k]["zk"],
+			"wtype":        data[k]["wtype"],
+			"label":        data[k]["typea"],
+			"type_ai":      data[k]["type_ai"],
+			"type_weight":  data[k]["type_weight"],
+			"name":         data[k]["name"],
+			"createtime":   time.Now().Format("2006-01-02:15:04:05"),
 		}
+		MgoN.Save(GF.MongoN.Coll, insert)
+
 		err := xlsx.SetSheetRow(sheet, fmt.Sprintf("%s%d", "A", line), &val)
 		if err != nil {
 			log.Debug("set sheetrow line err", zap.Any(fmt.Sprintf("%s%d", "A", line), err))
@@ -380,6 +464,30 @@ func exportFiles() {
 	fmt.Println("数据导出结束")
 }
 
+// readZK 读取重客类型
+func readZK() {
+	f, err := excelize.OpenFile("重客类型.xlsx")
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	defer func() {
+		if err := f.Close(); err != nil {
+			fmt.Println(err)
+		}
+	}()
+
+	rows, err := f.GetRows("Sheet1")
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	//
+	for i := 1; i < len(rows); i++ {
+		zkMap[rows[i][1]] = rows[i][2]
+	}
+}
+
 // contains	contains
 func contains(data string, specials []string) bool {
 	for _, v := range specials {
@@ -390,6 +498,7 @@ func contains(data string, specials []string) bool {
 	return false
 }
 
+// ParseDateString s时间字符串转时间戳
 func ParseDateString(dateString string) (int64, error) {
 	// Regular expressions for different date formats
 	regexPatterns := []string{

+ 135 - 0
yuqing/utils.go

@@ -1,8 +1,19 @@
 package main
 
 import (
+	"context"
+	"encoding/json"
+	"fmt"
 	"github.com/PuerkitoBio/goquery"
+	zhipu "github.com/itcwc/go-zhipu/model_api"
+	"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
+	"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
+	"github.com/volcengine/volcengine-go-sdk/volcengine"
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"log"
+	"regexp"
 	"strings"
+	"time"
 )
 
 func HtmlToText(content string) string {
@@ -14,3 +25,127 @@ func HtmlToText(content string) string {
 	//log.Println(doc2.Html())
 	return doc2.Text()
 }
+
+// getLastMonthFirstDayTimestamp 获取上月 1 号的时间戳
+func getLastMonthFirstDayTimestamp() int64 {
+	now := time.Now()
+	// 获取上月
+	lastMonth := now.AddDate(0, -1, 0)
+	// 设置为上月 1 号的 0 点 0 分 0 秒
+	firstDayOfLastMonth := time.Date(lastMonth.Year(), lastMonth.Month(), 1, 0, 0, 0, 0, lastMonth.Location())
+	// 返回时间戳
+	return firstDayOfLastMonth.Unix()
+}
+
+// isOutData 判断数据是否符合排除规则
+func isOutData(tmp map[string]interface{}) (bool, int) {
+	title := util.ObjToString(tmp["title"])
+	detail := util.ObjToString(tmp["detail"])
+
+	if GF.Env.TitleOut != "" {
+		titleOutReg := regexp.MustCompile(GF.Env.TitleOut)
+		titleOutMatchs := titleOutReg.FindAllString(title, -1)
+		//标题排除词
+		if len(titleOutMatchs) > 0 {
+			return true, 0
+		}
+	}
+
+	if GF.Env.DetailOut != "" {
+		//内容排除词
+		detailOutReg := regexp.MustCompile(GF.Env.DetailOut)
+		detailOutMatchs := detailOutReg.FindAllString(detail, -1)
+		if len(detailOutMatchs) > 0 {
+			return true, 0
+		}
+	}
+
+	titleMatchReg := regexp.MustCompile(GF.Env.TitleMatch)
+	titleMatchs := titleMatchReg.FindAllString(title, -1)
+	if len(titleMatchs) > 0 {
+		return false, 1
+	} else {
+		return false, 3
+	}
+}
+
+// ZpRelated 调用智普,获取相关度和权重
+func ZpRelated(apiKey, model, title, content string) (rest map[string]interface{}) {
+	expireAtTime := int64(1719803252) // token 过期时间
+	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"
+
+	text := fmt.Sprintf(sys, title, content)
+	//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)
+
+	mssage := zhipu.PostParams{
+		Model: model,
+		Messages: []zhipu.Message{
+			{
+				Role:    "user", // 消息的角色信息 详见文档
+				Content: text,
+			},
+		},
+	}
+
+	postResponse, err := zhipu.BeCommonModel(expireAtTime, mssage, apiKey)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	if choices, ok := postResponse["choices"].([]interface{}); ok {
+		if choice, ok2 := choices[0].(map[string]interface{}); ok2 {
+			if message, ok3 := choice["message"].(map[string]interface{}); ok3 {
+				if content, ok4 := message["content"].(string); ok4 {
+					content = strings.ReplaceAll(content, "\n", "")
+					content = strings.ReplaceAll(content, "json", "")
+					content = strings.ReplaceAll(content, "`", "")
+					err = json.Unmarshal([]byte(content), &rest)
+					if err != nil {
+						log.Println("Unmarshal err", err, "content:", content)
+					}
+				}
+			}
+		}
+	}
+	return
+}
+
+// CozeChat coze 扣子模型
+func CozeChat(title, content string) (rest map[string]interface{}) {
+	client := arkruntime.NewClientWithApiKey("f9fd581f-8bea-488a-86b1-49c7d46176b5")
+	ctx := context.Background()
+
+	fmt.Println("----- standard request -----")
+	req := model.ChatCompletionRequest{
+		Model: "ep-20240726175416-5x8pq",
+		Messages: []*model.ChatCompletionMessage{
+			{
+				Role: model.ChatMessageRoleSystem,
+				Content: &model.ChatCompletionMessageContent{
+					//StringValue: volcengine.String("你是一家打印机供应商,请根据我给你提供的线索评测是否有购入打印机的需求,并给出权重。\n通常需要新购打印机的场景有:\n1、医院、学校、事业单位的办公楼新建、扩建、搬迁\n2、新公司成立、公司变更地址\n我的正文如下:"),
+					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对应的值填写;不要给我返回多个主体单位,我只要一个 `),
+				},
+			},
+			{
+				Role: model.ChatMessageRoleUser,
+				Content: &model.ChatCompletionMessageContent{
+					StringValue: volcengine.String(fmt.Sprintf("我的标题是: %s。我的内容是:%s", title, content)),
+				},
+			},
+		},
+	}
+
+	resp, err := client.CreateChatCompletion(ctx, req)
+	if err != nil {
+		fmt.Printf("standard chat error: %v\n", err)
+		return
+	}
+	//fmt.Println(*resp.Choices[0].Message.Content.StringValue)
+	err = json.Unmarshal([]byte(*resp.Choices[0].Message.Content.StringValue), &rest)
+	if err != nil {
+		log.Println("Unmarshal err", err, "content:", content)
+	}
+
+	return
+}

+ 46 - 0
yuqing/y_test.go

@@ -2,6 +2,8 @@ package main
 
 import (
 	"fmt"
+	"log"
+	"regexp"
 	"testing"
 )
 
@@ -15,3 +17,47 @@ func TestHtmlToText(t *testing.T) {
 
 	fmt.Println(HtmlToText(content))
 }
+
+func TestTag(T *testing.T) {
+
+	title := "【短期融资券新发公告】23中兴通讯SCP098今日发布发行公告"
+	titleOutRegStr := "(融资.+公aa告|中兴)"
+	titleOutReg := regexp.MustCompile(titleOutRegStr)
+	titleOutMatchs := titleOutReg.FindAllString(title, -1)
+	fmt.Println("aaa", titleOutMatchs)
+
+	datetime, _ := ParseDateString("Tue")
+	log.Println("22222", datetime)
+	log.Println("33333", getLastMonthFirstDayTimestamp())
+
+}
+
+func TestZpRelated(t *testing.T) {
+	key := "4d5206b1b297c1e7b77f9578edcb2cf7.TNU2i8G1oUNdR02i"
+	content := `
+"访问验证
+别离开,为了更好的访问体验,请滑动滑块进行验证,通过后即可继续访问网页"
+
+`
+	title := "滑动验证页面"
+
+	model := "glm-4-flash"
+	ra := ZpRelated(key, model, title, content)
+	fmt.Println(ra)
+
+}
+
+func TestCozeChat(t *testing.T) {
+	content := `
+"访问验证
+别离开,为了更好的访问体验,请滑动滑块进行验证,通过后即可继续访问网页"
+
+`
+	title := "滑动验证页面"
+
+	res := CozeChat(title, content)
+	fmt.Println(res)
+
+	s := "11-22-2"
+	log.Println(ParseDateString(s))
+}

BIN
yuqing/重客类型.xlsx


Деякі файли не було показано, через те що забагато файлів було змінено