package main import ( "log" "regexp" ) // quoteClassifier 报价模式分类器 type QuoteClassifier struct { unitPriceWords []string //单价/日历天报价模式 rateWords []string // 费率报价模式 floatingRateWords []string // 上浮下浮率报价模式 lumpSumWords []string // 整标报价模式 unitPricePattern []*regexp.Regexp // 单价正则模式 ratePattern []*regexp.Regexp // 费率正则模式 floatingRatePattern []*regexp.Regexp // 上浮下浮率正则模式 lumpSumPattern []*regexp.Regexp // 整标报价正则模式 } // NewQuoteClassifier 初始化分类器(工厂方法) func NewQuoteClassifier() *QuoteClassifier { log.Println("QuoteClassifier") return &QuoteClassifier{ //1、 核心关键词列表(可根据需要扩展) //2、 预编译正则表达式(匹配各种报价形式) //①单价正则模式 unitPricePattern: []*regexp.Regexp{}, //②费率正则模式 ratePattern: []*regexp.Regexp{}, //③上浮下浮率正则模式 floatingRatePattern: []*regexp.Regexp{ regexp.MustCompile(`([上下](浮|浮率|浮动)[::\s]?.{0,30}百分之)`), regexp.MustCompile(`([上下](浮|浮率|浮动)[::\s]?([\d.]+%))`), }, //④整标报价正则模式 lumpSumPattern: []*regexp.Regexp{}, } } // QuoteMode 主判断方法,返回报价模式及判断依据 func (c *QuoteClassifier) QuoteMode(doc BidDocument) (int, map[string]interface{}) { result := make(map[string]interface{}) quoteType := 0 for _, reg := range c.floatingRatePattern { if reg.MatchString(doc.Content) { quoteType = 2 } } return quoteType, result }