通过python实现txt中,字母概率的计算,以及信源熵的计算,并且输出
要求
对txt文档进行预处理,把大写字母换成小写字母,把连续的空格换成一个空格
实现步骤
1进行预处理
代码如下:
// An highlighted block
with open('C:\\Users\\lenovo\\Desktop\\pythonProject\\10.txt','r',encoding='UTF-8') as f: # 遍历
content = f.read()
print('预处理前的字符串:')
#print(content)
#Str =content#引入数据
a = re.findall(r'[^\*"/:?|,!-.%‘—;()’“”‘’。°【0123–456789】<>\[\]]',content,re.S)#
a1 = "".join(a)#去掉特殊字符
b=a1.lower()#大写变小写
c=' '.join(b.split())#去连续的空格
fh = open('Res.txt', 'w', encoding='utf-8')#写操作
fh.write(c)
fh.close()
参数介绍:
10.txt:未进行预处理的文档
Res.txt:预处理之后的文档
还需要引入re库 import re
2.对处理过后的Res文档中的26个小写字母和空格的概率计算,以及信源熵的计算
代码如下:
with open('C:\\Users\\lenovo\\Desktop\\pythonProject\\Res.txt','r',encoding='UTF-8') as f: # 遍历
content1 = f.read()
Str1=content1
#print('预处理后的字符串:')
#print(Str1)
sum=0
Hx=0
k=0
j=0
s=0
for a1 in Str1:
if a1 in 'abcdefghijklmnopqrstuvwxyz ':
sum+=1
print(f'"字符总数为":{sum}个')
strfloat=numpy.empty(27,dtype=float)
strArr=numpy.empty(27,dtype=str)
resoult = {} # 定义一个空字典
for i in Str1: # 遍历输入的字符串,以键值对的方式存储在字典中
resoult[i] = Str1.count(i)
print(type(Str1.count))
for key in resoult: # 遍历字典,格式化输出结果
Hx=(resoult[key]/sum)*math.log((sum/resoult[key]),2)+Hx#信
参数介绍:
resoult[key]:每个字符的个数
key:字符
resoult[key]/sum:每个字符的概率
sum:txt中字符总数
Hx:信源熵
3.输出处理好后的概率
代码如下:
table1=PrettyTable(["符号",strArr[0],strArr[1],strArr[2],strArr[3],strArr[4],strArr[5],strArr[6],strArr[7],strArr[8]])
table1.add_row(["概率", strfloat[0],strfloat[1],strfloat[2],strfloat[3],strfloat[4],strfloat[5],strfloat[6],strfloat[7],strfloat[8]])
print(table1)
table2=PrettyTable(["符号",strArr[9],strArr[10],strArr[11],strArr[12],strArr[13],strArr[14],strArr[15],strArr[16],strArr[17]])
table2.add_row(["概率", strfloat[9],strfloat[10],strfloat[11],strfloat[12],strfloat[13],strfloat[14],strfloat[15],strfloat[16],strfloat[17]])
print(table2)
table3=PrettyTable(["符号",strArr[18],strArr[19],strArr[20],strArr[21],strArr[22],strArr[23],strArr[24],strArr[25],strArr[26]])
table3.add_row(["概率", strfloat[18],strfloat[19],strfloat[20],strfloat[21],strfloat[22],strfloat[23],strfloat[24],strfloat[25],strfloat[26]])
print(table3)
这里要引入prettytable 方法如下(前提是你已经安装就好了):
from prettytable import PrettyTable
4.按照生成的概率输出字母
代码如下:
def number_of_certain_probability(sequence, probability):
x = random.uniform(0, 1)
cumulative_probability = 0.0
for item, item_probability in zip(sequence, probability):
cumulative_probability += item_probability
if x < cumulative_probability:
break
return item
cnt=0
value_list = [strArr[0],strArr[1],strArr[2],strArr[3],strArr[4],strArr[5],strArr[6],strArr[7],strArr[8],strArr[9],strArr[10],strArr[11],strArr[12],strArr[13],strArr[14],strArr[15],strArr[16],strArr[17],strArr[18],strArr[19],strArr[20],strArr[21],strArr[22],strArr[23],strArr[24],strArr[25],strArr[26]]
probability = [strfloat[0],strfloat[1],strfloat[2],strfloat[3],strfloat[4],strfloat[5],strfloat[6],strfloat[7],strfloat[8],strfloat[9],strfloat[10],strfloat[11],strfloat[12],strfloat[13],strfloat[14],strfloat[15],strfloat[16],strfloat[17],strfloat[18],strfloat[19],strfloat[20],strfloat[21],strfloat[22],strfloat[23],strfloat[24],strfloat[25],strfloat[26]]
for i in range(200):
_result = number_of_certain_probability(value_list, probability)
print(_result,end="")
cnt=cnt+1
if(cnt==100):#每一百个输出一行
print('\n')
参数介绍:
value_list[]:存放字母字符
probabity:存放每个字母的概率
strfloat[k] = round(resoult[key]/sum,5)#字符结果存入数组
k=k+1;
strArr[j]=key#字符存入数组中
j=j+1
通过这两天语句建立两个模块的链接
5.结果
总代码如下:
import re
import math
from prettytable import PrettyTable
import numpy
import random
import time
# 程序计时器,启动计时器
start = time.perf_counter()
s = '*\/:?"<>|.()-' # 这9个字符在Windows系统下是不可以出现在文件名中的
with open('C:\\Users\\lenovo\\Desktop\\pythonProject\\10.txt','r',encoding='UTF-8') as f: # 遍历
content = f.read()
print('预处理前的字符串:')
#print(content)
#Str =content#引入数据
a = re.findall(r'[^\*"/:?|,!-.%‘—;()’“”‘’。°【0123–456789】<>\[\]]',content,re.S)#中文字符集还没有搞好
a1 = "".join(a)#去掉特殊字符
b=a1.lower()#大写变小写
c=' '.join(b.split())#去连续的空格
fh = open('Res.txt', 'w', encoding='utf-8')#写操作
fh.write(c)
fh.close()
#预处理
with open('C:\\Users\\lenovo\\Desktop\\pythonProject\\Res.txt','r',encoding='UTF-8') as f: # 遍历
content1 = f.read()
Str1=content1
#print('预处理后的字符串:')
#print(Str1)
sum=0
Hx=0
k=0
j=0
s=0
for a1 in Str1:
if a1 in 'abcdefghijklmnopqrstuvwxyz ':
sum+=1
print(f'"字符总数为":{sum}个')
strfloat=numpy.empty(27,dtype=float)
strArr=numpy.empty(27,dtype=str)
resoult = {} # 定义一个空字典
for i in Str1: # 遍历输入的字符串,以键值对的方式存储在字典中
resoult[i] = Str1.count(i)
print(type(Str1.count))
for key in resoult: # 遍历字典,格式化输出结果
Hx=(resoult[key]/sum)*math.log((sum/resoult[key]),2)+Hx#信源熵计算
s=resoult[key]+s
print(f'"{key}的概率":{resoult[key] / sum}')
strfloat[k] = round(resoult[key]/sum,5)#字符结果存入数组
k=k+1;
strArr[j]=key#字符存入数组中
j=j+1
#结果存入数组
print(type(key))
for k in range(0,26):
print(strfloat[k])
for j in range(0, 26):
print(strArr[j])
print('显示部分')
# print(s)
print("-"*50) # 分割线
# print(strArr[0])
# print(strfloat[0])
table1=PrettyTable(["符号",strArr[0],strArr[1],strArr[2],strArr[3],strArr[4],strArr[5],strArr[6],strArr[7],strArr[8]])
table1.add_row(["概率", strfloat[0],strfloat[1],strfloat[2],strfloat[3],strfloat[4],strfloat[5],strfloat[6],strfloat[7],strfloat[8]])
print(table1)
table2=PrettyTable(["符号",strArr[9],strArr[10],strArr[11],strArr[12],strArr[13],strArr[14],strArr[15],strArr[16],strArr[17]])
table2.add_row(["概率", strfloat[9],strfloat[10],strfloat[11],strfloat[12],strfloat[13],strfloat[14],strfloat[15],strfloat[16],strfloat[17]])
print(table2)
table3=PrettyTable(["符号",strArr[18],strArr[19],strArr[20],strArr[21],strArr[22],strArr[23],strArr[24],strArr[25],strArr[26]])
table3.add_row(["概率", strfloat[18],strfloat[19],strfloat[20],strfloat[21],strfloat[22],strfloat[23],strfloat[24],strfloat[25],strfloat[26]])
print(table3)
#按概率输出
print(f'"字符总个数为":{s}')
print(f'"信源的信源熵为":{Hx}')
print('按概率输出的字符串')
def number_of_certain_probability(sequence, probability):
x = random.uniform(0, 1)
cumulative_probability = 0.0
for item, item_probability in zip(sequence, probability):
cumulative_probability += item_probability
if x < cumulative_probability:
break
return item
cnt=0
value_list = [strArr[0],strArr[1],strArr[2],strArr[3],strArr[4],strArr[5],strArr[6],strArr[7],strArr[8],strArr[9],strArr[10],strArr[11],strArr[12],strArr[13],strArr[14],strArr[15],strArr[16],strArr[17],strArr[18],strArr[19],strArr[20],strArr[21],strArr[22],strArr[23],strArr[24],strArr[25],strArr[26]]
probability = [strfloat[0],strfloat[1],strfloat[2],strfloat[3],strfloat[4],strfloat[5],strfloat[6],strfloat[7],strfloat[8],strfloat[9],strfloat[10],strfloat[11],strfloat[12],strfloat[13],strfloat[14],strfloat[15],strfloat[16],strfloat[17],strfloat[18],strfloat[19],strfloat[20],strfloat[21],strfloat[22],strfloat[23],strfloat[24],strfloat[25],strfloat[26]]
for i in range(200):
_result = number_of_certain_probability(value_list, probability)
print(_result,end="")
cnt=cnt+1
if(cnt==100):#每一百个输出一行
print('\n')
end = time.perf_counter()
print('\n')
print('运行时间 : %s 秒'%(end-start))
results = list(range(10, 90))
6.参考的代码链接
https://blog.csdn.net/liulicuican/article/details/102502540
https://blog.csdn.net/liuyhoo/article/details/80756812
https://www.cnblogs.com/JIM-FAN/p/13122217.html