劉浩宇,李 喆,佘佐超,應卓君,王 薇,趙志浩
(國網四川省電力公司成都供電公司, 四川 成都 610041)
各項研究證據顯示人類的活動信息基本與地理位置相關。在電力企業各項業務中同樣如此,用電地址、報修工單、設備位置等等,地理位置均是其核心字段。目前常規模式基本都是人工提取各類信息中所含地址字段進行匹配,對于電力企業的相關工作人員均是較為繁瑣、耗時的一項工作。如果能快速準確地識別相關內部業務和客戶訴求中所含的地理位置信息,可以很好地輔助電力企業快速響應各方需求、提高服務能力、提升數據資產價值。
下面旨在探索實踐如何自動快速準確地進行地理位置匹配,以各類常見信息中地理位置為基礎,實現地理位置的自動提取與匹配,并基于Python編寫多種地址提取匹配方法,綜合考量匹配準確率及運行速度兩類指標,探索較為適用于電力企業的方法。
最早的自然語言理解方面的研究工作是機器翻譯。由美國人威弗于1949年首先提出了機器翻譯設計方案。20世紀60年代,國外對機器翻譯曾有大規模的研究工作,耗費了巨額費用;但當時人們顯然是低估了自然語言的復雜性,且語言處理的理論和技術均不成熱,機器翻譯整體進展緩慢。當時的主要做法為存儲兩種語言的單詞、短語對應制作大辭典,翻譯時一一對應,技術上只是調整語言的同條順序,但面對日常語義交流時,表現較差。
現在自然語言處理已經是計算機科學領域與人工智能領域中的一個重要方向。其研究的是如何實現人與計算機之間用自然語言進行有效通信的方法。自然語言處理本身為語言學、計算機科學、數學于一體。因此,自然語言處理的研究將涉及人們日常使用的語言。
例如,對于中文文本來說,其形式上由漢字(包括標點符號等)組成的一個字符串。字可組成詞,詞可組成詞組,詞組可組成句子,進而由一些句子組成段、節、章、篇。無論在上述各種層次的字(符)、詞、詞組、句子、段中,同樣的詞語在各層級之間都存在著歧義和多義現象,即形式上一樣的一段字符串,在不同的場景或不同的語境下,可以理解成不同的詞串、詞組串等[1]。一般情況下,它們中的大多數都是可以根據相應的語境和場景的規定而得到解決的。也就是說,對于個人來說,并不造成無法理解的情況,這就是常見的聯系上下文分析。但是為了正確理解語義,是需要基于極其大量的基礎常識進行推理得出。而如何將這些基礎常識較完整地進行收集和整理,又如何通過合適的方式,將其又快又好地存入計算機當中去,并且如何合理地利用它們來解析語義,都是工作量巨大且非常困難的工作。這不是一個在短時間內可以完成的工作,還有待長期的、系統的探索專研。
目前自然語言處理在應用領域包括“語言分詞”“語義分析”“語言翻譯”等等[2],而模糊識別是該領域重要的方法思路之一,其指在大量復雜的信息中,識別出有用的部份,即對接收的信息與以往的記憶和經驗進行有關聯認識,剔除無關的信息。無論是什么對象(語言、文字、圖像等),其需要識別的核心點均具備自己特有的關鍵特征[3],對于中文地址來說,它的核心特征則是地址中的關鍵字,比如“市”“區”“街道”等等,常見方法則是基于關鍵字有效定位文章中地址位置,并基于分詞、比對、校驗等方式對地址模擬匹配,實現文章地址信息的提取[4]。
電力企業與地址相關的業務包括客戶新裝、報修以及設備安裝管理等方面,除了目前地理位置信息存在不準確、不規范等問題外,還存在地址提取匹配耗時長、工作量大等問題。從場景應用上來看大致可以分為以下3類場景:
1)電力企業對內的檢修、巡視、停電等工作情況錄入。例如輸電、變電等專業開展設備運行維護時,其當日工作情況需錄入系統,特別是在發現故障時需在系統內錄入故障內容(包括故障原因、故障地點等),該內容主要為人工填寫。
2)電力企業對外的客戶訴求處理。例如95598接單是根據客戶訴求,形成工單明細內容,在工單派發前,需擬為工單標準格式,如圖1所示,需要人工完善所屬轄區、地址信息等內容。

圖1 客戶訴求工單樣例
3)大數據應用,各專業管理部門根據專業管理需求,開展大數據分析,很多場景都需要結合地址信息開展相關工作。例如運檢需要根據設備故障位置,制定下一步配電網可靠性提升方案;營銷部需要根據投訴內容,針對性開展營銷服務優質提升等。如果在沒有準確地址信息的情況下,需要基于故障內容信息或者不規范的地址信息,通過人工觀察定位的方式梳理地理位置,如果工作量較大,可能會一定程度上舍棄數據分析的顆粒度。
前兩種應用場景是工作流程中必須涉及的工作內容,雖然看似簡單,但是大量且固化的工作也在不經意地耗去了龐大的人力資源,而第3種情況,更是會制約電力企業的精益化管理發展。
除此上訴3類場景之外,目前隨著電力企業大數據進程的不斷演進,針對地址信息進行的數據挖掘也在不斷增多,因此現在亟需高效、準確的地址識別方法。
目前國內外在地址模糊匹配上,受制于語言的不同,國外項目課題難以直接應用。同時相關研究的主要內容是研究針對算法的準確性進行不斷提升,而算法的復雜決定了其在運行上較為緩慢,并且有關算法較為針對特定場景及內容,不代表能直接在電力企業相關場景應用。下面將在各項主流方法的基礎上,探索實踐較為適用電力企業應用場景的地址匹配方法。
中文地址信息一般為“省-市-縣-區-街道-街道號”,而目前日常經常接觸的文章內容,主要包括以下幾類樣例:
1)網頁信息填報類型。其表現為格式相對規范,基本不會出現多個地址信息,識別地址信息位置標志物明顯,如圖2所示。

圖2 網頁信息填報樣例
2)信息公開類型。一般為通知、公告,格式內容較為正式,地址信息較為清晰,但可能出現多個地址[5]。信息公開樣例如圖3所示。

圖3 信息公開樣例
3)文章信息類。一般為新聞報道、客戶訴求等等,文字內容較多,地址信息不規范,存在多個地址信息等,該類情況相對較為復雜。例如“今日,在成都武侯區將進行計劃檢修停電,停電范圍覆蓋長壽路、桐梓林小區、成都中醫院、四川省體育館……成都晚報12:00發布消息”。
經過前期收集整理,收集文章地址信息500余條,整合了所述3種常見情況,使得匹配樣本盡可能貼近真實應用場景,以確保算法在實際應用具有可操作性及實用性。
通過線上線下數據收集的方式,收集地址庫63萬條,在地址庫樣本范圍上確保完全覆蓋所需匹配的文章地址信息,并且加入相似、相近地址,進一步接近實際場景應用情況。地址庫數據如圖4所示。

備注:本次算法測試運行配置為2.6 GHz/CPU,內存16GB。根據數據保密有關要求,地址庫數據僅截圖展示,同時此處展示的坐標已做調整,非真實坐標,但不會影響所研究內容。
經驗證直接利用正則表達式制定提取樣式[6],難以實現地址的提取,特別是街道號,因此形成思路如下:將文章內容直接納入地址庫進行匹配,對應地址庫每一行的6個字段,匹配上的字段為1,沒有匹配上的為0,加總后除以6即為該地址的匹配率。最后找到匹配率最高的地址作為文章的匹配地址。基礎代碼實現如下:
數據讀取:將地址庫數據讀入Jupyter運行環境,如圖5所示。

圖5 數據讀取
逐一搜索加權:將500篇文章信息循環進行讀取,并逐一將地址庫字段納入文章中進行比對,如果該字段在文章出現則該地址加1,并選出數值最大的地址信息作為匹配結果,代碼如圖6所示。

圖6 地址搜索加權實現
結果比對:循環抽取測試結果與正確答案表進行比對驗證,計算正確結果數量以及算法準確率,代碼實現及運行結果詳見圖7。

圖7 方案1計算結果驗證
從計算結果上來看,該方法的準確率為71.21%,但從計算速度上,500條文章完成所有匹配耗時為4 h,平均每條耗時約0.5 min,完全無法達到實用水平。
經過前一種方法的實驗,準確率上雖然基本能夠達到優化條件,但是運行效率低下,因此需要重新調整思路。經分析,方案1耗時長的主要原因為每條文章均需要與地址庫63萬條數據進行匹配,運算量大。實際可以無需每次進行63萬條的匹配,一方面可以對字段進行去重,例如地址庫的省只有6個、城市80個、縣區1000個,因此可以通過不斷定位省-市-縣-區,逐步縮小匹配范圍,以此大幅降低運算復雜程度。從上述思路來看,該方法基本類似于人工篩查的方式(逐個提取關鍵字段信息,然后在地址庫中進行篩選,不斷縮小范圍實現最終定位)。其基本實現方式如下:
1)基于Python集合自帶的去重功能,對地址庫的省、市、縣、區、街道、街道號等字段進行合并去重,形成地址庫各字段的去重列表,代碼如圖8所示。

圖8 核心地址字段去重
2)將地址庫地址信息列表放入地址庫中進行循環匹配,匹配成功則進行提取,形成匹配結果字典,代碼如圖9所示。

圖9 文章地址信息提取
3)按照匹配結果字典,根據匹配字段數量納入地址庫中進行定位,例如匹配到了“城市-街道-街道號”,則匹字段數字為3,則在地址庫對應3個字段進行3次篩查,逐步縮小匹配范圍完成對地址位置的定位,詳見圖10。

圖10 根據地址提取信息進行篩選匹配
4)驗證該方法的準確性,詳見圖11。

圖11 方案2計算結果驗證
該方案在運行速度上提升明顯,500篇文章基于63萬條地址庫的匹配,運行完成僅需5 min,平均每篇文章匹配僅需0.6 s,在運行速度上完全滿足實用化要求,但是在準確率上,現階段該方案也僅有65%左右,無法達到實用化水平(一般設計算法,置信率要達到95%以上)。
解決運行速度慢的問題后,總結錯誤匹配原因,逐個解決錯誤匹配問題,進行算法優化。
經逐個分析,出現錯誤的原因有以下幾點:
1)地址信息相似性極高的情況下,出錯率高。例如xx區-城西街道16號與xx區-城西街道6號。
2)可能會篩查出兩個以上答案。例如文章為城西5號,地址庫為城西區城西街道、城西區城西5號。
3)個別答案匹配不上。例如文章為成都武侯區xx街道(同時西安市也有該街道名的情況),可能就會因匹配順序問題導致結果無法正確輸出(因為城市與街道無法對應的問題)等,錯誤匹配結果如圖12所示。

圖12 錯誤結果樣例
對于地址雷同、重復等問題導致匹配不準確的情況,常規解決方式可以在匹配前進行分詞;但是由于地址名稱復雜度高、非常用名稱多[7],常用的cpca庫無法使用,即使是分詞效果最為良好的jieba分詞方法[8],依然難以對地址名稱進行準確分詞。因此只能進行場景設計解決。
由于所有匹配不準確的地址問題均出在“街道號”這一字段,可以從“街道號”的字符長度進行處理,偽代碼實現:
1)如果最長的街道號也不足1,則直接納入需要匹配的結果;
2)如果不是均為短值,則將街道號長度在2以上的數據納入需要匹配的結果,避免過多無效數據進入需要匹配的內容;
3)做進一步判斷,避免如3號、33號的重復出現。
代碼實現如圖13所示。

圖13 文章地址提取預處理
對于存在多個地址信息的情況下,例如成都-64號、西安-223號,前后不對應的問題,解決思路為:定位匹配到的街道在文章中出現的位置以及街道號所出現的位置,比較兩者位置距離,兩者相近的為一組,就可以實現地址前后字段的準確關聯。偽代碼如下:
1)找到所需匹配的街道在文章中的位置strlc;
2)找到街道對應位置最近的街道號碼;
3)提取街道-街道號碼進行組合;
4)將組合好的結果納入地址庫進行篩查。
匹配文章中出現的街道名稱,并定位街道名稱在文章出現的位置,基于該位置找到離街道名稱最近的街道號碼,代碼實現如圖14所示。

圖14 定位街道字符串在文章中的位置并找到最近街道號
地址提取的運行結果如圖15所示,而未優化前的運行結果如圖16所示。

圖15 優化后實現“街道-街道號碼”相對應

圖16 優化前多個街道和街道號結果不對應且未精確定位
通過對比,可以看到算法優化后,大幅減少了匹配到的街道號碼,同時針對有多個地址的文章實現了街道名稱與街道號碼的一一對應,可以避免出現上下不對應導致無法匹配的情況。
計算結果驗證如圖17所示。經過驗證,雖然在運行速度上,優化后的算法運行需要10 min,是未優化前的2倍,但是也基本滿足應用需求,同時優化后準確率提升到了98.6%,完全滿足實際應用需要。

圖17 方案3計算結果驗證
除以上3種方案外,前期還通過查閱相關文獻,并結合課題內容進行實踐,淘汰了純正則表達式法提取、cpca地址庫提取等方法。第3種方案在準確率和運行速度上基本滿相關業務場景應用需求。同時基于Python的Pyinstaller代碼封裝,可實現在電力企業各類工作電腦上直接運用,具備較高的可操作性及靈活性。3種方案綜合對比如表1所示。

表1 3種方法的綜合對比
經過測試,所提的地址提取匹配方法具備一定的實用性,可以應用于電力企業相關業務場景,但同時該技術主要面向于地址庫中包含的地理位置信息,在此條件下能具備一定的準確性、運行速度和靈活優勢。
在缺點方面,該方案對于日常可能會遇到的地址信息未包含在地址庫內的情況沒有進行設計處理,因此未來可以在上述方案的基礎上進一步加入“最近地址提取法”[9]。現階段形成思路如下:1)基于獨熱編碼方式對地址庫各地址信息進行解析,將文字進行量化處理;2)將處理后的地址庫按區縣進行分區,減少模型運算量,增加模型數量;3)基于隨機森林、人工神經網絡等方式定位分區中地址庫每個字段的經緯度權重[10];4)對未能直接匹配成功的文章地址信息,進行獨熱化處理,并按照所屬區域納入模型進行計算,得出其經緯度;5)根據模型計算的經緯度,計算與地址庫之間歐式距離或者曼哈頓距離找到最相近地址[11]。下一步將繼續提升所提方案的全面性及可用性,為電力企業在管理及服務等方面應用提供參考。