91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python編程使用有限狀態機識別地址有效性的示例分析

發布時間:2021-09-14 15:38:29 來源:億速云 閱讀:212 作者:小新 欄目:開發技術

這篇文章主要介紹了Python編程使用有限狀態機識別地址有效性的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

在收發快遞填寫地址的時候,我們會經常手動輸入地址讓程序智能識別,標準的地址比如,xx省xx市xx縣/區xx路xx號,不過有時候也可以簡單寫:xx市xx縣/區xx路xx號,或者xx省xx縣/區xx路xx號,或者xx市xx路xx號。

但是有些就不是合法的地址了,比如 xx省xx街道xx號,或者 xx市xx省xx區xx號。

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

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

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

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

Python編程使用有限狀態機識別地址有效性的示例分析

每一個有限狀態機都有一個開始狀態和一個終止狀態,以及若干中間狀態,每一條弧上帶著一個狀態進入下一個狀態的條件,比如在上圖中當前的狀態如果是省,如果遇到下一個詞組和區有關就進入區,如果遇到下一個詞組和城市有關那么就進入市。

如果一條地址能從狀態機的開始狀態,經過狀態機的若干中間狀態,最終走到終止狀態,則這條地址有效,否則無效。

比如 xx市xx省xx區xx號 就是無效地址,無法從市走到省。

現在我們通過一個簡單的優先狀態機來實現,代碼有注釋,很容易看懂

from enum import Enum
def isAddress(address: str) -> bool:
 
    #定義狀態
    State = Enum("State", [
        "STATE_INITIAL", #開始
        "STATE_PROVINCE", # 省
        "STATE_CITY", # 市
        "STATE_AREA", # 區 / 縣
        "STATE_STREET", # 街道
        "STATE_NUM", #號
        "STATE_END", #結束
        "STATE_ILLEGAL", #錯誤狀態
    ])
    def toAddressType(addr_slice : str) -> State:
        if "省" in addr_slice:
            return State.STATE_PROVINCE
        elif "市" in addr_slice:
            return State.STATE_CITY
        elif "區" in addr_slice or "縣" in addr_slice:
            return State.STATE_AREA
        elif "路" in addr_slice or "街道" in addr_slice:
            return State.STATE_STREET
        elif "號" in addr_slice:
            return State.STATE_NUM
        else:
            return State.STATE_ILLEGAL   
    #定義狀態轉移   
    transfer = {
        #開始可以轉為 省或市
        State.STATE_INITIAL: {
            State.STATE_PROVINCE, 
            State.STATE_CITY,
        },
        #省可以轉 市或區縣
        State.STATE_PROVINCE:{
            State.STATE_CITY,
            State.STATE_AREA,
        },
        #市可以轉區或街道
        State.STATE_CITY: {
            State.STATE_AREA,
            State.STATE_STREET,
        },
        #區縣可以轉街道
        State.STATE_AREA: {
            State.STATE_STREET,
        },
        #街道可以轉號或終止
        State.STATE_STREET: {
            State.STATE_NUM,
            State.STATE_END,
        },
        #號只能轉終止
        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 = ["江蘇省","蘇州市", "吳中區", "中山北路", "208號"]
    address2 = ["蘇州市","吳中區", "中山北路", "208號"]
    address3 = ["蘇州市","吳江區", "中山北路", "208號"]
    address4 = ["蘇州市","吳江區","208號"]
    address5 = ["蘇州市","中山北路"]
    assert isAddress(address1)
    assert isAddress(address2)
    assert isAddress(address3)
    assert isAddress(address5)
    assert isAddress(address4) == False

這里沒有對整個地址字符串進行分詞,而是直接將地址寫成了列表的形式,主要為了說明狀態機的實現和應用,上述代碼僅能從格式上保證地址是有效的,并不能確保地址真實有效,如果要判斷是真實有效的,那就需要將全國所有的省、市、區縣、街道建立一個 hash 表,門牌號可以用范圍表示,再進行狀態轉移判斷。

上述代碼的 transfer 就是一個 hash 表,相當于把所有正確轉移的情況都窮舉了一遍,它窮盡了在任何一種情況下,對應任何的輸入,需要轉義的狀態。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python編程使用有限狀態機識別地址有效性的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滕州市| 黑山县| 北京市| 东乌| 江华| 万载县| 三门县| 巴里| 鹤壁市| 本溪市| 洱源县| 专栏| 金华市| 汕尾市| 黄龙县| 兰州市| 方城县| 封开县| 高要市| 新化县| 于都县| 南召县| 平顶山市| 利津县| 当涂县| 南安市| 垣曲县| 兴国县| 峨边| 曲水县| 清水河县| 石嘴山市| 韶关市| 阳城县| 安康市| 邛崃市| 井冈山市| 尼木县| 平定县| 乐至县| 渭南市|