软件工程第二章编程题--对英文文献的检索
一、编程思路
因为初学代码,编程思路比较凌乱,通过对软件工程的学习之后,认为应该按照模块来完成此时编程,对自己的编程思路总结如下:
1、导入文献与查询文件,将其转化为字符串,然后分割成一个个句子或者单词组成的列表
2、通过列表的属性,采用循环语句对单词进行(x,y)坐标定位
3、编写查询函数,使得查询单词与文献中单词对应时输出坐标
4、编写重复函数,对查询文件中的每一个单词进行查询函数的操作
二、代码编写
1、根据上述编程思路,将代码分为四个模块逐一编写,最后将各个模块进行衔接,使得整个代码成为整体,可以运行,得到如下代码
2、写完后发现有些繁琐,通过学习正则表达式,采取了更简单的方式对文献和查询文件进行分割最终的到的程序如下:
1 # -*- coding: UTF-8 -*- 2 #_author_ = 'lixiaohua' 3 4 #打开要查询的文献,将文献中的单词转换为小写,将文献中其他符号处理为空格 5 import re 6 7 with open('literature.txt', 'r') as f: 8 string = f.read() 9 str_list = string.lower() 10 11 with open('quety.txt', 'r') as f: 12 string = f.read() 13 str_query = string.lower() 14 word_query = re.split('[^a-zA-Z]+', str_query) 15 16 #将文献处理为每个句子集合成的列表,再将句子字符串分割为单词列表 17 i = 0 18 words_sum = 0 19 while i < len(str_list): 20 if str_list[i] == '.': 21 words_sum += 1 22 i += 1 23 else: 24 i += 1 25 print('句子数:', words_sum) 26 words = str_list.split('.', words_sum) 27 28 #使用循环语句遍历遍历每个句子与单词,定位查询单词的坐标(x,y) 29 def a(word_query): 30 x = 0 31 wordquery_sum = 0 #将不存在单词的初始值设置为0,如果不存在该单词则该值不会变动 32 while x < words_sum: 33 word = re.split('[^a-zA-Z]+', words[x]) 34 y = 0 35 while y < len(word): 36 if word[y] == word_query: 37 y += 1 38 wordquery_sum = y 39 print( y, '/', x + 1) 40 else: 41 y += 1 42 x += 1 43 if wordquery_sum == 0: 44 print('None')
#编写重复函数 45 def b(word_query): 46 i = 0 47 while i < len(word_query): 48 a(word_query[i]) 49 i += 1 50 "b(word_query)"
3、下载并安装pylint工具后,利用该工具对代码进行规范检测,这其中发现了19个问题:
通过逐条修改,剩下的都是命名不规范的问题,主要还是对python语言的不熟悉,导致在变量的使用中存在不规范的问题,再以后的过程中会逐步改进:
三、对程序性能的分析
通过引入profile模块,对程序进行性能分析,最终对1000个单词文件在5M的文献中进行查询,得到的结果如下:
运行时间远远超过规定的5min,分析问题:
1、对spilit()的函数的位置进行修改,将33行的split()函数移到开头去做,避免该函数在循环中一直被调用,修改后程序运行时间略有改善。
2、采用列表对元素进行定位其实是一件效率很差的事情,如果采用dic的形式,通过key/value对元素进行定位则会使得效率大大提升,因为dic在查找元素时不会对整个内容进行遍历,但是时间有限,今后会对程序进一步的改进。
四、总结
此次编程是第一次独立完成的作业,学习软件工程后发现编程其实不是一件毫无头绪的事情,但是由于目前只掌握了最基本的编程语言,编程的质量不甚理想,还需要进一步加强对python的学习。