Jelajahi Sumber

文件提交

zhengkun 1 tahun lalu
induk
melakukan
987d4bb301

+ 4 - 0
src/jy/extract/extract.go

@@ -248,6 +248,10 @@ func (e *ExtractTask) PreInfo(doc map[string]interface{}) (j, jf *ju.Job, isSite
 	//		detail = d1
 	//	}
 	//}
+	//针对性网站...采用源码
+	if qu.ObjToString(doc["site"]) == "中国电子科技集团有限公司电子采购平台" {
+		detail = CleanDetailText(qu.ObjToString(doc["contenthtml"]), summary)
+	}
 	//调整采用detail抽取
 	if utf8.RuneCountInString(detail) >= 100000 {
 		detail = detail[:100000]

+ 10 - 0
src/jy/extract/extractcity_clean.go

@@ -188,6 +188,16 @@ func (e *ExtractTask) StandardCheckCity(area string, city string, district strin
 					break
 				}
 			}
+			if len(districtArr) == 1 && !isTrue {
+				for _, v := range districtArr {
+					if city != v.C_Name && area == v.P_Name { //修正...
+						rdata["area"] = v.P_Name
+						rdata["city"] = v.C_Name
+						rdata["district"] = v.D_Name
+						return rdata
+					}
+				}
+			}
 			if isTrue { //完全匹配
 				return rdata
 			} else { //未完全匹配-错误地域的时候问题?清河区

+ 2 - 0
src/jy/extract/extractsave.go

@@ -402,9 +402,11 @@ func AnalysisSaveResult(j, jf *ju.Job, e *ExtractTask) {
 		if jf != nil {
 			jf_text = jf.ContentClean
 		}
+		//各种特殊实体识别等
 		e.inscribeRecognize(&tmp, *j.Data, jf_text)
 		//根据正文获取资质要求
 		e.getQualifications(&tmp, *j.Data)
+
 		//城市抽取
 		if e.IsExtractCity {
 			e.ExtractRegionInfo(j, jf, &tmp, true)

+ 29 - 2
src/jy/extract/extraxtmethod.go

@@ -134,6 +134,9 @@ var entdfa_filtration = regexp.MustCompile("(开标记录)")
 // 周期有效
 var isNeedValueReg = regexp.MustCompile(`([0-9俩两一二三四五六七八九年月日天周]|合同)`)
 
+// 来源识别
+var source_entity = regexp.MustCompile("^(来源[::])(.{4,25}(公司|集团|委员会|机构|企业|设计|厂|场|院|所|店|中心|局|站|城|处|行|部|队|联合[会|体]|总站|管委会|联合会|联合体|医院|卫计委|机关|社区|中心站|中心校|分校|办公室|学校|幼儿园|动物园|管理站|馆|基地|青年宫|少年宫|艺术宫|电视台|协会|政府|[初高]中|银行|[大中小]学|段|社|室|厅|监狱|监测站|血站|检查站|工作站|供应站|分行|文明办)|.{2}([大小中学][学院]|公司|某部|学社|大队|党校|某(部|中心|单位)|(联通|移动|电信))|某部|某单位)")
+
 // 清洗正文
 func CleanDetailText(detail string, summary string) string {
 	detail = regexp.MustCompile(`<!--[\w\W]*?-->`).ReplaceAllString(detail, "")
@@ -181,12 +184,15 @@ func file2text(doc *map[string]interface{}) {
 						if clearStrReg.MatchString(ffname) {
 							continue
 						}
-						//根据类型过滤不同附件
 						/*
 							{0: '承诺书', 1: '委托书', 2: '文件格式', 3: '中标公告', 4: '招标公告', 5: '招标文件', 6: '更正公告', 7: '合同', 8: '评审',
 							 9: '工程量清单', 10: '验收', 11: '报价', 12: '中小企业声明', 13: '采购内容', 14: '审批', 15: '其他', 16: '其他公告'}
 						*/
-
+						if cls := qu.ObjToString(ff["cls"]); cls != "" {
+							if cls == "文件格式" || cls == "工程量清单" || cls == "中小企业声明" {
+								continue
+							}
+						}
 						mname[ffname] = true
 						murl[ffname] = attach_url
 						if sortStrReg.MatchString(ffname) {
@@ -336,6 +342,14 @@ func (e *ExtractTask) inscribeRecognize(tmp *map[string]interface{}, j_data map[
 	} else {
 		delete((*tmp), "ext_publishtime")
 	}
+
+	//特殊站点-识别采购单位
+	if qu.ObjToString((*tmp)["buyer"]) == "" && qu.ObjToString((*tmp)["site"]) == "中国电子科技集团有限公司电子采购平台" {
+		if new_buyer := SourceEntText(qu.ObjToString(j_data["detail"])); new_buyer != "" {
+			(*tmp)["buyer"] = new_buyer
+			(*tmp)["inscribe_buyer"] = "特殊来源识别"
+		}
+	}
 }
 
 // 识别实体
@@ -436,6 +450,19 @@ func EmployEntDfaText(text string, winner string, agency string) string {
 	return new_str
 }
 
+// 来源识别
+func SourceEntText(text string) string {
+	new_str := ""
+	if text == "" {
+		return new_str
+	}
+	new_str = source_entity.FindString(text)
+	if new_str != "" {
+		new_str = source_entity.ReplaceAllString(new_str, "${2}")
+	}
+	return new_str
+}
+
 // 识别发布时间
 func InscribePublishtime(j_data map[string]interface{}) int64 {
 	//落款文本识别

+ 4 - 0
src/jy/pretreated/analymethod.go

@@ -336,6 +336,10 @@ func AnalyStart(job *u.Job, isSite bool, codeSite string) {
 
 	//特殊结构转换
 	con = formattext30.ReplaceAllString(con, "${1}")
+	//可扩展..暂无必要..支持数据太少..无需增加表维护
+	if strings.Contains(job.Title, "项目监理") {
+
+	}
 
 	//指定爬虫-特殊结构-计算抽取
 	if codeSite == "a_zgzfcgw_zfcghtgg_new" {

+ 1 - 0
src/jy/pretreated/analystep.go

@@ -48,6 +48,7 @@ var formattext14 = regexp.MustCompile("包号\n项目名称\n中标单位名称\
 
 // 部分文本转换格式
 var formattext30 = regexp.MustCompile("[\\s  ]+([((]万元[))])")
+var formattext31 = regexp.MustCompile("总预算约(.*)[,,]监理费约(.*)")
 
 // 业绩相关~分割
 var formattext20 = regexp.MustCompile("(工程业绩|投标文件中填报的单位项目业绩名称)[::][\n]?1[、.].*\n2[、.].*\n(3[、.].*\n)?")

+ 13 - 4
src/jy/pretreated/winnerorder.go

@@ -86,6 +86,7 @@ var (
 
 	//格式化中标金额换行
 	winnerReg100 = regexp.MustCompile("中标金额:[\\s]+([0-9\\.万元]+)")
+	winnerReg101 = regexp.MustCompile("(含税总价)([\\d]+)")
 
 	//清洗影响候选人-抽取的文本
 	cleanWinnerReg1 = regexp.MustCompile("第[一二三123]中标候选人项目业绩[::]")
@@ -112,10 +113,12 @@ var (
 	findCandidate3 = regexp.MustCompile("(^.{4,}(公司|集团|[大中小]学|单位|机构|企业|设计|厂|场|院|所|店|中心|局|站|城|处|行|部|队|联合[会体]((成员|牵头人)[))]?)?|工作室|有限司)([((]第一中标候选人[))])$)")
 	clearSpace1    = regexp.MustCompile("([((][\\d一二三四五六七八九十][))][\\s\u3000\u2003\u00a0\\t]*|<[^>].+?>)")
 	clearSpace2    = regexp.MustCompile("</?[^>]+>")
-	offerReg       = regexp.MustCompile("(中标|磋商|投标|报\\n|报|单|成交)总?(价|金额)")
+	offerReg       = regexp.MustCompile("(中标|磋商|含税|投标|报\\n|报|单|成交)总?(价|金额)")
 	nofferReg      = regexp.MustCompile("(费率|折扣率)")
-	nobidValReg    = regexp.MustCompile("^(\\d{2}%|[0-9]+\\.[0-9]+%)$")
-	noKeyValReg    = regexp.MustCompile("(采购项目信息|担保机构)")
+	nobidValReg1   = regexp.MustCompile("^(\\d{2}%|[0-9]+\\.[0-9]+%)$")
+	nobidValReg2   = regexp.MustCompile("^(折扣[::]?0\\.[\\d]+)$")
+
+	noKeyValReg = regexp.MustCompile("(采购项目信息|担保机构)")
 	//特殊 - 不分割
 	winnerNoSplitReg = regexp.MustCompile("^(第[一二三四五六七八九十]中[选|标]?候选人)[::]([\u4E00-\u9FA5]{4,20}([((]集团[))])?(有限公司|公司))[,,]([\u4E00-\u9FA5]{4,20}([((]集团[))])?(有限公司|公司))$")
 )
@@ -178,6 +181,8 @@ func (wo *WinnerOrderEntity) Find(text string, flag bool, from int, isSite bool,
 
 	//中标金额格式化
 	text = winnerReg100.ReplaceAllString(text, "中标金额:${1}")
+	text = winnerReg101.ReplaceAllString(text, "${1}:${2}")
+
 	//特殊格式
 	text = winnerReg14_1.ReplaceAllString(text, "\n中标候选人${1}名:${2}\n中标金额:${3}\n")
 
@@ -397,10 +402,14 @@ func (wo *WinnerOrderEntity) findByReg(content string, blocks []string, reg_2 *r
 						findOfferFlag = true
 					}
 				}
+				//异常不合理值过滤
+				if nobidValReg2.MatchString(qutil.ObjToString(v)) {
+					continue
+				}
 				//找到了中标金额
 				if findOfferFlag && object["entname"] != nil {
 					val := wo.clear("中标金额", v+GetMoneyUnit(k, v))
-					if val != nil && !nobidValReg.MatchString(qutil.ObjToString(val)) {
+					if val != nil && !nobidValReg1.MatchString(qutil.ObjToString(val)) {
 						moneys := clear.ObjToMoney([]interface{}{val, ""})
 						if len(moneys) > 0 {
 							if vf, ok := moneys[0].(float64); ok && moneys[len(moneys)-1].(bool) {

+ 1 - 0
udpcontrol/src/updprocess.go

@@ -145,6 +145,7 @@ func sendRunExtractNode(splitArr []map[string]interface{}) {
 			IP:   net.ParseIP(node["addr"].(string)),
 			Port: qu.IntAll(node["port"]),
 		})
+
 	}
 	isAction = true
 	log.Debug("通知抽取udp...等待抽取...回应...")