性能分析之性能建模简述

掌财社:Python常见的安全问题有哪些?如何避免?

  返回  

马尔可夫模型用于文字处理

2021/7/21 13:37:55 浏览:

常用于分析大量随机事件的马尔可夫模型,随机事件的特点
是一个离散事件发生之后,另一个离散事件将在前一个事件的条件下以一定的概率发生。
例如,我们可以对一个天气系统建立马尔可夫模型:
马尔可夫模型描述的理论天气系统
在这个天气系统模型中,如果今天是晴天,那么明天有 70% 的可能是晴天,20% 的可能
多云,10% 的可能下雨。如果今天是下雨天,那么明天有 50% 的可能也下雨,25% 的可
能是晴天,25% 的可能是多云。
需要注意以下几点。
• 任何一个节点引出的所有可能的总和必须等于 100%。无论是多么复杂的系统,必然会在下一步发生若干事件中的一个事件。
• 虽然这个天气系统在任一时间都只有三种可能,但是你可以用这个模型生成一个天气状态的无限次转移列表。
• 只有当前节点的状态会影响后一天的状态。如果你在“晴天”节点上,即使前 100 天都是晴天或雨天都没关系,明天晴天的概率还是 70%。
• 有些节点可能比其他节点较难到达。这个现象的原因用数学来解释非常复杂,但是可以直观地看出,在这个系统中任意时间节点上,第二天是“雨天”的可能性(指向它的箭头概率之和小于“100%”)比“晴天”或“多云”要小很多。
很明显,这是一个很简单的系统,而马尔可夫模型可以演化成任意规模的复杂系统。事实上,Google 的 page rank 算法也是基于马尔可夫模型,把网站做为节点,入站 / 出站链接做为节点之间的连线。连接某一个节点的“可能性”(likelihood)表示一个网站的相对关注度。也就是说,如果我们的天气系统表示一个微型互联网,那么“雨天”的页面等级
(page rank)相对比较低,而“多云”的页面等级相对比较高。

文本分析与写作

还用前面例子里分析的威廉·亨利·哈里森的就职演讲内容,我们可以写出下面的代码,通过演讲内容的结构生成任意长度的(下面示例中链长为 100)马尔可夫链组成的句子

from urllib.request import urlopen
from random import randint
def wordListSum(wordList):
 sum = 0
 for word, value in wordList.items():
 sum += value
 return sum
def retrieveRandomWord(wordList):
 randIndex = randint(1, wordListSum(wordList))
 for word, value in wordList.items():
 randIndex -= value
 if randIndex <= 0:
 return word
def buildWordDict(text):
 # 剔除换行符和引号
 text = text.replace("\n", " ");
 text = text.replace("\"", "");
 # 保证每个标点符号都和前面的单词在一起
 # 这样不会被剔除,保留在马尔可夫链中
 punctuation = [',', '.', ';',':']
 for symbol in punctuation:
 text = text.replace(symbol, " "+symbol+" ");
 words = text.split(" ")
 # 过滤空单词
 words = [word for word in words if word != ""]
 wordDict = {}
 for i in range(1, len(words)):
 if words[i-1] not in wordDict:
 # 为单词新建一个词典
 wordDict[words[i-1]] = {}
 if words[i] not in wordDict[words[i-1]]:
 wordDict[words[i-1]][words[i]] = 0
 wordDict[words[i-1]][words[i]] = wordDict[words[i-1]][words[
 i]] + 1
 return wordDict
text = str(urlopen("http://pythonscraping.com/files/inaugurationSpeech.txt")
 .read(), 'utf-8')
wordDict = buildWordDict(text)
# 生成链长为100的马尔可夫链
length = 100
chain = ""
currentWord = "I"
for i in range(0, length):
 chain += currentWord+" "
 currentWord = retrieveRandomWord(wordDict[currentWord])
print(chain)

代码的输出结果每次都会变化。
基本原理是:
buildWordDict 函数把网上获取的演讲文本的字符串作为参数,然后对字符串做一些清理
和格式化处理,去掉引号,把其他标点符号两端加上空格,这样就可以对每一个单词进行
有效的处理,传递到 retrieveRandomWord 函数。这个函数会按
照字典中单词频次的权重随机获取一个单词。
先确定一个随机的开始词(示例中用的是经常使用的“I”),我们可以通过马尔可夫链随意地重复,生成我们需要的任意长度的句子。

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号