目录
作者提到,有限状态机与动态规划,共同铸就了地图和本地搜索技术的基石。有限状态机以其严谨的状态转换机制,为系统提供了一种高效处理序列数据(如地址信息)的框架,确保在复杂的空间信息处理中保持逻辑的清晰与准确。而动态规划则以其优化策略,解决了路径规划和资源分配中的多阶段决策问题,使得我们能够迅速找到最短路径或最优解。这两种技术的结合成为支撑现代导航和位置服务不可或缺的技术支柱(说到这,还有个关键技术没提——卫星定位技术!不过呢,这本书里没讲到这块。待我后续分享遥感领域的读书笔记时,再给大家来个科普小灶!)。
本书在这章节的内容比较单薄,我根据自己以前的经验,做了适当补充,力求科普得更全面~
1. 有限状态机(解决地址识别问题)
1.1 传统的有限状态机
在本地服务技术的实际应用中,首要挑战便是判断地址信息的有效性,并准确提取其中的地址相关细节。以深圳腾讯大厦为例,这一地址存在多种描述方式,如下图所示。神奇的是,这些不同的描述均能被外卖和快递小哥准确识别,这充分证明了这些地址信息的合理性和实用性。这一事实说明,对于人类而言,理解并判断这些地址的有效性相对直观简单。
机器处理这类问题时则复杂得多,因为它需要面对人们描述同一地址时的多样性和不可预测性,而我们又无法提前穷举出所有的可能性。在自然语言处理的语境下,这种复杂性可以被描述为:地址描述虽看似直观,却属于与上下文紧密相关的文法,而非简单的上下文无关文法。幸运的是,地址相关的语法相对简洁,使得我们可以应用多种算法来解决这一难题。其中,有限状态机(Finite State Machine, FSM)已被证明是最为有效的方法之一。
1.1.1 定义
有限状态机是一个特殊的有向图,它包括有限数量的状态(节点)以及连接这些状态的有向弧(边)。这些有向弧上通常带有从一个状态进入下一个状态的条件或输入。
下图是一个识别中国地区地址的一个简化的有限状态机。
1.1.2 结构
1)状态(地址组成部分)
- 有限状态机中的每个状态代表地址中的一个组成部分。比如,一个地址可能包括“国家”、“省份”、“城市”、“街道”和“门牌号”等状态。
- 每个状态都有一个独特的“标识符”,比如“STATE_COUNTRY”、“STATE_PROVINCE”等,以便在状态转移时能够识别。
2)转移条件(指示)
- 转移条件是状态机从一个状态转移到另一个状态时所需满足的条件。这些条件通常基于输入的地址信息。
- 比如,当你输入一个地址时,如果地址以“中国”开始,那么状态机可能会从“初始状态”转移到“国家”状态,并将“中国”作为当前状态的值。
3)输入(地址信息)
- 输入是驱动状态机运行的关键。在地址识别中,输入通常是用户输入或扫描的地址字符串。
- 状态机会逐个分析输入中的每个元素(如词组、字符等),并根据当前的状态和转移条件来决定下一步的动作。
1.1.3 准备条件
1)状态机的建立
- 需要通过大量有效的地址样本来建立状态机,确定每个状态以及状态之间的转移条件。
2)地址字串的匹配算法
- 给定一个有限状态机后,需要设计一种算法来识别和拆分用户输入的地址字串。
1.1.4 工作原理
1)当你输入一个地址时,有限状态机从“初始状态”开始。
2)状态机会检查当前的状态和输入的元素,以确定是否满足某个转移条件。
3)如果满足某个转移条件,状态机就会转移到相应的下一个状态,并更新当前状态的值。
4)这个过程会一直持续到状态机达到一个“终止状态”为止,这通常表示地址已经被成功识别。
1.1.5 举例说明
以“中国北京市海淀区双清路83号”为例进行说明:
1)状态机从“初始状态”开始。
2)当输入“中国”时,状态机转移到“国家”状态,并设置当前状态的值为“中国”。
3)接着输入“北京市”,状态机转移到“城市”状态,并设置值为“北京”。
4)依此类推,状态机将会逐个识别“海淀区”、“双清路”和“83号”,最终到达一个表示完整地址的“终止状态”,证明这个地址是有效的。
5)系统输出最终的地址解析结果:“国家:中国,城市:北京,区县:海淀区,街道:双清路,门牌号:123号”。
1.1.6 局限性
传统的有限状态机在处理具有不确定性、模糊性或概率特性的情况时存在局限。
1)缺乏概率处理能力
- 传统FSM通常只处理确定性的状态转移,即给定一个输入和一个当前状态,状态转移是确定无疑的。然而,在现实世界的应用中,尤其是涉及自然语言处理、语音识别、图像识别等领域时,输入通常是不确定或模糊的,因此需要引入概率来处理这些不确定性,而传统FSM无法直接表达或处理这些概率信息,这限制了其在处理不确定性问题时的能力。
2)无法处理歧义性
- 在许多应用场景中,输入可能具有歧义性,即同一输入可能对应多个可能的输出或状态转移。传统FSM无法有效地处理这种歧义性,因为它通常只选择最匹配的状态转移,而忽略了其他可能的选择。
3)无法处理噪声和错误
- 在实际应用中,输入数据往往包含噪声或错误,这可能导致传统FSM的状态转移出现错误。由于传统FSM是确定性的,它无法对这些噪声或错误进行容错处理。
4)缺乏学习能力
- 传统FSM通常是静态的,即其状态转移逻辑是预先定义好的,并且在系统运行过程中不会发生变化。然而,在某些应用场景中,系统可能需要根据历史数据或用户反馈来不断优化其状态转移逻辑。
为了解决上面传统有限状态机“灵活性不够”的局限性,科学家提出了基于概率的有限状态机(Probabilistic Finite State Machine, PFSM)
1.2 基于概率的有限状态机
1.2.1 定义
基于概率的有限状态机(PFSM)是一种特殊的有限状态机,它结合了概率来处理具有不确定性和模糊性的输入数据。在地址识别分析中,PFSM能够处理地址描述的多样性、不完整性和歧义性,通过计算状态转移的概率来更准确地识别地址的各个组成部分。
1.2.2 结构
PFSM的结构与传统有限状态机相似,但增加了概率元素。它主要包括状态集合、转移概率、输入符号和起始状态。在地址识别分析中,状态集合可以包括“省份”、“城市”、“街道”等地址组成部分;转移概率则基于历史数据和当前输入计算,用于处理地址描述的模糊性和不确定性。
阅读至此,大家可能会发现PFSM与之前讨论的马尔可夫链有着惊人的相似之处。实际上,PFSM在特定条件下确实可以与马尔可夫链等效。因此,将PFSM应用于地址匹配问题时,其实际上是在采用类似于马尔可夫链的方法来模拟地址字符串的生成和匹配过程。
1.2.3 准备条件
1)训练数据
- 收集大量的地址数据作为训练样本,包括正确的地址和错误的地址。这些数据将用于构建和训练PFSM模型。
2)概率模型构建
- 基于训练数据,利用统计方法或机器学习算法来构建状态之间的转移概率模型。这通常涉及到特征提取、概率估计和模型优化等步骤。
3)状态定义
- 明确地址识别过程中可能遇到的所有状态,并为每个状态分配一个唯一的标识符。这些状态应该能够覆盖地址解析的各个方面,确保模型的准确性和完整性。
1.2.4 工作原理
PFSM在地址识别分析中的工作原理如下:
1)接收输入:系统接收一个待识别的地址文本作为输入。
2)计算转移概率:根据当前状态和输入地址的内容,计算转移到各个可能状态的概率。这些概率基于之前构建的转移概率模型进行计算,能够处理地址描述的模糊性和不确定性。
3)选择下一个状态:根据转移概率选择一个最可能的目标状态。与传统的有限状态机不同,PFSM不是简单地根据确定的规则进行状态转移,而是基于概率分布进行选择,这增加了系统的灵活性和适应性。
4)更新状态:将系统状态更新为所选的目标状态,并继续处理剩余的地址文本。
5)结果输出:当地址文本处理完毕后,系统输出最终的地址解析结果,包括各个组成部分的识别结果。
1.2.5 举例说明
假设我们有一个基于概率的有限状态机用于地址识别分析,状态集合包括“省份”、“城市”、“街道”和“门牌号”。现在,我们有一个待识别的地址文本“南京市中山路123号”。
1)初始状态:系统从起始状态开始,等待输入。
2)接收输入:“南京市”。此时,系统面临多个可能的状态转移,因为“南京市”既可能是省份名称(如“江苏省南京市”),也可能是城市名称(如“南京市”)。PFSM会根据转移概率模型计算转移到“省份”和“城市”状态的概率。
3)选择下一个状态:假设根据历史数据和当前输入,系统计算得到转移到“城市”状态的概率更高。因此,系统选择“城市”作为下一个状态,并继续处理剩余的地址文本。
4)继续处理:“中山路”。此时,系统已经处于“城市”状态,并根据输入“中山路”计算转移到“街道”状态的概率。由于“中山路”是一个常见的街道名称,系统将以较高的概率转移到“街道”状态。
5)最后处理:“123号”。系统根据当前“街道”状态和输入“123号”,计算转移到“门牌号”状态的概率,并更新状态。
6)结果输出:系统输出最终的地址解析结果:“城市:南京市,街道:中山路,门牌号:123号”。
2. 动态规划(解决导航路径问题)
2.1 问题定义
在地址识别之后,一个紧接着的问题往往是求取两个地址之间的最短距离。这确实是一个经典的算法问题,在面试中经常出现。不过,在这里,我们不必深入探讨如何使用代码精确实现(比如复杂的递归算法或状态转移方程等),而是聚焦于理解其背后的基本原理,领悟数学思路如何巧妙地简化这类问题。以国家铁路网为例,如果某人想要从【北京】前往【广州】,我们关心的便是如何找出它们之间的最短路径。
2.2 解题思路
如果用最直接的穷举法,计算量将变得极其庞大,因为“最短路径”这类问题一旦增加节点(如城市),计算量就会呈现指数级增长,这种方法显然不实用。读到这里,大家可以先思考下有没有其他的方法。用专业的话来讲,解题思路可以归纳为:全局最优解可以由其子问题的局部最优解组合而成,这正是动态规划的核心思想。
如何理解这一思路呢?假设从【北京】到【广州】的最短路径途经了【A城市】,那么我们可以确信,【北京】到【A城市】的这段局部路径也必定是从【北京】到【A城市】的所有路径中最短的。因为如果这段局部路径不是最短的,那么包含它的全局路径也就不可能是最短的,这会产生逻辑矛盾。
理解了这一点后,我们就可以大幅度减少计算量。具体方法是:
1)在【北京】和【广州】之间选择一个合适的“分割线”(如一条弧线),使得所有从【北京】到【广州】的路径都会穿过这条分割线并与一些中间城市(如乌鲁木齐、西宁、兰州、西安、郑州、济南)相交。
2)先找出从【北京】出发,到达这些分割线上的城市的最短路径(即确定离北京最近的分割线城市),比如是【郑州】。
3)逐步移动这条分割线,并计算从当前分割线城市(如【郑州】)到新的分割线上城市的最短路径,重复这一过程,直到分割线穿过【广州】为止。
这样,通过逐步求解子问题的局部最优解,最终我们就能得到全局的最短路径。
2.3 计算量对比
我们来对比下这种动态规划的算法跟穷举法的计算量。假如从北京到广州最多要经历15个城市,然后每个弧线上平均的城市数为10个,那么如果利用穷举法,计算量将达到,而如果采用动态规划的思路,计算量将降至
。可见,这两种方法的计算量差别是巨大的。