通过python实现txt中,字母概率的计算,以及信源熵的计算,并且输出

通过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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值