欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python編程使用有限狀態(tài)機(jī)識(shí)別地址有效性

 更新時(shí)間:2021年09月14日 12:02:36   作者:somenzz  
這篇文章主要介紹了Python編程中如何使用有限狀態(tài)機(jī)識(shí)別地址有效性,如何識(shí)別一個(gè)地址是否有效,確切的講,如何編程識(shí)別一個(gè)中國地址是否有效

在收發(fā)快遞填寫地址的時(shí)候,我們會(huì)經(jīng)常手動(dòng)輸入地址讓程序智能識(shí)別,標(biāo)準(zhǔn)的地址比如,xx省xx市xx縣/區(qū)xx路xx號(hào),不過有時(shí)候也可以簡單寫:xx市xx縣/區(qū)xx路xx號(hào),或者xx省xx縣/區(qū)xx路xx號(hào),或者xx市xx路xx號(hào)。

但是有些就不是合法的地址了,比如 xx省xx街道xx號(hào),或者 xx市xx省xx區(qū)xx號(hào)。

那么問題來了,如何識(shí)別一個(gè)地址是否有效,確切的講,如何編程識(shí)別一個(gè)中國地址是否有效?

雖然我們大腦可以一眼識(shí)別,但是讓計(jì)算器去識(shí)別,可以不是一件容易的事,根本原因在于地址的描述雖然看上去簡單,但是它依然是比較復(fù)雜的上下文有關(guān)的文法。

比如 “上海市北京東路 xx 號(hào),南京市北京東路 xx 號(hào)”,掃描到北京東路時(shí),它后面的門牌號(hào)是否構(gòu)成正確的地址要看上下文,即城市名。

所幸的是,地址的上下文比較簡單,是有限的,雖然我們可以暴力窮舉所有省、市、區(qū)、街道。但有效的方法還是有限狀態(tài)機(jī)。

每一個(gè)有限狀態(tài)機(jī)都有一個(gè)開始狀態(tài)和一個(gè)終止?fàn)顟B(tài),以及若干中間狀態(tài),每一條弧上帶著一個(gè)狀態(tài)進(jìn)入下一個(gè)狀態(tài)的條件,比如在上圖中當(dāng)前的狀態(tài)如果是省,如果遇到下一個(gè)詞組和區(qū)有關(guān)就進(jìn)入?yún)^(qū),如果遇到下一個(gè)詞組和城市有關(guān)那么就進(jìn)入市。

如果一條地址能從狀態(tài)機(jī)的開始狀態(tài),經(jīng)過狀態(tài)機(jī)的若干中間狀態(tài),最終走到終止?fàn)顟B(tài),則這條地址有效,否則無效。

比如 xx市xx省xx區(qū)xx號(hào) 就是無效地址,無法從市走到省。

現(xiàn)在我們通過一個(gè)簡單的優(yōu)先狀態(tài)機(jī)來實(shí)現(xiàn),代碼有注釋,很容易看懂

from enum import Enum
def isAddress(address: str) -> bool:
 
    #定義狀態(tài)
    State = Enum("State", [
        "STATE_INITIAL", #開始
        "STATE_PROVINCE", # 省
        "STATE_CITY", # 市
        "STATE_AREA", # 區(qū) / 縣
        "STATE_STREET", # 街道
        "STATE_NUM", #號(hào)
        "STATE_END", #結(jié)束
        "STATE_ILLEGAL", #錯(cuò)誤狀態(tài)
    ])
    def toAddressType(addr_slice : str) -> State:
        if "省" in addr_slice:
            return State.STATE_PROVINCE
        elif "市" in addr_slice:
            return State.STATE_CITY
        elif "區(qū)" in addr_slice or "縣" in addr_slice:
            return State.STATE_AREA
        elif "路" in addr_slice or "街道" in addr_slice:
            return State.STATE_STREET
        elif "號(hào)" in addr_slice:
            return State.STATE_NUM
        else:
            return State.STATE_ILLEGAL   
    #定義狀態(tài)轉(zhuǎn)移   
    transfer = {
        #開始可以轉(zhuǎn)為 省或市
        State.STATE_INITIAL: {
            State.STATE_PROVINCE, 
            State.STATE_CITY,
        },
        #省可以轉(zhuǎn) 市或區(qū)縣
        State.STATE_PROVINCE:{
            State.STATE_CITY,
            State.STATE_AREA,
        },
        #市可以轉(zhuǎn)區(qū)或街道
        State.STATE_CITY: {
            State.STATE_AREA,
            State.STATE_STREET,
        },
        #區(qū)縣可以轉(zhuǎn)街道
        State.STATE_AREA: {
            State.STATE_STREET,
        },
        #街道可以轉(zhuǎn)號(hào)或終止
        State.STATE_STREET: {
            State.STATE_NUM,
            State.STATE_END,
        },
        #號(hào)只能轉(zhuǎn)終止
        State.STATE_NUM: {
            State.STATE_END,
        },
    } 
    st = State.STATE_INITIAL
    for ch in address:
        current_state = toAddressType(ch)
        if current_state not in transfer[st]:
            return False
        st = current_state 
     return st in [State.STATE_STREET, State.STATE_NUM,State.STATE_END] 
if __name__ == '__main__':
    address1 = ["江蘇省","蘇州市", "吳中區(qū)", "中山北路", "208號(hào)"]
    address2 = ["蘇州市","吳中區(qū)", "中山北路", "208號(hào)"]
    address3 = ["蘇州市","吳江區(qū)", "中山北路", "208號(hào)"]
    address4 = ["蘇州市","吳江區(qū)","208號(hào)"]
    address5 = ["蘇州市","中山北路"]
    assert isAddress(address1)
    assert isAddress(address2)
    assert isAddress(address3)
    assert isAddress(address5)
    assert isAddress(address4) == False
 

這里沒有對(duì)整個(gè)地址字符串進(jìn)行分詞,而是直接將地址寫成了列表的形式,主要為了說明狀態(tài)機(jī)的實(shí)現(xiàn)和應(yīng)用,上述代碼僅能從格式上保證地址是有效的,并不能確保地址真實(shí)有效,如果要判斷是真實(shí)有效的,那就需要將全國所有的省、市、區(qū)縣、街道建立一個(gè) hash 表,門牌號(hào)可以用范圍表示,再進(jìn)行狀態(tài)轉(zhuǎn)移判斷。

上述代碼的 transfer 就是一個(gè) hash 表,相當(dāng)于把所有正確轉(zhuǎn)移的情況都窮舉了一遍,它窮盡了在任何一種情況下,對(duì)應(yīng)任何的輸入,需要轉(zhuǎn)義的狀態(tài)。

最后的話

本文分享了如何實(shí)現(xiàn)一個(gè)簡單的有限狀態(tài)機(jī)

附有限狀態(tài)機(jī)的開源實(shí)現(xiàn):

django-fsm[1]

python-state-machine[2]

參考資料

[1]

django-fsm:

https://github.com/viewflow/django-fsm

[2]

python-state-machine:

 https://github.com/jtushman/state_machine

以上就是Python編程使用有限狀態(tài)機(jī)識(shí)別地址有效性的詳細(xì)內(nèi)容,更多關(guān)于Python之有限狀態(tài)機(jī)識(shí)別地址的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python+pandas編寫命令行腳本操作excel的tips詳情

    Python+pandas編寫命令行腳本操作excel的tips詳情

    這篇文章主要介紹了Python+pandas編寫命令行腳本操作excel的tips詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Python中用post、get方式提交數(shù)據(jù)的方法示例

    Python中用post、get方式提交數(shù)據(jù)的方法示例

    最近在學(xué)習(xí)使用Python,發(fā)現(xiàn)網(wǎng)上很少提到如何使用post,所以下面這篇文章主要給大家介紹了關(guān)于Python中用post、get方式提交數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-09-09
  • Python中的默認(rèn)參數(shù)實(shí)例分析

    Python中的默認(rèn)參數(shù)實(shí)例分析

    這篇文章主要介紹了Python中的默認(rèn)參數(shù)實(shí)例分析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • python數(shù)據(jù)操作之lambda表達(dá)式詳情

    python數(shù)據(jù)操作之lambda表達(dá)式詳情

    這篇文章主要介紹了python數(shù)據(jù)操作之lambda表達(dá)式詳情,文章基于python的相關(guān)資料展開lambda表達(dá)式具體的內(nèi)容,感興趣的小伙伴可以參考一下
    2022-05-05
  • python33 urllib2使用方法細(xì)節(jié)講解

    python33 urllib2使用方法細(xì)節(jié)講解

    Python 標(biāo)準(zhǔn)庫中有很多實(shí)用的工具類,這里總結(jié)一些 urllib2 的使用細(xì)節(jié):Proxy 的設(shè)置、Timeout 設(shè)置、在 HTTP Request 中加入特定的 、Cookie、使用 HTTP 的 PUT 和 DELETE 方法
    2013-12-12
  • python中使用urllib2偽造HTTP報(bào)頭的2個(gè)方法

    python中使用urllib2偽造HTTP報(bào)頭的2個(gè)方法

    這篇文章主要介紹了python中使用urllib2偽造HTTP報(bào)頭的2個(gè)方法,即偽造http頭信息,需要的朋友可以參考下
    2014-07-07
  • 重構(gòu)Python代碼的六個(gè)實(shí)例

    重構(gòu)Python代碼的六個(gè)實(shí)例

    這篇文章主要給大家介紹了關(guān)于重構(gòu)Python代碼的六個(gè)實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Django自定義YamlField實(shí)現(xiàn)過程解析

    Django自定義YamlField實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Django自定義YamlField實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • python實(shí)現(xiàn)NB-IoT模塊遠(yuǎn)程控制

    python實(shí)現(xiàn)NB-IoT模塊遠(yuǎn)程控制

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)NB-IoT模塊遠(yuǎn)程控制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python探索之SocketServer詳解

    Python探索之SocketServer詳解

    這篇文章主要介紹了Python探索之SocketServer詳解,小編覺得還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-10-10

最新評(píng)論