最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

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

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

現(xiàn)在我們通過一個簡單的優(yōu)先狀態(tài)機來實現(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", #號
        "STATE_END", #結(jié)束
        "STATE_ILLEGAL", #錯誤狀態(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 "號" 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)號或終止
        State.STATE_STREET: {
            State.STATE_NUM,
            State.STATE_END,
        },
        #號只能轉(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號"]
    address2 = ["蘇州市","吳中區(qū)", "中山北路", "208號"]
    address3 = ["蘇州市","吳江區(qū)", "中山北路", "208號"]
    address4 = ["蘇州市","吳江區(qū)","208號"]
    address5 = ["蘇州市","中山北路"]
    assert isAddress(address1)
    assert isAddress(address2)
    assert isAddress(address3)
    assert isAddress(address5)
    assert isAddress(address4) == False
 

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

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

最后的話

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

附有限狀態(tài)機的開源實現(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)機識別地址有效性的詳細內(nèi)容,更多關(guān)于Python之有限狀態(tài)機識別地址的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 僅用500行Python代碼實現(xiàn)一個英文解析器的教程

    僅用500行Python代碼實現(xiàn)一個英文解析器的教程

    這篇文章主要介紹了僅用500行Python代碼實現(xiàn)一個英文解析器的教程,自然語言處理近來也是業(yè)界中一個熱門課題,作者為NLP方向的開發(fā)者,需要的朋友可以參考下
    2015-04-04
  • python?pandas數(shù)據(jù)處理之刪除特定行與列

    python?pandas數(shù)據(jù)處理之刪除特定行與列

    Pandas是數(shù)據(jù)科學中的利器,你可能想到的數(shù)據(jù)處理騷操作,貌似用Pandas都能夠?qū)崿F(xiàn),下面這篇文章主要給大家介紹了關(guān)于python?pandas數(shù)據(jù)處理之刪除特定行與列的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 快速部署 Scrapy項目scrapyd的詳細流程

    快速部署 Scrapy項目scrapyd的詳細流程

    這篇文章主要介紹了快速部署 Scrapy項目scrapyd的詳細流程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 使用Django搭建一個基金模擬交易系統(tǒng)教程

    使用Django搭建一個基金模擬交易系統(tǒng)教程

    今天小編就為大家分享一篇使用Django搭建一個基金模擬交易系統(tǒng)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python生成tensorflow輸入輸出的圖像格式的方法

    python生成tensorflow輸入輸出的圖像格式的方法

    本篇文章主要介紹了python生成tensorflow輸入輸出的圖像格式的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Pytest如何使用mark的方法

    Pytest如何使用mark的方法

    本文主要介紹了Pytest如何使用mark的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • 淺析PHP與Python進行數(shù)據(jù)交互

    淺析PHP與Python進行數(shù)據(jù)交互

    本篇文章給大家分享了PHP與Python進行數(shù)據(jù)交互的詳細方法以及重點點撥,有興趣的朋友可以學習下。
    2018-05-05
  • 解決python 找不到module的問題

    解決python 找不到module的問題

    今天小編就為大家分享一篇解決python 找不到module的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python利用scapy實現(xiàn)ARP欺騙的方法

    Python利用scapy實現(xiàn)ARP欺騙的方法

    今天小編就為大家分享一篇Python利用scapy實現(xiàn)ARP欺騙的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python進程池log死鎖問題分析及解決

    Python進程池log死鎖問題分析及解決

    最近線上運行的一個python任務負責處理一批數(shù)據(jù),為提高處理效率,使用了python進程池,并會打印log,本文給大家分析了Python進程池log死鎖問題以及解決方法,需要的朋友可以參考下
    2024-01-01

最新評論

冕宁县| 陕西省| 潢川县| 阳高县| 兴化市| 噶尔县| 新民市| 浦北县| 青浦区| 龙门县| 松桃| 石景山区| 米脂县| 电白县| 景泰县| 文昌市| 南华县| 益阳市| 博客| 巫溪县| 天门市| 宜章县| 随州市| 阜宁县| 若尔盖县| 荣成市| 手游| 蒲江县| 沈阳市| 达州市| 正定县| 民勤县| 抚顺县| 浦北县| 大埔区| 云浮市| 濉溪县| 宿迁市| 桃园市| 藁城市| 满洲里市|