软工作业4:词频统计

一、基本信息

 # 编译环境:Pycharm2018、Python3.7
 # 项目名称:词频统计——基本功能(结对编程)
 # 作者: 1613072050:马钰
 #         1613072051:朱佳豪
 #         1613072052:申可佳

二、项目分析

Task1:基本任务

主要需要解决二个问题:1、统计文件的有效行数;2、统计文件的单词总数(其中特殊定义了单词的定义);3、将数据存储在文本中

1、统计文件的有效行数

lines = len(open(dst, 'r').readlines())

2、使用正则表达式统计文件的单词总数

def process_buffer(dst, phrase_words, regex):
    words = open(dst, 'r', encoding="gb2312").read()  # 文本读取
    bvffer = words.lower()  # 将文本内容都改为小写
    # 将文本中的缩写都替换
    bvffer = bvffer.replace('’t', '')
    bvffer = bvffer.replace('’m', '')
    bvffer = bvffer.replace('’s', '')
    bvffer = bvffer.replace('’ve', '')
    for i in range(len(phrase_words)):  # 将文本中的“停词”删除掉
        bvffer = bvffer.replace(' ' + phrase_words[i] + ' ', ' ')
    result = re.findall(regex, bvffer)  # 正则查找词组
    word_freq = {}
    for word in result:  # 将正则匹配的结果进行统计
        word_freq[word] = word_freq.get(word, 0) + 1
    return word_freq

  3、将数据存储在文本中

def input_result(dst, lines, words, items):  # 写入文件
    with open(dst, 'w') as w:
        w.write(lines)
        w.write(words)
        for item in items:  # 格式化
            item = '<' + str(item[0]) + '>:' + str(item[1]) + '\n'
            w.write(item)
    print('写入result文件已完成!')
    w.close()

Task2.1:支持停词

def process_buffer(bvffer, dst):
    txt_words = open(dst, 'r', encoding="iso-8859-1").readlines()  # 读取停词表文件
    stop_words = []  # 存放停词表的list
    for i in range(len(txt_words)):
        txt_words[i] = txt_words[i].replace('\n', '')
        # 写入list要将换行符取代
        stop_words.append(txt_words[i])
    if bvffer:
        word_freq = {}  # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq
        bvffer = bvffer.lower()  # 将文本内容都改为小写
        for ch in '“‘!;,.?’”':  # 除去文本中的中英文标点符号
            bvffer = bvffer.replace(ch, " ")
        words = bvffer.strip().split()
        # strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串
        for word in words:
            if word in stop_words:  # 如果word在停词表里就跳过
                continue
            else:
                word_freq[word] = word_freq.get(word, 0) + 1
        return word_freq

Task2.2:查看常用的短语

def create_stop_words(dst):  # 创建停词表
    txt_words = open(dst, encoding='gb2312').readlines()  # 文本读取
    phrase_words = []  # 存放停词表的list
    for i in range(len(txt_words)):
        txt_words[i] = txt_words[i].replace('\n', '')
        # 因为读取文本是readlines所以写入list要将换行符取代
        phrase_words.append(txt_words[i])
    return phrase_words


def process_buffer(dst, phrase_words, regex):
    words = open(dst, 'r', encoding="iso-8859-1").read()  # 文本读取
    bvffer = words.lower()  # 将文本内容都改为小写
    # 将文本中的缩写都替换(进过程序发现以下是最常见的)
    bvffer = bvffer.replace('’t', '')
    bvffer = bvffer.replace('’m', '')
    bvffer = bvffer.replace('’s', '')
    bvffer = bvffer.replace('’ve', '')
    # 其实上面的替换可以防在停词中但是涉及到空格等问题就放在前面直接替换了
    for i in range(len(phrase_words)):  # 将文本中的“停词”删除掉,这样会使结果很清晰更能接受
        bvffer = bvffer.replace(' ' + phrase_words[i] + ' ', ' ')
    result = re.findall(regex, bvffer)  # 正则查找词组
    word_freq = {}
    for word in result:  # 将正则匹配的结果进行统计
        word_freq[word] = word_freq.get(word, 0) + 1
    return word_freq

 2.2、程序运行案例截图

Task:基本任务

WordCount.py的运行结果:

Task2.1:支持停词 

Task2.2:查看常用的短语 

扫描二维码关注公众号,回复: 3659738 查看本文章

三、性能分析

Task2.2的运行时间的截图和性能表:  

四、其他

  • 结对编程时间开销:经过大概一个星期的研究、讨论。

  • 结对编程照片

五、事后分析与总结

结对编程是一个相互学习、相互磨合的渐进过程,因为三人平时关系就很不错,三人都很认真的完成本次任务,所以本次的结对编程是很愉快的。通过本次结对编程我们也充分的认识到了合作的重要性,一个人编程不免要犯这样那样的错误,结对编程就很好的避免了这样的问题,三人相互学习,相互补充。而且结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。还有就是,结对编程让有些许枯燥的编程,变得有趣。

猜你喜欢

转载自www.cnblogs.com/Zhujh233/p/9825358.html