马尔可夫模型
以下介绍引用自互联网:“马尔可夫模型(Markov Model),马尔科夫模型是一种统计类模型,广泛应用在语音识别,词性自动标注,音字转换,概率文法等各个自然语言处理等应用领域。经过长期发展,尤其是在语音识别中的成功应用,使它成为一种通用的统计工具”
比如,我们可以对一个天气系统建立马尔科夫模型:
如果今天是晴天,那么明天有80%的可能性也是晴天,15%的可能性是多云,还有5%的可能性是下雨天,以此类推。
需要注意一下几点:
任何一个节点引出的所有可能性的总和必须等于100%,无论多么复杂的系统,必然会在下一步发生若干事件中的一个事件。
虽然这个天气系统在任何一个时间都只有三种可能,但是你可以用这个模型生成天气状态的无限次转移列表。
只有当前节点的状态会影响后一天的状态,如果你在晴天节点上,即使前100天都是晴天或雨天都没关系,因为明天是晴天的概率还是有70%。
有些节点可能比其他节点更难到达,第二天是雨天的可能性会比晴天或多云要小很多。
很明显,这是一个很简单的系统,而马尔科夫模型可以演化成任意规模的复杂模型。事实上,Google的page rank算法也是基于马尔科夫模型的,把网站做成任意节点,入站\出站链接作为节点之间的连接。连接某一个节点的“可能性”一个网站的相对关注度。如果我们的天气系统表示一个微型互联网,那么“雨天”的页面等级page rank相对比较低,而多云的页面等级相对比较高。
了解了这些概念之后,让我们再回到主题,研究一个具体的例子:文本分析与写作。
还用上节的例子分析的一篇就职演说,我们可以写出以下代码,通过演讲内容的结构生成任意长度的马尔科夫链组成的句子:
代码的输出结果每次都会变化,下面是其中一个胡言乱语的结果:
I consider himself a vote of a state of no expense but have been entertained that the contrary , as well intended by anyone should be destroyed by which may be found to the minority , warning the contrary , quadrupled in this duty of unalienable . If such influences it gives to that Almighty hand as the interest of exclusive metallic currency . Caesar to upon their country , with their engagements and the acts of each other person . This state in attributing the people , each State unite in part remaining to apply their rights as collisions
那么代码是怎么实现的呢?
buildWordDict函数把网上获取的文本字符串作为参数,然后对字符串做一些清理和格式化的处理,去掉引号,把其他标点符号两端加上空格,这样就可以对每一个单词进行有效的处理。最后,再建立如下所示的一个二维字典——字典里面有字典:
{ word_a : { word_b : 2 , word_c : 1, word_d : 1} , word_e : { word_b : 5 ,word_d : 2 } , … }
在这个字典中,word_a出现了四次,有两次后面跟的单词是word_b,一次是word_c,一次是word_d,word_e出现了7次,有5次后面跟的单词是word_b,两次是word_d。
如果我们要画出这个结果的模型,那么word_a可能就带有50%概率的箭头指向word_b(四次中的两次)带25%概率的箭头指向word_c,还有带25%概率的箭头指向word_d。
一旦字典建成,不管你现在看到了文章的哪个词,都可以用这个字典作为查询表来选择下一个节点,这个字典也正是这么使用的,如果我们现在位于word_e节点,那么下一步就是要把字典{word_b : 5, word_d : 2}传递到retrieveRandomWord函数,这个函数会被照字典中单词频次和权重随机获取一个单词。
先确定一个随机的开始词(实例中使用的是I),我们可以通过马尔科夫链,随意地重复,生成我们需要的任意长度的句子。
参考资料:
https://en.wikipedia.org/wiki/Markov_chain
https://github.com/jsvine/markovify
https://pypi.python.org/pypi/PyMarkovChain/
https://docs.python.org/2/library/random.html
唯科普 | 《数据采集》目录
A.K.A "小白终结者"系列
第5篇、数据的存储
第6篇、文档读取
第7篇、数据清洗
第8篇、自然语言处理之概括数据(上篇)
第8篇、自然语言处理之马尔可夫模型(中篇)
第8篇、自然语言处理之六度分割终极篇(下篇)
第9篇、穿越网页表单与登录窗口的采集
第10篇、关于数据的采集姿势
第11篇、图像识别与文字处理
第12篇、避开采集的陷阱
第13篇、开始来点正经的吧
第14篇、一点总结与心得
唯科普是VSRC一个面向大众的科普专栏,唯科普旨在分享各种有趣的干货文章,且会由浅入深,推出各种专题连载。
此次的《小白终结者系列之“基于Python的数据采集》,暂定有14篇,该系列将会从底层网络通信开始,讲解数据包的传递,正则表达式的书写,基于API的数据采集,数据存储,文件读取,数据清洗,自然语言处理等。
希望唯科普,能受到大家的喜欢。大家若有任何想法,欢迎随时与我们交流。
精彩原创文章投稿有惊喜!
VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送(至少为500元唯品卡)我们为您准备的丰富奖品包括但不仅限于:MacbookAir、VSRC定制雨伞,VSRC定制水杯以及VSRC精美靠枕!(活动最终解释权归VSRC所有)
不知道,大家都喜欢阅读哪些类型的信息安全文章?
不知道,大家都希望我们更新关于哪些主题的干货?
现在起,只要您有任何想法或建议,欢迎直接回复本公众号留言!
精彩留言互动的热心用户,将有机会获得VSRC赠送的精美奖品一份!
同时,我们也会根据大家反馈的建议,选取热门话题,进行原创发布!
点击原文阅读 VSRC唯科普 |(第8/14篇)(上篇)