123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- package main
- import (
- qu "qfw/util"
- "go.mongodb.org/mongo-driver/bson/primitive"
- "github.com/go-ego/gse"
- )
- //省
- type Province struct {
- Name string
- Brief string
- Cap string
- Captial *City
- }
- //市
- type City struct {
- Name string
- Brief string
- P *Province
- }
- //区或县
- type District struct {
- Name string
- C *City
- }
- //街道
- type Street struct {
- Name string
- D *District
- }
- //村、社区、居委会
- type Community struct {
- Name string
- S *Street
- }
- //区或县简称对应的全称和市信息
- type DistrictSimFull struct {
- SimName string
- FullName string
- C *City
- }
- //打分信息
- type ScoreInfo struct {
- FullAreaScore map[string]float64
- FullCityScore map[string]float64
- FullDistrictScore map[string]float64
- SimAreaScore map[string]float64
- SimCityScore map[string]float64
- SimDistrictScore map[string]float64
- }
- var (
- ProvinceMap map[string]string //省全称简称(key:浙江省 val:浙江)
- ProvinceBriefMap map[string]*Province //省简称对应的省信息(key:浙江 val:&Province{})
- CityMap map[string]string //市全称简称(key:杭州市 val:杭州)
- CityBriefMap map[string]*City //市简称对应的市信息(key:杭州 val:&City{})
- CityFullMap map[string]*City //市全称对应的市信息(key:杭州市 val:&City{})
- DistrictCityMap map[string]*City //
- NewDistrictCityMap map[string][]*City //区或县全称对应的city(全国有相同名称的区或县,这里对应的city用slice)
- DistrictSimAndAll map[string]string //区或县(key:简称 val:全称)
- NewDistrictSimAndAll map[string][]map[string]*City //区或县(key:简称 val: 相同简称的区全称:所在市)
- StreetDistrictMap map[string]*District //街道对应的区或县
- NewStreetDistrictMap map[string][]*District //街道全称对应的区或县
- CommunityDistrictMap map[string][]*District //村、居委会对应的区或县
- Trie_Full_Province *Trie //省全称 省、直辖市、自治区
- Trie_Full_City *Trie //市全称 地级市
- Trie_Full_District *Trie //县全称 市辖区、县(旗)、县级市、自治县(自治旗)、特区、林区
- Trie_Full_Street *Trie //街道、乡镇全称 镇、乡、民族乡、县辖区、街道
- Trie_Full_Community *Trie //村/委员会全称 村、居委会
- Trie_Sim_Province *Trie //省简称
- Trie_Sim_City *Trie //市简称
- Trie_Sim_District *Trie //县简称
- Trie_Fulls []*Trie //所有全称
- Trie_Sims []*Trie //所有简称
- Seg_SV *gse.Segmenter //分词
- // Seg_PCD *gse.Segmenter //分词
- )
- func InitInfo() {
- InitVar() //初始化变量
- InitSeg() //初始化分词
- InitCity() //初始化城市信息
- }
- //初始化变量
- func InitVar() {
- defer qu.Catch()
- //初始化Trie
- //全称
- Trie_Full_Province = &Trie{}
- Trie_Full_City = &Trie{}
- Trie_Full_District = &Trie{}
- Trie_Full_Street = &Trie{}
- Trie_Full_Community = &Trie{}
- //简称
- Trie_Sim_Province = &Trie{}
- Trie_Sim_City = &Trie{}
- Trie_Sim_District = &Trie{}
- //初始化分词
- // Seg_PCD = &gse.Segmenter{}
- Seg_SV = &gse.Segmenter{}
- //初始化map
- ProvinceMap = make(map[string]string)
- CityMap = make(map[string]string)
- DistrictSimAndAll = make(map[string]string)
- NewDistrictSimAndAll = make(map[string][]map[string]*City)
- CityBriefMap = make(map[string]*City)
- CityFullMap = make(map[string]*City)
- ProvinceBriefMap = make(map[string]*Province)
- NewDistrictCityMap = make(map[string][]*City)
- NewStreetDistrictMap = make(map[string][]*District)
- CommunityDistrictMap = make(map[string][]*District)
- }
- //初始化分词
- func InitSeg() {
- defer qu.Catch()
- // Seg_PCD.LoadDict("res/pcd.txt")
- Seg_SV.LoadDict("res/sv.txt")
- }
- //初始化城市信息
- func InitCity() {
- defer qu.Catch()
- InitCityAll() //城市全称信息
- InitCitySim() //城市简称信息
- Trie_Fulls = []*Trie{Trie_Full_Province, Trie_Full_City, Trie_Full_District, Trie_Full_Street, Trie_Full_Community}
- Trie_Sims = []*Trie{Trie_Sim_Province, Trie_Sim_City, Trie_Sim_District}
- }
- func InitCityAll() {
- query := map[string]interface{}{
- "s_type": "cityall",
- "delete": false,
- "s_version": Version,
- }
- list, _ := MgoExt.Find(VersionColl, query, nil, nil)
- qu.Debug("all---", len(list))
- for _, v := range list {
- name := qu.ObjToString(v["s_name"])
- tmp := v["content"].(map[string]interface{})
- //加载省信息
- Trie_Full_Province.AddWords(name) //加入省全称Trie(k:浙江省)
- p := &Province{}
- p.Name = name //省全称:浙江省
- p.Brief = tmp["brief"].(string) //省简称:浙江
- Trie_Sim_Province.AddWords(p.Brief) //加入省简称Trie(k:浙江)
- ProvinceMap[name] = p.Brief //浙江省:浙江
- ProvinceBriefMap[p.Brief] = p //浙江:省信息{}
- p.Cap = tmp["captial"].(string) //省会(杭州)
- //加载市信息
- city, _ := tmp["city"].(map[string]interface{})
- for k, v := range city {
- Trie_Full_City.AddWords(k) //加入市全称Trie(k:杭州市)
- v1m, _ := v.(map[string]interface{})
- c := &City{}
- c.Name = k //市全称:杭州市
- c.Brief = v1m["brief"].(string) //市简称:杭州
- Trie_Sim_City.AddWords(c.Brief) //加入市简称Trie(k:杭州)
- CityMap[k] = c.Brief //杭州市:杭州
- CityBriefMap[c.Brief] = c //杭州:市信息{}
- CityFullMap[k] = c //杭州市:市信息{}
- c.P = p
- if c.Name == p.Cap {
- p.Captial = c //加载province中的省会市信息{}
- }
- //区县
- districtmap, _ := v1m["area"].(map[string]interface{}) //区或县
- for district, streets := range districtmap {
- d := &District{}
- d.Name = district
- d.C = c
- //省直辖市,河南济源市没有区一级,目前区一级写的还是济源市
- //匹配时,如果匹配到区,拿区和市比对,相同则代表是省直辖市,不要区一级
- Trie_Full_District.AddWords(district) //加入区或县全称Trie
- ctmp := NewDistrictCityMap[district]
- if len(ctmp) == 0 {
- tmpcarr := []*City{c}
- NewDistrictCityMap[district] = tmpcarr
- } else {
- NewDistrictCityMap[district] = append(NewDistrictCityMap[district], c)
- }
- //街道
- streetmap, _ := streets.(map[string]interface{})
- for street, communitys := range streetmap {
- s := &Street{}
- s.Name = street
- s.D = d
- Trie_Full_Street.AddWords(street) //加入街道全称Trie
- dtmp := NewStreetDistrictMap[street]
- if len(dtmp) == 0 {
- tmpdarr := []*District{d}
- NewStreetDistrictMap[street] = tmpdarr
- } else {
- NewStreetDistrictMap[street] = append(NewStreetDistrictMap[street], d)
- }
- //村、居委会
- for _, ct_tmp := range communitys.(primitive.A) {
- ct := qu.ObjToString(ct_tmp)
- Trie_Full_Community.AddWords(ct) //加入居委会、村全称Trie
- cttmp := CommunityDistrictMap[ct]
- if len(cttmp) == 0 {
- tmpdarr := []*District{d}
- CommunityDistrictMap[ct] = tmpdarr
- } else {
- CommunityDistrictMap[ct] = append(CommunityDistrictMap[ct], d)
- }
- }
- }
- }
- }
- }
- }
- func InitCitySim() {
- defer qu.Catch()
- query := map[string]interface{}{
- "s_type": "citysim",
- "delete": false,
- "s_version": Version,
- }
- list, _ := MgoExt.Find(VersionColl, query, nil, nil)
- qu.Debug("sim---", len(list))
- for _, v := range list {
- tmp := v["content"].(map[string]interface{})
- city, _ := tmp["city"].(map[string]interface{})
- for _, v1 := range city {
- v1m, _ := v1.(map[string]interface{})
- cb := v1m["brief"].(string) //市简称
- arr := v1m["area"].(map[string]interface{}) //区或县简称
- for districtsim, districtall := range arr {
- dfullstr, _ := districtall.(string)
- Trie_Sim_District.AddWords(districtsim) //加入区或县简称Trie
- c := CityBriefMap[cb]
- dfullarr := NewDistrictSimAndAll[districtsim]
- dfullcity := map[string]*City{dfullstr: c}
- if len(dfullarr) == 0 {
- tmparr := []map[string]*City{dfullcity}
- NewDistrictSimAndAll[districtsim] = tmparr
- } else {
- NewDistrictSimAndAll[districtsim] = append(NewDistrictSimAndAll[districtsim], dfullcity)
- }
- }
- }
- }
- }
|