2018(秋)软工作业 5:结对项目之词频统计——增强功能
一、基本信息
(1)编译环境:python3.7.1、pycharm2018
(2)结对同学:1613072013 刘赛、1613072011 蒋兆丰
(3)本次作业地址:https://edu.cnblogs.com/campus/ntu/Embedded_Application/homework/2088
(4)项目Git地址:https://gitee.com/ntucs/PairProg/tree/SE013_011
二、项目分析
1.步骤:
(1)按照作业要求将函数封装成类,以便让使用不同环境的用户(例如,命令行、Windows图形界面程序,网页程序,手机App)进行方便的调用。
import re
class WordCount():
def __init__(self, dst, m, n, o): # dst:文件路径;m:每个词组长度;n:输出的单词数量;o:设定生成文件的存储路径
self.dst = dst
self.m = m
self.n = n
self.o = o
def process_file(self): # 读取文件
d = open(self.dst, "r")
bvffer = d.read()
return bvffer
def process_rowCount(self, bvffer): # 计算文章的行数
if bvffer:
count = 1
for word in bvffer: # 开始计数
if word == '\n':
count = count + 1
return count
def process_wordNumber(self, bvffer):
if bvffer:
bvffer = bvffer.lower() # 将文本中的大写字母转换为小写
for ch in '{}!"#%()*+-,-.\/:;<=>?&@“”[]^_|':
bvffer = bvffer.replace(ch, " ") # 将文本中非法字符转化为空格
words = bvffer.split() # 用空格分割字符串
if words:
wordNew = []
words_select = '[a-z]{4}(\w)*'
for i in range(len(words)):
word = re.match(words_select, words[i]) # 如果不匹配,返回NULL类型
if word:
wordNew.append(word.group())
word_freq = {}
for word in wordNew: # 将正则匹配的结果进行统计
word_freq[word] = word_freq.get(word, 0) + 1
return wordNew, word_freq
def process_MPhrase(self, bvffer): # 查找m个单词组成的词组
if bvffer:
model = ''
for i in range(self.m):
model += '[a-z]+'
if i < self.m - 1:
model += '\s'
result = re.findall(model, bvffer) # 正则查找词组
word_freq = {}
for word in result: # 将正则匹配的结果进行统计
word_freq[word] = word_freq.get(word, 0) + 1
return word_freq
def output_result(self, word_freq):
if word_freq:
sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True)
for item in sorted_word_freq[:self.n]: # 输出前n个频率最高的单词
print('<' + str(item[0]) + '>:' + str(item[1]))
return sorted_word_freq[:self.n]
def print_result(self):
print('查询路径为:' + str(self.dst) + '的文本')
print('统计词组长度为:' + str(self.m) + '且词频前' + str(self.n) + '的单词')
bvffer = WordCount.process_file(self) # 文件读入缓冲区
lines = WordCount.process_rowCount(self, bvffer) # 计算文章的行数
wordNew, word_freq = WordCount.process_wordNumber(self, bvffer) # 筛选出符合单词标准的单词词组
sum_words = len(wordNew) # 计算出符合单词标准的单词数量
phrase_freq = WordCount.process_MPhrase(self, bvffer)
show_sum_words = 'words:' + str(sum_words)
show_lines = 'lines:' + str(lines)
print(show_sum_words) # 显示文章单词总数
print(show_lines) # 显示文章的行数
itemsWord = WordCount.output_result(self, word_freq)
itemsPhrase = WordCount.output_result(self, phrase_freq)
with open(self.o, 'w+') as w:
w.write(show_lines + '\n')
w.write(show_sum_words + '\n')
# 单词的可视化输出
for itemWord in itemsWord:
item = '<' + str(itemWord[0]) + '>:' + str(itemWord[1]) + '\n'
w.write(item)
# 词组的可视化输出
for itemPhrase in itemsPhrase:
item = '<' + str(itemPhrase[0]) + '>:' + str(itemPhrase[1]) + '\n'
w.write(item)
print('写入' + self.o + '文件已完成!')
w.close()
(2)我们现在pycharm里试验一下能否成功统计词频(文本文件使用的是同一路径下的“Gone_with_the_wind.txt”,在主函数中预设统计3个单词组成的词组和输出出现频率最高的4个单词,并将结果保存成re.txt)
if __name__ == '__main__':
obj = WordCount('src/Gone_with_the_wind.txt', 3, 4, 'src/re.txt')
obj.print_result()

(3)想要实现按照用户的要求对用户指定文本进行分析,就需要学习parserm模块中的add_agrumen函数,将你想输入的文本,要求规定到parser中,然后类似参数传递一样传递到class类中的各个函数得以实现。
def main():
parser = argparse.ArgumentParser(description="your script description") # description参数可以用于插入描述脚本用途的信息,可以为空
parser.add_argument('--i', '-i', type=str, default='src/Gone_with_the_wind.txt', help="读取文件路径")
parser.add_argument('--m', '-m', type=int, default=3, help="输出的单个词组数量")
parser.add_argument('--n', '-n', type=int, default=4, help="输出的频率前n个的单词和词组数量")
parser.add_argument('--o', '-o', type=str, default='src/result.txt', help="读取文件路径")
args = parser.parse_args() # 将变量以键-值的字典形式存入args字典
dst = args.i
m = args.m
n = args.n
o = args.o
obj =WordCount.WordCount(dst, m, n, o)
obj.print_result()
(4)在Dos命令提示符中传递参数






三、性能分析

四、PSP 表格
五、事后分析与总结
(1)针对某个问题的讨论决策过程:我们对API接口着重分析,针对API接口的实现方式进行了讨论,并决定采用刘赛同学提出的方案。
(2)评价对方:请评价一下你的合作伙伴,又哪些具体的优点和需要改进的地方。 这个部分两人都要提供自己的看法。
刘赛:刘赛同学的学习能力很快,这是一直令我敬佩的一点。面对一个全新的甚至有些棘手的问题,他能够迅速通过在线资源进行高效准确的学习。
蒋兆丰:蒋兆丰非常认真,非常负责任,对于新接触的知识,立刻会付出行动进行验证。
(3)评价整个过程:关于结对过程的建议
结对编程不仅考研了编程能力,也考验了合作能力,根据第一次分支项目合作的经验,我们很快根据双方在各方面能力上做好了任务分工。于是我们在任务的各个准备工作、安排细则都敲定之后,能很迅速地投入到工作中去。通过本次结对编程我们也充分的认识到了合作的重要性,一个人编程不免要犯这样那样的错误,结对编程就很好的避免了这样的问题。
(4)结对编程照片




浙公网安备 33010602011771号