一个基于Python的文本处理程序
来源:互联网 发布:sha-256算法 编辑:程序博客网 时间:2024/06/05 10:19
代码思路:
1、读取 txt 文档,文件基本操作
2、遇到了 编码问题
这里用到了Unidode强制编码函数,将其转化为‘utf_8_sig’格式,经过实践证明可以。
这里说一下编码问题,Python2默认编码方式是ANSII码,遇到中文编码问题,网上解决方法如下:
(1) sys 设置 defaultencode,经过测试 python2.7版本不能用,python3.5可用
(2) 即下面代码的方法,强制编码,txt文件可在sublim/notebook转化为utf8编码的方式。
lis = unicode(lis, encoding='utf_8_sig' ) lis.encode('utf-8')
3.接下来,查找题目。
为了出题随机,我们随机提取的行数如下,其中line_start[i]为该部分最开始的行数
p=random.randint(1,50)+line_start[i]
我们暂定为 往下 15行为文本提取的内容。(为什么是15行呢, 因为最长的题目不超过15行)
这里用到了正则表达式,题目的起始符号为 “ 数字+、”。
正则表达式,这里又遇到一个坑,这个坑是什么呢?大家可以试一试,中文的标点符号正则表达匹配不出来
原因是先要把待匹配的转化为utf8字符,再进行匹配,这里”、”这个符号的UTF8编码是u3001,具体代码如下:
这里 ww.S 即 re.S , 因为 我 import re as ww, 至于为什么这样,因为遇到了我也不知道的bug,说 re 不行,那就as W喽。
lis = unicode(lis, encoding='utf_8_sig' ) lis.encode('utf-8') lis=ww.findall(u"(\d+[\u3001].*?)\d+[\u3001]",lis,ww.S)
这样我们就得到了提取到的题目
4、题目分配算法
接下来,题目有很多部分,那么怎么划分呢?
按照权重来喽,为了确保
5、出题随机算法
为了确保题目覆盖范围,足够随机,可调整。
line_end是 该部分结束的行数,p是当前行数,counts 是总题目数,time_i是当前的题目数
这里的算法思路是,整体均衡,动态调整 。
p为行数,是决定当前题目的。为了随机,我们让p+随机数。
imp=get_imp(line_end[i],p,counts[i],time_i) p=p+imp
为了均衡, imp 数学期望确保 = 总行数/题目数
那么如何动态调整呢,这里用到了梯度下降算法(这就有点装了,其实不过是一阶龙哥库塔,或者泰勒一阶展开,其实就是 y(t+Δt)=y+y(t)’*Δt,很简单。
ans=int((line_end-p)/counts
为了照顾大题少,小题多,大题靠后,这里稍微倾斜了一下。
def get_imp(line_end,p,counts,time_i): ans=int((line_end-p)/counts) if ans<3: ans=2 if 1.0*time_i/counts<0.75: imp=random.randint(1,5*ans-1) else: imp=random.randint(1,ans-1) return imp
6、保存文件
这里使用时间名字进行保存,为了避免重复。
全部代码如下:
#coding=utf8import randomimport re as wwimport sysimport timedef re(lis): try: # type(lis) lis = unicode(lis, encoding='utf_8_sig' ) lis.encode('utf-8') lis=ww.findall(u"(\d+[\u3001].*?)\d+[\u3001]",lis,ww.S) if len(lis)==0: for y in range(1,85): lis=lis+s[p+y] lis = unicode(lis, encoding='utf_8_sig' ) lis.encode('utf-8') lis=ww.findall(u"(\d+[\u3001].*?)\d+[\u3001]",lis,ww.S) lis = unicode(lis, encoding='utf_8_sig') return lis[0] except: return "You are so fine that I cannot help missing u" def search(p): m="" if 33<p<1271: m="第一章 会计管理及反洗钱类 单选题" elif 1270<p<2147: m="第一章 会计管理及反洗钱类 多选题" elif 2146<p<2595: m="第一章 会计管理及反洗钱类 判断题" elif 2594<p<3086: m="第一章 会计管理及反洗钱类 简答题" elif 3085<p<3508: m="第二章 个人金融类 单选题" elif 3507<p<3772: m="第二章 个人金融类 多选题" elif 3774<p<3881: m="第二章 个人金融类 判断题" elif 3880<p<3953: m="第二章 个人金融类 简答题" return m
def get_lines(): line_num=[3053,872,310,440,635] line_start=[0,3085,3952,4262,4701] line_end=[3086,3953,4263,4702,5333] return line_num,line_start,line_enddef get_count(n1,n2,n3,n4,n5,count): counts=[] sum_n=n1+n2+n3+n4+n5 sum_n=sum_n*1.0 counts.append(count-int(count*n2/sum_n)-int(count*n3/sum_n)-int(count*n4/sum_n)-int(count*n5/sum_n)) counts.append(int(count*n2/sum_n)) counts.append(int(count*n3/sum_n)) counts.append(int(count*n4/sum_n)) counts.append(int(count*n5/sum_n)) return countsdef xiaohua(): lisxiaohua=["Wanna to see U","You Guess~How much I miss U","我家慧慧可可爱了","I miss U ,like the sea","Sincerely,yours "] xhNum=random.randint(0,len(lisxiaohua)-1) xiaohua=lisxiaohua[xhNum]+"\n" return xiaohuadef get_imp(line_end,p,counts,time_i): ans=int((line_end-p)/counts) if ans<3: ans=2 if 1.0*time_i/counts<0.75: imp=random.randint(1,5*ans-1) else: imp=random.randint(1,ans-1) return imp
def ma(n1,n2,n3,n4,n5,count,part): str1=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) str2=str1.replace(':','_') str1="测试时间".decode('utf8')+str2+".txt" ff = open(str1,'w') ff.close() ff = open(str1,'w') counts=get_count(n1,n2,n3,n4,n5,count) unicode_str = unicode('中文', encoding='utf_8_sig' ) print unicode_str.encode('utf-8') default_encoding = 'utf8' if sys.getdefaultencoding() != default_encoding: print sys.getdefaultencoding() f=open('TIKU.txt','r') s=f.readlines() print len(s) l=1 line_num,line_start,line_end=get_lines() for i in range(0,part): time_i=0 # print "温州银行考试\n" # print "************************SECRET*************************\n" #print "第"+str(i+1)+"部分"+" 题目数量"+str(counts[i])+"\n" #print "************************SECRET*************************\n" ff.writelines("************************SECRET*************************\n") ff.writelines("第"+str(i+1)+"部分"+" 题目数量"+str(counts[i])+"\n") ff.writelines("************************SECRET*************************\n") if i == 0 : p=random.randint(28,88) else : p=random.randint(1,50)+line_start[i] lenth=line_end[i] while(p<lenth and time_i<counts[i]): lis="" q=s[p] try: for y in range(1,20): if p+y>len(s): lis = "天荒地老" else : lis=lis+s[p+y] except: lis=q m=search(p) number="\n"+"第"+str(l)+"题"+" "+m+"\n" lis=re(lis) a='' for tt in range(len(lis)): a+=str(lis[tt].encode('utf8')) # print number #print lis ff.writelines(number) ff.writelines("\n"+a+"\n") if l%3==0: if random.randint(0,10)>6: xh=xiaohua() # print xh ff.writelines(xh+"\n") if l%30==0: # print "小慧慧,休息一下啦\n" ff.writelines("小慧慧,休息一下啦\n") l=l+1 #imp=importance(n1,n2,n3,n4,count) imp=get_imp(line_end[i],p,counts[i],time_i) p=p+imp time_i=time_i+1 ff.close()def mam(p): for i in range(0,p): ma(80,40,30,15,15,100,5) time.sleep(1) print imam(10)
想她,微风吹过她的脸庞,那一抬头的温柔,如水莲花一样似水的娇羞
PS.过两天我会上传另外一个版本,是简单的数学问题。希望实现百词斩的算法。如果时间充足,搞一个基于机器学习的简单的分类器。目前计划:
0、提取题目,将题目分类。小包括数字个数,类划分使用特征词汇的方法。
1、将题目存入数据库或者列表。由于比较小,存成csv格式应该差不多足够了。
2、设置一个记录做对/错的记录列表。暂时用列表。
3、针对性对错题 在生成试卷的过程中再出现。
创作理由:本人十分喜欢的一个女孩子要面临考试,然后就遇到了一个问题,Word(200多页),然后本人就花了一会儿创作了如
下程序,可以根据txt题库,使用re表达式进行出题。里面算法较为简陋,有很大优化空间~具体优化等到假期再进行喽~
预期目标:输入txt文本文件,能够实现出题/界面程序/猿题库或者百词斩形式,假期用两三天完成吧。有愿意开发的一起哦~
邮箱:sx1995@buaa.edu.cn
- 一个基于Python的文本处理程序
- 用PHP写的一个文本处理小程序
- Perl与Python处理文本数值的一个比较
- 基于Python的文本统计
- MoinMoin是一个基于Python环境的wiki引擎程序
- 一个基于python的高速视频传输程序
- 可爱的 Python:Python 中的文本处理
- 可爱的 Python:Python中的文本处理
- 基于容器的文本操作程序
- 基于huffman编码的文本压缩程序
- 基于optics算法的文本分类程序
- 一个基于命令行的文本编辑器
- 基于swift的一个富文本编辑器
- 一个基于Win32的文本编辑器源码
- 一个python处理dos和unix格式文本的换行的问题
- 处理文本的工具程序简介
- 流行的脚本语言Python 中的文本处理
- Python中常用的文本处理操作
- signal check
- 自定义ViewGroup之TagLayout
- [Java基础] 创建一个对象数组
- 【BZOJ 1299】[LLH邀请赛]巧克力棒 博弈论
- 史上最全的微信小程序代码大全
- 一个基于Python的文本处理程序
- jzoj 4941. 【GDKOI2017模拟1.13】宝石魔术 生成函数
- C++标准模板库基础练习(必会)
- 一天一点android知识(Broadcast)
- test
- Oracle
- HDU 2710 求最大素因子
- ROI线性加权addweighted
- 数据结构线性表总章