龙空技术网

算法小课堂 | 客户量化研究的背后——文本信息的匹配与查找

禾略研究院 310

前言:

今天大家对“函数kmp实现串的模式匹配请在空格处将算法补充完整”大约比较关注,大家都想要学习一些“函数kmp实现串的模式匹配请在空格处将算法补充完整”的相关文章。那么小编也在网络上搜集了一些关于“函数kmp实现串的模式匹配请在空格处将算法补充完整””的相关内容,希望看官们能喜欢,咱们一起来学习一下吧!

算法应用背景

定量问卷和客户访谈,是客研相关课题必不可少的环节。

通过这两种形式,研究者可以了解样本范围内用户的特征与需求,进而为对用户群体的研究,提供有力的支撑。

过去的定量问卷和客户访谈,需要大量的人力去做样本信息采集的工作,但现在看来,这种形式是一种“愚蠢”的做法。

得益于互联网信息技术的发展,我们可以用机器去处理。毕竟处理相同或相似的任务,而不犯错误,正是机器所擅长于人之处。

但用机器解决问题,并非十分完美,我们是可以快速的获取大量的信息,然而再将大量信息,转换为标准且有效的信息方面,会给分析人员带来一定的挑战。

这种挑战,可以简单理解为对客户的信息进行匹配和查找,以及后续的分类和统计。

不过这种挑战,在工程层面上似乎也比较“容易“。所谓的“容易”是建立在如今发达的网络技术上,我们可以通过搜索引擎得到很多解决方案,然后“Ctrl+C”和“Ctrl+V”,问题解决。

“CV”大法固然屡试不爽,但是完全不符合本专栏的所要强调的理念。

笔者认为“拿来主义”最后终究是要还回去的,很多时候我们为了完成任务,快速发展,往往会不求甚解。但是这样长此以往,终究会有被卡脖子的瓶颈期。

所以本专栏的初衷还是希望通过逻辑思考的角度,去科普一些解决一类问题的通用算法。尽管有时候这些东西并不是很有用,但是比起“CV”大法,似乎有趣的多。

回到问题本身,面对海量的客户信息,如何进行快速且有效的匹配和查找?

比如在设计问卷时,我们会设定一定的规则,让用户在规则范围之内填写信息,譬如“您最喜欢______装修风格”;有些时候,我们也会对一大段的用户访谈的文本进行词频统计,比如一段对于户型看法的文本中,统计用户提到的“客厅”的次数最多,从而推测用户比较关心客厅相关的内容。

这两个例子中,前者可以被定义为“模式匹配”,后者可以被定义为精准文本查找,所以接下来,笔者将介绍如何解决这两类文本问题的通用办法。

两类文本问题的通用办法

1、模式匹配与有限自动机

有些时候,我们会设计一些规则,让文本的内容符合我们的设定,后续对信息进行检索时可以快速匹配。

工程上针对模式匹配,早就给出了一套完整的解决方案,这种方案被称为“正则表达式”。

“正则”本义为正其礼仪法则,用到这里即为符合规则的表达式模板。利用正则表达式,可以进行快速的模式匹配。那“正则表达式”是如何做到这一点的?

我们来看下面这个例子:

上图即为一个正则表达式的模板。

由左图可知,这个正则表达式只允许输入有“a”和“b”两种字符,状态为0代表不可以接受,1代表可以接受,初始状态为0。

右图是一个等价的状态转换图,你可以试试,初始状态为0,不停的输入“a“或”b”,当接受状态为1时,必然是以奇数个字符“a”结尾,所以这就是符合某种规则的模式匹配。

上述实现这种模式匹配的方法,被成为有限自动机

“有限”二字代表自动机的状态是有限的,即上例中只有0和1两种状态。设定好规则模式后,自动机可以根据输入,自动生成当前的状态,我们还可以设定哪些状态是可接受的,获取符合规则的内容。

这里还可以再看一个更复杂但更能解决实际问题的例子,如何判断一段文本是有效数字?比如“+3.1415e926“是有效的数字,”+-3“则明显不是。

同样我们需要根据有效数字的特征设定一定的规则,具体如下:

针对这个问题,我们可以将输入分为6类(包括空格、正负号、数字、点、指数符号e和其他),并设定该自动机可能会出现的状态共8种(-1代表该文本必不可能是有效数字,对该文本的匹配可以停止),并判断3、5、6为可接收的状态。

那么这个自动机可以对任意的文本进行判断识别其是否为有效数字。

有限自动机的应用层面很广,图灵在此基础上提出了功能更强大的“图灵机”,被称为是现代计算机的原型。除了工程上的正则表达式之外,有限自动机与计算机的编译原理也有着十分密切的关联。

2、精准文本查找与KMP、Rabin-Karp

另一类文本问题可以称之为精准文本查找,此类问题是需要在一段文本中查找是否存在某个具体的关键词。

比如你需要在文本“ababaababc”中查找是否存在”ababc”这个关键词,你打算如何进行查找?一个简单暴力的办法就是逐个匹配,具体如下图所示:

我们将关键词逐格移动,每次移动之前,都将关键词的每个字符和对应文本的每个字符进行匹配,直到所有字符都和对应文本的字符匹配,说明找到了一个匹配方案。

这种匹配方法被称为“朴素法”,顾名思义,按部就班地移动和匹配,平平无奇,简单且暴力。

那有没有更优秀的查找匹配方案?

请联系第一节的有限自动机思考一下,其实对于关键词本身,何尝不是一种符合某些特定规则的匹配模式,但是这种匹配模式是特殊的,因为只有它自己本身符合,而不是具有某种通解性质。

因此我们同样可以用有限自动机的思想,指导解决精准查找的问题。我们可以将关键词,拆分成可能会匹配的状态,如下图所示:

当状态对应编号为5时,说明找到了一个匹配方案。这里注意到,后面增加了叫做“最长前缀“的一列。

”最长前缀“即指对于某个词,满足其前缀等于该词后缀的最长长度的前缀,比如”abab“的最长前缀为”ab“,因为”aba“不满足等于”abab“的后缀。

而最长前缀,则是促进状态变化和提高匹配效率的关键。

比如在首次进行匹配时,观察下图,我们注意到,前面4个字符都匹配成功,但是最后一个字符匹配失败,这时我们注意到”abab“的最长前缀为”ab“,并且”ab“后面一个字符”a“与文本中不匹配的字符相同,因此我们可以直接将状态转移到图中所示的最下面一行再继续匹配,而不是逐个字符进行比较。

这种利用最长前缀进行匹配的方式,在大部分情况(除非你的文本基本上是重复的一个字符)下,可以大幅提高精准匹配效率。

这种字符的匹配算法被称为KMP算法,KMP是它的提出者们 Knuth、Morria和Pratt 首字母的缩写,这种算法是目前公认,最高效的处理文本精准查找的办法。

另一种文本精准查找的算法Rabin-Karp,也提供了处理此类问题一个非常巧妙的思路。

概括言之,这种算法是通过字符和对应数值之间的映射关系,将字符匹配转换为数值比较来提高查找的效率。

我们还是以上面的例子作为示范,我们首先需要检索文本中出现的字符,并将不同的字符设为不同的值,比如将a设为1,b设为2,c设为3,接下来,通过这种字符和数字之间的关系映射,计算“ababc“的数值和为1*2+2*2+3*1=8,然后也是逐格对文本进行匹配。

具体如图所示:“ababa”的数值和为7,不等于“ababc“的数值和,接下来就移动一格,得到下一个文本待匹配项”babaa“,此时只需减去头部字符的值,再加上尾部字符的值即可,得到的结果仍为7,那么便继续逐格移动下去……

这种算法的策略是,只有当文本的待匹配项的数值和等于关键词的数值和时,我们再进行逐字符匹配验证。Rabin-Karp算法在大部分情况下也能明显提高匹配的效率。

小结

本文介绍了关于文本信息的匹配与查找的几种基本算法,这些算法渗透了西方科学家多年努力的智慧结晶,并作为信息时代的基础建设,造福于当今的世界。

人工智能时代的到来,对文本信息的处理,提出了更高的要求,如何让机器精准理解,客户在文本所要表达的意义和情绪?

基于统计学的模型和对海量数据的训练拟合,或许能接近解决这个问题。

其实一些人们自然而然、毫无困难或者下意识做的事情,用算法表达却最为困难,我们都能理解自然语言,但至今为止还没有人能解释我们是如何做到的,至少没办法用算法解释。

- TO BE CONTINUED -

标签: #函数kmp实现串的模式匹配请在空格处将算法补充完整