软工作业4:词频统计
一、基本信息
1 # 编译环境:Pycharm2017、Python3.7 2 # 项目名称:词频统计——基本功能(结对编程) 3 # 作者:1613072041:秦伟杰 4 # 1613072042:邱财岭
二、项目分析
-
Task1:基本任务(WordCount.py -(Git上的程序名))
主要需要解决:1、统计文件的有效行数;2、统计文件的单词总数(其中特殊定义了单词的定义);3、将数据存储在文本中
1、统计文件的有效行数
1 lines = len(open(dst, 'r').readlines())
2、统计文件的单词总数
1 def process_buffer(bvffer):
2 if bvffer:
3 for ch in ':,.-_':
4 bvffer = bvffer.lower().replace(ch, " ")
5 bvffer = bvffer.strip().split()
6 word_re = "^[a-z]{4}(\w)*"
7 # 正则匹配至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写
8 words = []
9 for i in range(len(bvffer)):
10 word = re.match(word_re, bvffer[i]) # 匹配list中的元素
11 if word: # 匹配成功,加入words
12 words.append(word.group())
13 word_freq = {}
14 for word in words: # 对words进行统计
15 word_freq[word] = word_freq.get(word, 0) + 1
16 return word_freq, len(words)
3、将数据存储在文本中
1 def input_result(dst, lines, words, items): # 写入文件
2 with open(dst, 'w') as w:
3 w.write(lines)
4 w.write(words)
5 for item in items: # 格式化
6 item = '<' + str(item[0]) + '>:' + str(item[1]) + '\n'
7 w.write(item)
8 print('写入result文件已完成!')
9 w.close()
-
Task2.1:支持停词(stop_word.py)
1 def process_buffer(bvffer, dst):
2 txt_words = open(dst, 'r').readlines() # 读取停词表文件
3 stop_words = [] # 存放停词表的list
4 for i in range(len(txt_words)):
5 txt_words[i] = txt_words[i].replace('\n', '')
6 # 因为读取文本是readlines所以写入list要将换行符取代
7 stop_words.append(txt_words[i])
8 if bvffer:
9 word_freq = {} # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq
10 bvffer = bvffer.lower() # 将文本内容都改为小写
11 for ch in '“‘!;,.?’”': # 除去文本中的中英文标点符号
12 bvffer = bvffer.replace(ch, " ")
13 words = bvffer.strip().split()
14 # strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串
15 for word in words:
16 if word in stop_words: # 如果word在停词表里就跳过(本任务核心)
17 continue
18 else:
19 word_freq[word] = word_freq.get(word, 0) + 1
20 return word_freq
-
Task2.2:查看常用的短语(phrase.py)
1 # 正则表达式 2 two_phrase_re = '[a-z]+\s[a-z]+' # 匹配二个单词的短语 3 three_phrase_re = '[a-z]+\s[a-z]+\s[a-z]+' # 匹配三个单词的短语
1 def create_stop_words(dst): # 创建停词表
2 txt_words = open(dst, encoding='utf-8').readlines() # 文本读取
3 phrase_words = [] # 存放停词表的list
4 for i in range(len(txt_words)):
5 txt_words[i] = txt_words[i].replace('\n', '')
6 # 因为读取文本是readlines所以写入list要将换行符取代
7 phrase_words.append(txt_words[i])
8 return phrase_words
1 def process_buffer(dst, phrase_words, regex):
2 words = open(dst, 'r').read() # 文本读取
3 bvffer = words.lower() # 将文本内容都改为小写
4 # 将文本中的缩写都替换(进过程序发现以下是最常见的)
5 bvffer = bvffer.replace('’t', '')
6 bvffer = bvffer.replace('’m', '')
7 bvffer = bvffer.replace('’s', '')
8 bvffer = bvffer.replace('’ve', '')
9 # 其实上面的替换可以防在停词中但是涉及到空格等问题就放在前面直接替换了
10 for i in range(len(phrase_words)): # 将文本中的“停词”删除掉,这样会使结果很清晰更能接受
11 bvffer = bvffer.replace(' ' + phrase_words[i] + ' ', ' ')
12 result = re.findall(regex, bvffer) # 正则查找词组
13 word_freq = {}
14 for word in result: # 将正则匹配的结果进行统计
15 word_freq[word] = word_freq.get(word, 0) + 1
16 return word_freq
当然我们在学习的过程中还了解到了jieba、nltk。我们也尝试了用nltk库进行分词等处理。也写了个半成品,具体代码可以查看Git上的(NLTK.py)。
2.2、程序算法的时间、空间复杂度分析
此处我们以以下代码为例:
1 def process_buffer(dst, phrase_words, regex):
2 words = open(dst, 'r').read() # 文本读取
3 bvffer = words.lower() # 将文本内容都改为小写
4 # 将文本中的缩写都替换(进过程序发现以下是最常见的)
5 bvffer = bvffer.replace('’t', '')
6 bvffer = bvffer.replace('’m', '')
7 bvffer = bvffer.replace('’s', '')
8 bvffer = bvffer.replace('’ve', '')
9 # 其实上面的替换可以防在停词中但是涉及到空格等问题就放在前面直接替换了
10 for i in range(len(phrase_words)): # 将文本中的“停词”删除掉,这样会使结果很清晰更能接受
11 bvffer = bvffer.replace(' ' + phrase_words[i] + ' ', ' ')
12 result = re.findall(regex, bvffer) # 正则查找词组
13 word_freq = {}
14 for word in result: # 将正则匹配的结果进行统计
15 word_freq[word] = word_freq.get(word, 0) + 1
16 return word_freq
函数process_buffer中:时间复杂度关注二个for循环就行,假设文本中有N个单词,result中的元素个数为n,其中(N>n),所以时间复杂度为O(N+n),空间复杂度,即需要的辅助空间大小,即word_freq = {}的长度,所以空间复杂度为O(2n)。其他部分分析一样,就不多加赘述了。
2.2、程序运行案例截图
Task:基本任务
WordCount.py的运行结果:

查看常用的短语:


三、性能分析
Task2.2的运行时间的截图和性能表:

四、其他
-
结对编程时间开销:经过大概一个星期的相互学习,之后花了一个星期的时间研究讨论。
- 结对编程照片

五、事后分析与总结
结对编程是一个提升合作编程能力的过程,我和搭档秦伟杰对于python这门语言的掌握程度不熟练,在刚开始接触这一项目时有些为难,不知道从哪里下手。通过相互促进,相互合作,我俩解决了难题。这次结对让我们俩意识到了合作的重要性,成功的结对能让我们在面对困难时发挥出色,也能让编程不再那么枯燥。


浙公网安备 33010602011771号