Ver Fonte

抽取备份

zhengkun há 2 anos atrás
pai
commit
e7a6f11c24

+ 7 - 1
extcity/src/main.go

@@ -26,7 +26,13 @@ func main() {
 	service.InitRegionsService()
 	log.Debug("开始监听~", ul.Port)
 	http.ListenAndServe(ul.Port, nil)
-	time.Sleep(99999 * time.Hour)
+
+	lock := make(chan bool)
+	<-lock
+	/*
+		extcity.spdata.jianyu360.com
+		172.17.4.238:9996
+	*/
 }
 
 func test() {

+ 1 - 1
extcity/src/mark

@@ -1,5 +1,5 @@
 {
-   "port": ":9991",
+   "port": ":9996",
    "ext_mgodb": {
      "addr": "172.17.145.163:27083,172.17.4.187:27082",
      "db": "mixdata",

+ 1 - 1
extcity/src/res/config.json

@@ -1,5 +1,5 @@
 {
-   "port": ":9991",
+   "port": ":9996",
    "ext_mgodb": {
      "addr": "127.0.0.1:27017",
      "db": "extract_service",

+ 18 - 11
src/jy/extract/extract.go

@@ -179,7 +179,6 @@ func RunExtractTestTask(ext *ExtractTask, startId, num string) bool {
 	} else {
 		return false
 	}
-
 }
 
 //启动抽取
@@ -367,15 +366,15 @@ func (e *ExtractTask) PreInfo(doc map[string]interface{}) (j, jf *ju.Job, isSite
 	if qu.ObjToString(doc["type"]) == "bid" {
 		toptype = "结果"
 	}
-	if toptype == "" || toptype == "采购意向" {
-		toptype = "all"
-	}
-	if subtype == "" || subtype == "采购意向" {
-		subtype = "all"
-	}
 	if subtype == "其他" {
 		subtype = "其它"
 	}
+	if toptype == "" || subtype == "" {
+		toptype, subtype = "all", "all"
+	}
+	if toptype == "采购意向" || subtype == "采购意向" {
+		toptype, subtype = "招标", "招标" //暂时按照"招标"
+	}
 	toMap := qu.ObjToMap(doc["jsondata"])
 	//log.Debug("toMap", toMap)
 	if (*toMap) != nil {
@@ -507,18 +506,25 @@ func file2text(doc *map[string]interface{}) {
 			return
 		}
 		bs := ju.OssGetObject(murl[k])
-		if utf8.RuneCountInString(bs) < qu.IntAllDef(ju.Config["filelength"], 150000) {
+		if utf8.RuneCountInString(bs) <= qu.IntAllDef(ju.Config["filelength"], 150000) {
 			tmpstr += bs + "\n"
+		} else {
+			tmpstr += bs[:qu.IntAllDef(ju.Config["filelength"], 150000)] + "\n"
 		}
 	}
 	for k := range mname {
+		if mnameone[k] {
+			continue
+		}
 		if utf8.RuneCountInString(tmpstr) > qu.IntAllDef(ju.Config["filelength"], 150000) {
 			(*doc)["detailfile"] = tmpstr
 			return
 		}
 		bs := ju.OssGetObject(murl[k])
-		if utf8.RuneCountInString(bs) < qu.IntAllDef(ju.Config["filelength"], 150000) {
+		if utf8.RuneCountInString(bs) <= qu.IntAllDef(ju.Config["filelength"], 150000) {
 			tmpstr += bs + "\n"
+		} else {
+			tmpstr += bs[:qu.IntAllDef(ju.Config["filelength"], 150000)] + "\n"
 		}
 	}
 	(*doc)["detailfile"] = strings.ReplaceAll(tmpstr, "附件", "")
@@ -699,7 +705,7 @@ func (e *ExtractTask) ExtractDetail(j *ju.Job, isSite bool, codeSite string) {
 				if !ju.Logic(vc.LuaLogic, tmp) {
 					continue
 				}
-				if vc.Field == "winner" {
+				if vc.Field == "bidamount" {
 					//log.Debug("调试抽取字段")
 				}
 				//抽取-前置规则
@@ -1685,7 +1691,8 @@ func ExtRegBack(j *ju.Job, in *RegLuaInfo, t *TaskInfo, vc *RuleCore) {
 						if (strings.Contains(qu.ObjToString(v.SourceValue), "费率") ||
 							strings.Contains(qu.ObjToString(v.SourceValue), "税率") ||
 							strings.Contains(qu.ObjToString(v.SourceValue), "(%)")) &&
-							!strings.Contains(qu.ObjToString(v.SourceValue), "工程设计费") {
+							!strings.Contains(qu.ObjToString(v.SourceValue), "工程设计费") &&
+							!strings.Contains(qu.ObjToString(v.SourceValue), "含税总价") {
 							j.Result[in.Field][k].IsTrue = false
 							continue
 						}

+ 10 - 10
src/jy/extract/extractInit.go

@@ -1012,12 +1012,12 @@ func InitSite() []map[string]interface{} {
 	defer qu.Catch()
 	query := map[string]interface{}{}
 	list, _ := ju.Site_Mgo.Find("site", query, nil, map[string]interface{}{
-		"site":      1,
-		"area":      1,
-		"city":      1,
-		"district":  1,
-		"site_type": 1,
-		"qy_area":   1,
+		"site":       1,
+		"f_area":     1,
+		"f_city":     1,
+		"f_district": 1,
+		"site_type":  1,
+		"area":       1,
 	})
 	return list
 	//list, _ := db.Mgo.Find("site", query, nil, `{"site":1,"area":1,"city":1,"district":1}`, false, -1, -1)
@@ -1100,11 +1100,11 @@ func (e *ExtractTask) InitUpdateSite() {
 	for _, v := range InitSite() {
 		site := qu.ObjToString(v["site"])
 		s := &SiteCity{
-			P: qu.ObjToString(v["area"]),
-			C: qu.ObjToString(v["city"]),
-			D: qu.ObjToString(v["district"]),
+			P: qu.ObjToString(v["f_area"]),
+			C: qu.ObjToString(v["f_city"]),
+			D: qu.ObjToString(v["f_district"]),
 			T: qu.ObjToString(v["site_type"]),
-			Q: qu.ObjToString(v["qy_area"]),
+			Q: qu.ObjToString(v["area"]),
 		}
 		e.SiteCityMap[site] = s
 	}

+ 51 - 15
src/jy/pretreated/analystep.go

@@ -23,8 +23,8 @@ var unblTextReg *regexp.Regexp = regexp.MustCompile("(项目业绩案例|类似
 var beforeTextReg *regexp.Regexp = regexp.MustCompile("(招标代理机构|招标单位|招标人)[::].{4,25}\n")
 
 var preConReg1 = regexp.MustCompile("(第[一二三1-3]中标候选人)\n(业绩奖项)")
-var hisReg = regexp.MustCompile("(开标记录|开标记录及投标报价|类似业绩|历史业绩|填报项目业绩|[得评]+[审打]{0,2}分情况|无效标)[::\n]*.*?[\n]?(</td>)")
-var hisReg2 = regexp.MustCompile("(开标记录|[得评]+[审打]{0,2}分情况|无效标)[::\n]*.*?[\n]?(.*原因及其依据.*[::]?)?[\n]?.*?[\n]?(</tr>|</table>|</td>)")
+var hisReg = regexp.MustCompile("([\u4E00-\u9FA5].{0,10})?(开标记录|开标记录及投标报价|类似业绩|历史业绩|填报项目业绩|[得评]+[审打]{0,2}分情况|无效标)[::\n]*(.*)?[\n]?(</td>)")
+var hisReg2 = regexp.MustCompile("([\u4E00-\u9FA5].{0,10})?(开标记录|业绩|[得评]+[审打]{0,2}分情况|无效标)[::\n]*(.*)?[\n]?(.*原因及其依据.*[::]?)?[\n]?(.*)?[\n]?(</tr>|</table>|</td>)")
 
 var formattext = regexp.MustCompile("(投标总价)([0-9,.万元]*)")
 var formattext2 = regexp.MustCompile("中标单价.*(中标总价.*)")
@@ -36,12 +36,13 @@ var formattext4 = regexp.MustCompile("(中标金额[::])设计费用[::][0-9
 //特殊影响分包候选人抽取
 var formattext5 = regexp.MustCompile("投标报价[::]包件1[::][0-9.万元]+[,,]包件2[::][0-9.万元]+[,,]投标总价([::]+)([0-9.万元]+)")
 var formattext6 = regexp.MustCompile("(投标报价[::][0-9.]+)\n([万元]+)")
-
 var formattext10 = regexp.MustCompile(".*包号\n.*\n.*供应商名称\n.*\n.*(成交|中标)金额\n(.*单位\n)?" +
 	"<td.*>(.*)\n(<td>\n)?.*\n<td.*>[\n]?(.*公司)\n.*\n<td.*>([0-9.,,万元]+)\n")
 var formattext11 = regexp.MustCompile("(项目预算)\n(第[一1](包|标段)[::])([0-9.万元人民币]+)\n" +
 	"(第[二2](包|标段)[::])([0-9.万元人民币]+)\n")
 var formattext12 = regexp.MustCompile("((成交|中标)价格|本期预算)\n[((]万元[))]\n([0-9.万元人民币]+)\n")
+var formattext13 = regexp.MustCompile("中选单位名称[::]标的一[::](.{4,25}公司)[;;]标的二[::](.{4,25}公司)\n中选金额[::]标的一[::]([0-9\\.人民币万元]+)[;;]标的二[::]([0-9\\.人民币万元]+)")
+var formattext14 = regexp.MustCompile("包号\n项目名称\n中标单位名称\n中标金额[((]元[))]\n1\n.*\n(.{4,25}公司)\n([0-9\\.]+)\n2\n.*\n(.{4,25}公司)\n([0-9\\.]+)")
 
 //业绩相关~分割
 var formattext20 = regexp.MustCompile("(工程业绩|投标文件中填报的单位项目业绩名称)[::][\n]?1[、.].*\n2[、.].*\n(3[、.].*\n)?")
@@ -53,19 +54,16 @@ var formattext50 = regexp.MustCompile("主要标的数量[::]([0-9.]+)\n主要
 //特殊文本提取有效
 var formattext100 = regexp.MustCompile("项目编号.*\n项目名称.*\n招标单位.*\n招标代理.*\n中标单位.*\n项目编号.*\n总价[((]万元[))]([0-9.]+)")
 
-/*
-	项目编号JG2020-4278-003
-	项目名称株洲站改扩建工程(第五批)建管甲供物资(通信、信息专业)招标(ZZXX-02包件 安检仪等 WZ-2020-56)
-	招标单位中国铁路广州局集团有限公司长沙工程建设指挥部
-	招标代理中铁物总国际招标有限公司
-	中标单位广州同视电子设备有限公司
-	项目编号JG2020-4278-003
-	总价(万元)249.2
-*/
-
 //特别处理-表格数据
 var tablePackageWinnerReg = regexp.MustCompile("[\n]?(成交侯选人|第一中标候选人)[::](.{4,15}(公司|厂))")
 
+//多供应商文本类
+var MultiStartReg = regexp.MustCompile("([二三四][、]中标[((]成交[))]信息)\n")
+var MultiEndReg = regexp.MustCompile("([三四五][、]主要标的信息)")
+
+var SupplyInfoReg1 = regexp.MustCompile("([1-9])[::]供应商名称[\\s  ]+(.{4,25}(公司|研究院|研究所)).*中标[((]成交[))]金额[\\s  ]+([0-9\\.万元]+)[;;]")
+var SupplyInfoReg2 = regexp.MustCompile("()供应商名称[::](.{4,25}(公司|研究院|研究所))\n供应商地址.*\n中标[((]成交[))]金额[::]([0-9\\.]+[((]?[万元]+[))]?)")
+
 //特殊-爬虫文本-抽取单价数量-并计算
 func dealWithSpecStructToSpiderCode(text string) string {
 	text = formattext50.ReplaceAllString(text, "$1&&$2")
@@ -122,6 +120,37 @@ func thanWinnerOrderEffective(old_order []map[string]interface{}, new_order []ma
 	return true
 }
 
+//多供应商文本构建分包
+func dealWithMultiSuppliersText(con string) (bool, string) {
+	startIndex := MultiStartReg.FindAllStringIndex(con, 1)
+	endIndex := MultiEndReg.FindAllStringIndex(con, 1)
+	if len(startIndex) == 1 && len(endIndex) == 1 {
+		if len(startIndex[0]) > 1 && len(endIndex[0]) > 1 {
+			text := con[startIndex[0][1]:endIndex[0][0]]
+			arr1 := SupplyInfoReg1.FindAllStringSubmatch(text, -1)
+			if text1 := supplyInfoMethod(arr1, 2, 4); text1 != "" {
+				return true, strings.ReplaceAll(con, text, text1)
+			}
+			arr2 := SupplyInfoReg2.FindAllStringSubmatch(text, -1)
+			if text2 := supplyInfoMethod(arr2, 2, 4); text2 != "" {
+				return true, strings.ReplaceAll(con, text, text2)
+			}
+		}
+	}
+	return false, ""
+}
+
+func supplyInfoMethod(arr [][]string, w_index int, b_index int) string {
+	new_text := ""
+	if len(arr) > 1 {
+		for k, v := range arr {
+			key := fmt.Sprintf("包%d", k+1)
+			new_text += key + "\n中标单位:" + v[w_index] + "\n中标金额:" + v[b_index] + "\n"
+		}
+	}
+	return new_text
+}
+
 //分析方法
 func AnalyStart(job *util.Job, isSite bool, codeSite string) {
 	con := job.Content
@@ -129,8 +158,8 @@ func AnalyStart(job *util.Job, isSite bool, codeSite string) {
 	con = RepairCon(con)
 	//格式化正文
 	//con = preConReg1.ReplaceAllString(con, "${1}${2}")
-	con = hisReg.ReplaceAllString(con, "${2}")
-	con = hisReg2.ReplaceAllString(con, "${4}")
+	con = hisReg.ReplaceAllString(con, "${4}")
+	con = hisReg2.ReplaceAllString(con, "${6}")
 
 	con = formattext.ReplaceAllString(con, "${1}:${2}")
 	con = formattext2.ReplaceAllString(con, "${1}")
@@ -143,6 +172,13 @@ func AnalyStart(job *util.Job, isSite bool, codeSite string) {
 	con = formattext10.ReplaceAllString(con, "\n分包$3\n中标单位:$5 中标金额:$6\n")
 	con = formattext11.ReplaceAllString(con, "${1}\n${2}\n预算金额:${4}\n${5}\n预算金额:${7}\n${8}\n")
 	con = formattext12.ReplaceAllString(con, "\n${1}:${3}万元\n")
+	con = formattext13.ReplaceAllString(con, "\n包一\n中标单位:${1}\n中标金额:${3}\n"+"包二\n中标单位:${2}\n中标金额:${4}\n")
+	con = formattext14.ReplaceAllString(con, "\n包一\n中标单位:${1}\n中标金额:${2}\n"+"包二\n中标单位:${3}\n中标金额:${4}\n")
+
+	//多供应商~文本结构~重构
+	if m_b, m_c := dealWithMultiSuppliersText(con); m_b {
+		con = m_c
+	}
 
 	//工程业绩描述影响抽取
 	con = formattext20.ReplaceAllString(con, "\n")

+ 5 - 5
src/jy/pretreated/division.go

@@ -292,6 +292,7 @@ func DivideBlock(tp, content string, from int, ruleBlock *util.RuleBlock, isSite
 		title = filterTitle(title)
 		//分割标题 [和及]。。。 参与
 		splitTitles := ProcTitle(title)
+		//此方法有缺陷~~~
 		blockText = mergetext(splitTitles, blockText)
 
 		block := &util.Block{
@@ -352,7 +353,6 @@ func DivideBlock(tp, content string, from int, ruleBlock *util.RuleBlock, isSite
 	for _, bl := range returnBlocks {
 		//解析kv
 		newText := TextAfterRemoveTable(bl.Text) //取出纯文本
-
 		bl.ColonKV = GetKVAll(newText, bl.Title, contactFormat, from, isSite, codeSite)
 		bl.SpaceKV = SspacekvEntity.Entrance(newText, bl.Title, contactFormat, isSite, codeSite)
 		//正则抽取的时候有时需要匹配换行或者句号,这里在解析完kv之后,在块结尾添加换行和句号
@@ -379,9 +379,10 @@ func mergetext(titles []string, text string) string {
 				tt += titles[i] + ":" + lentexts[1] + "\n"
 			} else if strings.Contains(strings.ReplaceAll(titles[i], "联系地址", "地址"), strings.ReplaceAll(lentexts[0], "联系地址", "地址")) {
 				tt += titles[i] + ":" + lentexts[1] + "\n"
+			} else {
+
 			}
 		} else {
-			//特殊处理
 			if strings.Contains(v, "中标人 ") {
 				tt += v + "\n"
 			}
@@ -390,7 +391,7 @@ func mergetext(titles []string, text string) string {
 	if len(tt) == 0 {
 		return text
 	} else {
-		return tt
+		return text + "\n" + tt
 	}
 }
 
@@ -649,7 +650,7 @@ func FindPackageFromBlocks(blocks *[]*util.Block, isSite bool, codeSite string)
 		}
 		//var ok bool
 		//var surplusText string
-		//分析分包-金额,中标单位,人电话,包名,中标选人
+		//分析分包-金额,中标单位,人电话,包名,中标选人
 		divisionPackageChild(&blockPackage, text, v.Title, true, v.Tag["中标单位"], isSite, codeSite)
 	}
 	//orderwinner := winnerOrderEntity.Find(content, true, 2, isSite, codeSite)
@@ -804,7 +805,6 @@ func divisionPackageChild(blockPackage *map[string]*util.BlockPackage, content,
 
 	content = packageReg20.ReplaceAllString(content, "\n预算金额:${2}\n")
 	content = packageReg21.ReplaceAllString(content, "\n${2}\n预算金额:${3}\n${4}\n预算金额:${5}")
-	//6、项目预算:1包3689028.00元,2包700000.00元。
 
 	if untitleReg.MatchString(title) {
 		return false, ""

+ 3 - 3
src/jy/util/util2.go

@@ -33,8 +33,8 @@ var (
 	ConvertIntReg_6 = regexp.MustCompile("[0-9]+")
 	ConvertIntReg_7 = regexp.MustCompile("^" + ConvertIntReg_6.String() + "$")
 	//标段号,包号转换
-	FindPkgNumReg   = regexp.MustCompile("(\\d[.])+\\d|([一二三四五六七八九十0-9A-Za-zⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳\\-]+)|(设计|施工|监理|验收)")
-	FindPkgNumReg_1 = regexp.MustCompile("设计|施工|监理|验收")
+	FindPkgNumReg   = regexp.MustCompile("(\\d[.])+\\d|([一二三四五六七八九十0-9A-Za-zⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳\\-]+)|(设计|施工|监理|验收)([0-9]+)?")
+	FindPkgNumReg_1 = regexp.MustCompile("(设计|施工|监理|验收)([0-9]+)?")
 )
 
 func AddtoNoMatchMap(key string) {
@@ -262,4 +262,4 @@ func FirstKeyValueInMap(m interface{}) (string, interface{}) {
 		}
 	}
 	return "", nil
-}
+}

+ 25 - 6
src/main.go

@@ -30,12 +30,11 @@ func init() {
 }
 
 func main() {
-
 	extract.ExtractUdpUpdateMachine() //节点上传~构建
 	extract.ExtractUdp()              //udp通知抽取
 	go Router.Run(":" + qu.ObjToString(u.Config["port"]))
 	go log.Debug("启动..", qu.ObjToString(u.Config["port"]))
-
+	//testMain()
 	go func() {
 		http.ListenAndServe("localhost:10000", nil)
 	}()
@@ -46,8 +45,28 @@ func main() {
 
 //验证规则
 func testMain() {
-	new_detail := `中标单位:北京脱皮公司`
-	var reg = regexp.MustCompile("(中标单位|成交单位|成交人|供应商)[::][\\s \n]?(.{2,25}(公司))")
-	b := reg.MatchString(new_detail)
-	log.Debug(b)
+
+	text := `四、中标情况:
+包号
+项目名称
+中标单位名称
+中标金额(元)
+1
+全自动混凝土抗渗仪采购
+济南森泰机电设备有限公司
+446000.00
+2
+电液伺服万能试验机和电子万能试验机采购
+烟台尤文机电有限公司
+489000.00
+五、采购项目联系方式:
+`
+	if text != "" {
+
+	}
+	var reg1 = regexp.MustCompile("包号\n项目名称\n中标单位名称\n中标金额[((]元[))]\n1\n.*\n(.{4,25}公司)\n([0-9\\.]+)\n2\n.*\n(.{4,25}公司)\n([0-9\\.]+)")
+	aaa := reg1.FindString(text)
+	log.Debug(aaa)
+	text = reg1.ReplaceAllString(text, "\n包一\n中标单位:${1}\n中标金额:${2}\n"+"包二\n中标单位:${3}\n中标金额:${4}\n")
+	log.Debug(text)
 }

+ 1 - 3
src/mark

@@ -122,8 +122,6 @@
     	//u.BuyerDB = qu.IntAll(u.Config["redis_buyer_db"])
     	//u.AgencyDB = qu.IntAll(u.Config["redis_agency_db"])
 
+    	SJZY_Rbid_ProG:SJZY%408Pro3gR79aM@172.17.145.163:27083,172.17.4.187:27082
 
 
-
-
-    	SJZY_Rbid_ProG:SJZY%408Pro3gR79aM@172.17.145.163:27083,172.17.4.187:27082

+ 4 - 4
src/res/fieldscore.json

@@ -189,7 +189,7 @@
         "negativewords": [
             {
                 "describe": "包含负分",
-                "regstr": "(标人|附件|乙方|委托|(答|质|怀)疑|(保|质疑|查询)函|认证|代理|咨询|管理顾问|招标失败|不足|公告|变更|废标|废止|流标|中标|评标|开标|供应商|金额|万元|元整|预算|报价|单价|第(\\d|一|二|三|四|五)(名|包)|排名|候选|确定|标段|(标|一|二|三|四|五)包|中选|成交|包号|(A|B|C|D|E|F|G)包|地址|详情|要求|推荐|名称|评审|得分|合同|平方米|公示期|结果|备注|说明|理由|评委|委托|工作日|营业(执|期)|通过|代码|电话|联系|条件|合理|费率|以上|以下|拟定|注:|\\d[\\s]{0,10}(\\.|元|包|米|平米|平方米|吨|辆|千克|克|毫克|毫升|公升|套|件|瓶|箱|只|台|年|月|日|天|号)|(:|:|;|;|?|¥|\\*|%)|^[a-zA-Z0-9-]{5,100}|^[a-zA-Z0-9-]{1,100}$|[a-zA-Z0-9-]{10,100})",
+                "regstr": "(标人|附件|乙方|委托|(答|质|怀)疑|(保|质疑|查询)函|认证|代理|咨询|管理顾问|招标失败|不足|公告|变更|废标|废止|流标|中标|评标|开标|供应商|金额|万元|元整|预算|报价|单价|第(\\d|一|二|三|四|五)(名|包)|排名|候选|确定|标段|(标|一|二|三|四|五)包|中选|成交|包号|(A|B|C|D|E|F|G)包|地址|详情|要求|推荐|名称|评审|得分|合同|平方米|公示期|结果|备注|说明|理由|评委|委托|工作日|营业(执|期)|通过|代码|电话|联系|条件[^平]|合理|费率|以上|以下|拟定|注:|\\d[\\s]{0,10}(\\.|元|包|米|平米|平方米|吨|辆|千克|克|毫克|毫升|公升|套|件|瓶|箱|只|台|年|月|日|天|号)|(:|:|;|;|?|¥|\\*|%)|^[a-zA-Z0-9-]{5,100}|^[a-zA-Z0-9-]{1,100}$|[a-zA-Z0-9-]{10,100})",
                 "score": -15
             },
             {
@@ -214,7 +214,7 @@
             },
             {
                 "describe": "黑名单",
-                "regstr": "(^.{0,4}$|T及分公司|大厦[0-9]+室|东侧路面拓宽|项目基本情况|项目背景概况|的情况|招标投标交易平台|截止之前|、技术研发中心|钢芯铝绞线|供应商|^(项目概况|谈判人|申请采用|合同|其他|委托|认可的|研究决定|推荐|最终确定|确认|中标|并要求|本项目)|(服务费|有资质公司|项目类别|时间|年月日|管理费用|询价)$)",
+                "regstr": "(^.{0,4}$|T及分公司|大厦[0-9]+室|东侧路面拓宽|项目基本情况|项目背景概况|的情况|招标投标交易平台|截止之前|、技术研发中心|钢芯铝绞线|供应商|^(项目概况|谈判人|申请采用|合同|其他|委托|认可的|研究决定|推荐|最终确定|确认|中标|并要求|本项目)|(服务费|有资质公司|项目类别|时间|年月日|管理费用|询价|监控工程)$)",
                 "score": -50
             }
         ],
@@ -265,12 +265,12 @@
         "negativewords": [
             {
                 "describe": "包含负分",
-                "regstr": "((中标|候选|成交|代表|投标|代理)人|我公司|定标|通知|异议|法院|要求|代理机构|详细|test|意见|原因|具体|结果|负责|付款|附件|候选|招标失败|注册表|交易中心|序号内容|不足|公告|变更|采购|废标|废止|流标|投标|评标|开标|供应商|金额|万元|元整|预算|报价|单价|第(\\d|一|二|三|四|五)(名|包)|排名|候选|确定|标段|(标|一|二|三|四|五)包|中选|成交[^通]|包号|(A|B|C|D|E|F|G)包|地址|详情|要求|推荐|名称|评审|得分|合同|平方米|公示期|结果|备注|说明|单位|代表|委托|工作日|营业(执|期)|通过|代码|电话|联系|条件|合理|费率|以上|以下|拟定|注:|\\d[\\s]{0,10}(\\d|元|包|米|平米|平方米|吨|辆|千克|克|毫克|毫升|公升|套|件|瓶|箱|只|台|年|月|日|天|号)|(:|:|;|;|?|¥|\\*|%)|^[a-zA-Z0-9-]{5,100}|^[a-zA-Z0-9-]{1,100}$|[a-zA-Z0-9-]{10,100}\\n)",
+                "regstr": "((中标|候选|成交|代表|投标|代理)人|我公司|定标|通知|异议|法院|要求|代理机构|详细|test|意见|原因|具体|结果|负责|付款|附件|候选|招标失败|注册表|交易中心|序号内容|不足|公告|变更|采购|废标|废止|流标|投标|评标|开标|供应商|金额|万元|元整|预算|报价|单价|第(\\d|一|二|三|四|五)(名|包)|排名|候选|确定|标段|(标|一|二|三|四|五)包|中选|成交[^通]|包号|(A|B|C|D|E|F|G)包|地址|详情|要求|推荐|名称|评审|得分|合同|平方米|公示期|结果|备注|说明|单位|代表|委托|工作日|营业(执|期)|通过|代码|电话|联系|条件[^平]|合理|费率|以上|以下|拟定|注:|\\d[\\s]{0,10}(\\d|元|包|米|平米|平方米|吨|辆|千克|克|毫克|毫升|公升|套|件|瓶|箱|只|台|年|月|日|天|号)|(:|:|;|;|?|¥|\\*|%)|^[a-zA-Z0-9-]{5,100}|^[a-zA-Z0-9-]{1,100}$|[a-zA-Z0-9-]{10,100}\\n)",
                 "score": -20
             },
 			{
                 "describe": "非结尾",
-                "regstr": ".*[^集团|公司|学校|中心|家具城|门诊|\\[大中小\\]学|部|院|局|厂|店|所|队|社|室|厅|段|会|场|行|处]$",
+                "regstr": ".*[^集团|公司|学校|中心|家具城|门诊|\\[大中小\\]学|部|院|局|厂|店|所|队|社|室|厅|段|会|场|行|处|公寓|联合体]$",
                 "score": -5
             },
             {