婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 淺析Python實(shí)現(xiàn)DFA算法

淺析Python實(shí)現(xiàn)DFA算法

熱門標(biāo)簽:銀川電話機(jī)器人電話 預(yù)覽式外呼系統(tǒng) 如何地圖標(biāo)注公司 上海正規(guī)的外呼系統(tǒng)最新報(bào)價(jià) 企業(yè)彩鈴地圖標(biāo)注 長(zhǎng)春極信防封電銷卡批發(fā) 外賣地址有什么地圖標(biāo)注 電銷機(jī)器人錄音要學(xué)習(xí)什么 煙臺(tái)電話外呼營(yíng)銷系統(tǒng)

一、概述

計(jì)算機(jī)操作系統(tǒng)中的進(jìn)程狀態(tài)與切換可以作為 DFA 算法的一種近似理解。如下圖所示,其中橢圓表示狀態(tài),狀態(tài)之間的連線表示事件,進(jìn)程的狀態(tài)以及事件都是可確定的,且都可以窮舉。

DFA 算法具有多種應(yīng)用,在此先介紹在匹配關(guān)鍵詞領(lǐng)域的應(yīng)用。

二、匹配關(guān)鍵詞

我們可以將每個(gè)文本片段作為狀態(tài),例如“匹配關(guān)鍵詞”可拆分為“匹”、“匹配”、“匹配關(guān)”、“匹配關(guān)鍵”和“匹配關(guān)鍵詞”五個(gè)文本片段。

【過程】:

  • 初始狀態(tài)為空,當(dāng)觸發(fā)事件“匹”時(shí)轉(zhuǎn)換到狀態(tài)“匹”;
  • 觸發(fā)事件“配”,轉(zhuǎn)換到狀態(tài)“匹配”;
  • 依次類推,直到轉(zhuǎn)換為最后一個(gè)狀態(tài)“匹配關(guān)鍵詞”。

再讓我們考慮多個(gè)關(guān)鍵詞的情況,例如“匹配算法”、“匹配關(guān)鍵詞”以及“信息抽取”。

可以看到上圖的狀態(tài)圖類似樹形結(jié)構(gòu),也正是因?yàn)檫@個(gè)結(jié)構(gòu),使得 DFA 算法在關(guān)鍵詞匹配方面要快于關(guān)鍵詞迭代方法(for 循環(huán))。經(jīng)常刷 LeetCode 的讀者應(yīng)該清楚樹形結(jié)構(gòu)的時(shí)間復(fù)雜度要小于 for 循環(huán)的時(shí)間復(fù)雜度。

for 循環(huán):

keyword_list = []

for keyword in ["匹配算法", "匹配關(guān)鍵詞", "信息抽取"]:
    if keyword in "DFA 算法匹配關(guān)鍵詞":
        keyword_list.append(keyword)   

for 循環(huán)需要遍歷一遍關(guān)鍵詞表,隨著關(guān)鍵詞表的擴(kuò)充,所需的時(shí)間也會(huì)越來越長(zhǎng)。

DFA 算法:找到“匹”時(shí),只會(huì)按照事件走向特定的序列,例如“匹配關(guān)鍵詞”,而不會(huì)走向“匹配算法”,因此遍歷的次數(shù)要小于 for 循環(huán)。具體的實(shí)現(xiàn)放在下文中。

【問】:那么如何構(gòu)建狀態(tài)圖所示的結(jié)構(gòu)呢?

【答】:在 Python 中我們可以使用 dict 數(shù)據(jù)結(jié)構(gòu)。

state_event_dict = {
    "匹": {
        "配": {
            "算": {
                "法": {
                    "is_end": True
                },
                "is_end": False
            },
            "關(guān)": {
                "鍵": {
                    "詞": {
                        "is_end": True
                    },
                    "is_end": False
                },
                "is_end": False
            },
            "is_end": False
        },
        "is_end": False
    },
    "信": {
        "息": {
            "抽": {
                "取": {
                    "is_end": True
                },
                "is_end": False
            },
            "is_end": False
        },
        "is_end": False
    }
}

用嵌套字典來作為樹形結(jié)構(gòu),key 作為事件,通過 is_end 字段來判斷狀態(tài)是否為最后一個(gè)狀態(tài),如果是最后一個(gè)狀態(tài),則停止?fàn)顟B(tài)轉(zhuǎn)換,獲取匹配的關(guān)鍵詞。

【問】:如果關(guān)鍵詞存在包含關(guān)系,例如“匹配關(guān)鍵詞”和“匹配”,那么該如何處理呢?

【答】:我們?nèi)匀豢梢杂?is_end 字段來表示關(guān)鍵詞的結(jié)尾,同時(shí)添加一個(gè)新的字段,例如 is_continue 來表明仍可繼續(xù)進(jìn)行匹配。除此之外,也可以通過尋找除 is_end 字段外是否還有其他的字段來判斷是否繼續(xù)進(jìn)行匹配。例如下面代碼中的“配”,除了 is_end 字段外還有“關(guān)”,因此還需要繼續(xù)進(jìn)行匹配。

state_event_dict = {
    "匹": {
        "配": {
            "關(guān)": {
                "鍵": {
                    "詞": {
                        "is_end": True
                    },
                    "is_end": False
                },
                "is_end": False
            },
            "is_end": True
        },
        "is_end": False
    }
}

接下來,我們來實(shí)現(xiàn)這個(gè)算法。

三、算法實(shí)現(xiàn)

使用 Python 3.6 版本實(shí)現(xiàn),當(dāng)然 Python 3.X 都能運(yùn)行。

3.1、構(gòu)建存儲(chǔ)結(jié)構(gòu)

def _generate_state_event_dict(keyword_list: list) -> dict:
    state_event_dict = {}

    # 遍歷每一個(gè)關(guān)鍵詞
    for keyword in keyword_list:
        current_dict = state_event_dict
        length = len(keyword)

        for index, char in enumerate(keyword):
            if char not in current_dict:
                next_dict = {"is_end": False}
                current_dict[char] = next_dict
                current_dict = next_dict
            else:
                next_dict = current_dict[char]
                current_dict = next_dict

            if index == length - 1:
                current_dict["is_end"] = True

    return state_event_dict

關(guān)于上述代碼仍然有不少可迭代優(yōu)化的地方,例如先對(duì)關(guān)鍵詞列表按照字典序進(jìn)行排序,這樣可以讓具有相同前綴的關(guān)鍵詞集中在一塊,從而在構(gòu)建存儲(chǔ)結(jié)構(gòu)時(shí)能夠減少遍歷的次數(shù)。

3.2、匹配關(guān)鍵詞

def match(state_event_dict: dict, content: str):
    match_list = []
    state_list = []
    temp_match_list = []

    for char_pos, char in enumerate(content):
        # 首先找到匹配項(xiàng)的起點(diǎn)
        if char in state_event_dict:
            state_list.append(state_event_dict)
            temp_match_list.append({
                "start": char_pos,
                "match": ""
            })

        # 可能會(huì)同時(shí)滿足多個(gè)匹配項(xiàng),因此遍歷這些匹配項(xiàng)
        for index, state in enumerate(state_list):
            if char in state:
                state_list[index] = state[char]
                temp_match_list[index]["match"] += char

                # 如果抵達(dá)匹配項(xiàng)的結(jié)尾,表明匹配關(guān)鍵詞完成
                if state[char]["is_end"]:
                    match_list.append(copy.deepcopy(temp_match_list[index]))

                    # 如果還能繼續(xù),則繼續(xù)進(jìn)行匹配
                    if len(state[char].keys()) == 1:
                        state_list.pop(index)
                        temp_match_list.pop(index)
            # 如果不滿足匹配項(xiàng)的要求,則將其移除
            else:
                state_list.pop(index)
                temp_match_list.pop(index)

    return match_list

3.3、完整代碼

import re
import copy


class DFA:

    def __init__(self, keyword_list: list):
        self.state_event_dict = self._generate_state_event_dict(keyword_list)

    def match(self, content: str):
        match_list = []
        state_list = []
        temp_match_list = []

        for char_pos, char in enumerate(content):
            if char in self.state_event_dict:
                state_list.append(self.state_event_dict)
                temp_match_list.append({
                    "start": char_pos,
                    "match": ""
                })

            for index, state in enumerate(state_list):
                if char in state:
                    state_list[index] = state[char]
                    temp_match_list[index]["match"] += char

                    if state[char]["is_end"]:
                        match_list.append(copy.deepcopy(temp_match_list[index]))

                        if len(state[char].keys()) == 1:
                            state_list.pop(index)
                            temp_match_list.pop(index)
                else:
                    state_list.pop(index)
                    temp_match_list.pop(index)

        return match_list

    @staticmethod
    def _generate_state_event_dict(keyword_list: list) -> dict:
        state_event_dict = {}

        for keyword in keyword_list:
            current_dict = state_event_dict
            length = len(keyword)

            for index, char in enumerate(keyword):
                if char not in current_dict:
                    next_dict = {"is_end": False}
                    current_dict[char] = next_dict
                    current_dict = next_dict
                else:
                    next_dict = current_dict[char]
                    current_dict = next_dict

                if index == length - 1:
                    current_dict["is_end"] = True

        return state_event_dict


if __name__ == "__main__":
    dfa = DFA(["匹配關(guān)鍵詞", "匹配算法", "信息抽取", "匹配"])
    print(dfa.match("信息抽取之 DFA 算法匹配關(guān)鍵詞,匹配算法"))

輸出:

[

    {

        'start': 0, 

        'match': '信息抽取'

    }, {

        'start': 12, 

        'match': '匹配'

    }, {

        'start': 12, 

        'match': '匹配關(guān)鍵詞'

    }, {

        'start': 18, 

        'match': '匹配'

    }, {

        'start': 18,

        'match': '匹配算法'

    }

]

四、其他用法

4.1、添加通配符

在敏感詞識(shí)別時(shí)往往會(huì)遇到同一種類型的句式,例如“你這個(gè)傻X”,其中 X 可以有很多,難道我們需要一個(gè)個(gè)添加到關(guān)鍵詞表中嗎?最好能夠通過類似正則表達(dá)式的方法去進(jìn)行識(shí)別。一個(gè)簡(jiǎn)單的做法就是“*”,匹配任何內(nèi)容。

添加通配符只需要對(duì)匹配關(guān)鍵詞過程進(jìn)行修改:

def match(self, content: str):
    match_list = []
    state_list = []
    temp_match_list = []

    for char_pos, char in enumerate(content):
        if char in self.state_event_dict:
            state_list.append(self.state_event_dict)
            temp_match_list.append({
                "start": char_pos,
                "match": ""
            })

        for index, state in enumerate(state_list):
            is_find = False
            state_char = None

            # 如果是 * 則匹配所有內(nèi)容
            if "*" in state:
                state_list[index] = state["*"]
                state_char = state["*"]
                is_find = True

            if char in state:
                state_list[index] = state[char]
                state_char = state[char]
                is_find = True

            if is_find:
                temp_match_list[index]["match"] += char

                if state_char["is_end"]:
                    match_list.append(copy.deepcopy(temp_match_list[index]))

                    if len(state_char.keys()) == 1:
                        state_list.pop(index)
                        temp_match_list.pop(index)
            else:
                state_list.pop(index)
                temp_match_list.pop(index)

    return match_list

main() 函數(shù)。

if __name__ == "__main__":
    dfa = DFA(["匹配關(guān)鍵詞", "匹配算法", "信息*取", "匹配"])
    print(dfa.match("信息抽取之 DFA 算法匹配關(guān)鍵詞,匹配算法,信息抓取"))

輸出:

[

    {

        'start': 0, 

        'match': '信息抽取'

    }, {

        'start': 12,

        'match': '匹配'

    }, {

        'start': 12,

        'match': '匹配關(guān)鍵詞'

    }, {

        'start': 18,

        'match': '匹配'

    }, {

        'start': 18,

        'match': '匹配算法'

    }, {

        'start': 23,

        'match': '信息抓取'

    }

]

以上就是淺析Python實(shí)現(xiàn)DFA算法的詳細(xì)內(nèi)容,更多關(guān)于Python DFA算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 基于java實(shí)現(xiàn)DFA算法代碼實(shí)例
  • Java實(shí)現(xiàn)DFA算法對(duì)敏感詞、廣告詞過濾功能示例
  • Java使用DFA算法實(shí)現(xiàn)過濾多家公司自定義敏感字功能詳解
  • java利用DFA算法實(shí)現(xiàn)敏感詞過濾功能
  • C#詞法分析器之轉(zhuǎn)換DFA詳解

標(biāo)簽:湖北 佳木斯 上饒 珠海 潮州 宜昌 西寧 盤錦

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺析Python實(shí)現(xiàn)DFA算法》,本文關(guān)鍵詞  淺析,Python,實(shí)現(xiàn),DFA,算法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺析Python實(shí)現(xiàn)DFA算法》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于淺析Python實(shí)現(xiàn)DFA算法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产日韩欧美精品一区| 亚洲国产精品ⅴa在线观看| 91精品国产免费| 一区二区三区四区在线免费观看| 国产美女娇喘av呻吟久久| 久久久噜噜噜久噜久久综合| 激情偷乱视频一区二区三区| 久久综合丝袜日本网| 久久精品国产秦先生| 日韩一区二区精品| 久久成人av少妇免费| 国产性天天综合网| 成人深夜福利app| 亚洲四区在线观看| 91在线码无精品| 亚洲国产另类av| 日韩美女一区二区三区四区| 蜜桃av噜噜一区二区三区小说| 在线视频国内自拍亚洲视频| 亚洲一区二区精品久久av| 9191成人精品久久| 奇米一区二区三区| 精品免费一区二区三区| 91色综合久久久久婷婷| 日本美女一区二区| 久久综合色天天久久综合图片| 成人一区二区三区视频在线观看 | 日韩久久久精品| 国产九色精品成人porny| 自拍偷拍亚洲欧美日韩| 91精品国产综合久久精品| 成人国产精品免费网站| 日本午夜精品一区二区三区电影| 国产免费成人在线视频| 欧美情侣在线播放| 成人免费福利片| 久久丁香综合五月国产三级网站| 亚洲伦理在线精品| 国产亚洲自拍一区| 3d动漫精品啪啪一区二区竹菊| 97se亚洲国产综合自在线| 精品一二线国产| 亚洲二区在线观看| 国产精品三级在线观看| 日韩美一区二区三区| 欧美性大战久久久| av亚洲精华国产精华精华| 国模少妇一区二区三区| 日韩av一区二区三区四区| 一区二区三区 在线观看视频| 欧美国产精品久久| 2024国产精品视频| 91精品婷婷国产综合久久性色| 91麻豆免费看片| 91在线看国产| 成人手机电影网| 成人综合在线观看| 国产成人精品免费一区二区| 久久爱另类一区二区小说| 三级久久三级久久久| 一区二区三区国产豹纹内裤在线| 中文字幕 久热精品 视频在线| 精品国产91洋老外米糕| 日韩一区二区视频在线观看| 欧美一区二区三区四区视频| 正在播放亚洲一区| 欧美一区二区不卡视频| 欧美一二三在线| 91精选在线观看| 日韩女优毛片在线| 久久久久国产精品人| 国产天堂亚洲国产碰碰| 日本一区二区三区国色天香| 日本一区二区动态图| 国产精品麻豆视频| 亚洲免费av高清| 亚洲.国产.中文慕字在线| 亚洲在线观看免费视频| 精品日韩欧美一区二区| 亚洲国产一区二区三区青草影视| 欧美激情一区二区三区蜜桃视频| 久久久久久9999| 亚洲午夜激情av| 国产麻豆视频一区| 欧美日韩视频在线一区二区| 久久色成人在线| 综合分类小说区另类春色亚洲小说欧美| 亚洲成va人在线观看| 国产不卡在线播放| 国产精品一二三四五| 国产成人免费高清| av成人免费在线观看| 欧美视频一区二区三区四区| 日韩免费观看高清完整版| 国产欧美一区二区精品秋霞影院 | 一区二区三区免费| 五月激情综合色| 国产精品一区在线观看乱码 | 成人ar影院免费观看视频| 99久久精品国产网站| 欧美肥胖老妇做爰| 欧美激情一区三区| 日韩中文字幕区一区有砖一区 | 欧美精品丝袜中出| 26uuu亚洲综合色欧美| 亚洲免费毛片网站| 毛片av中文字幕一区二区| 成人午夜精品在线| 欧美精品欧美精品系列| 国产三级精品三级在线专区| 亚洲一区二区在线免费看| 春色校园综合激情亚洲| 69av一区二区三区| 亚洲视频一区二区在线| 免费美女久久99| 在线国产亚洲欧美| 国产网红主播福利一区二区| 亚洲午夜影视影院在线观看| 国产91高潮流白浆在线麻豆| 日韩欧美视频在线| 亚洲综合在线免费观看| 97久久精品人人澡人人爽| 久久亚洲综合av| 久久精品国产澳门| 色综合网站在线| 日韩黄色小视频| 亚洲免费在线看| 一区二区三区在线观看视频| 91精品国产一区二区三区蜜臀| 免费看欧美女人艹b| 依依成人精品视频| 国产日韩欧美精品综合| 精品视频免费看| 成人激情动漫在线观看| 精品一区免费av| 黄色资源网久久资源365| 国产精品青草久久| 中文字幕五月欧美| 久久亚洲春色中文字幕久久久| 26uuu精品一区二区三区四区在线| 色国产综合视频| 国产黑丝在线一区二区三区| 国产精一区二区三区| 日本视频免费一区| 久草热8精品视频在线观看| 极品销魂美女一区二区三区| 日韩精品福利网| 日本强好片久久久久久aaa| 日韩—二三区免费观看av| 国产经典欧美精品| 国产精品乡下勾搭老头1| 日韩精品视频网| 亚洲电影激情视频网站| 中文字幕亚洲精品在线观看| 欧美一区二区三区免费视频| 国产精品视频线看| 欧美性受极品xxxx喷水| 亚洲乱码国产乱码精品精可以看| 91黄色免费版| 秋霞av亚洲一区二区三| 久久亚洲精品国产精品紫薇| 成人国产一区二区三区精品| 综合激情网...| 欧美日韩在线观看一区二区| 欧美伊人久久大香线蕉综合69| 91麻豆福利精品推荐| 国产婷婷精品av在线| 亚洲欧洲美洲综合色网| 亚洲一区二区三区四区在线| 蜜桃视频在线观看一区| 成人午夜精品一区二区三区| 欧美一区日韩一区| 一区二区三区在线看| 国产福利精品导航| 在线电影国产精品| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美人与禽zozo性伦| 一区二区欧美国产| 日韩欧美电影一区| 91麻豆精品在线观看| 久久国产精品色婷婷| 亚洲欧美区自拍先锋| 精品国产乱码91久久久久久网站| 91首页免费视频| 99精品国产91久久久久久| 亚洲精品一卡二卡| 久久精品一区二区| 91麻豆精品国产91久久久使用方法 | 色综合视频一区二区三区高清| 日韩精品电影在线观看| 亚洲视频在线观看一区| 久久久午夜电影| 欧美一区二区三区婷婷月色| 99久久免费国产| 国产一区二区免费看| 午夜影视日本亚洲欧洲精品| 亚洲色图欧洲色图婷婷| 国产精品视频线看| 国产丝袜欧美中文另类| 精品剧情v国产在线观看在线|