计算机与软件工程 作业四

送分小仙女□ 提交于 2020-04-06 12:54:17
作业要求 第四周作业
代码规范 课程目标
作业帮助 了解并遵守代码规范复审 掌握结对编程
参考文献 https://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html

作业1

每个人针对之前两次作业所写的代码,针对要求,并按照代码规范(风格规范、设计规范)要求评判其他学生的程序,同时进行代码复审(按照代码复审核表 https://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html),要求评价数目不少于8人次,
评价内容直接放在你被评价的作业后面评论中
同时另建立一个博客,将你作的评论的截图或者链接,放在博客中,并在你的博客中谈谈自己的总体看法

作业二

将程序获得的《红楼梦》与《水浒传》各个章节人物出现次数与全本人物出现总次数,通过柱状图、饼图、表格等形式展现。

新建分词词典:(省略了词频、词性)

贾珍
贾政
尤氏
珍大奶奶
尤二姐
尤三姐
惜春
四姑娘
贾蓉
可卿
秦氏
蓉大奶奶
贾母
史太君
老祖宗
老太太
鸳鸯
琥珀
傻大姐
贾赦
王夫人
金钏
宝玉
宝二爷
袭人
晴雯
麝月
秋纹
碧痕
春燕
贾琏
熙凤
凤姐
琏二奶奶
平儿
丰儿
林之孝
元春
娘娘
迎春
二姑娘
司棋
探春
三姑娘
李纨
宫裁
黛玉
林姑娘
林妹妹
雪雁
子腾
湘云
史大姑娘
翠缕
薛姨妈
姨太太
宝钗
宝姐姐
宝丫头
宝姑娘
薛蟠
金桂
宝蟾
香菱
薛蝌
岫烟
宝琴

因为需要把人物的别称替换成人物的全名,所以新建了一个字典文本,可以直接读取文本,然后用eval()函数转换成dict,转换后的dict:
{'珍大奶奶':'尤氏','惜春':'贾惜春','四姑娘':'贾惜春','秦氏':'秦可卿','可卿':'秦可卿','蓉大奶奶':'秦可卿','史太君':'贾母','老祖宗':'贾母','老太太':'贾母','宝玉':'贾宝玉','宝二爷':'贾宝玉','熙凤':'王熙凤','凤姐':'王熙凤','琏二奶奶':'王熙凤','之孝':'林之孝','元春':'贾元春','娘娘':'贾元春','二姑娘':'贾迎春','迎春':'贾迎春','探春':'贾探春','三姑娘':'贾探春','宫裁':'李纨','黛玉':'林黛玉','林姑娘':'林黛玉','林妹妹':'林黛玉','子腾':'王子腾','湘云':'史湘云','史大姑娘':'史湘云','姨太太':'薛姨妈','宝姐姐':'薛宝钗','宝丫头':'薛宝钗','宝姑娘':'薛宝钗','金桂':'夏金桂','岫烟':'邢岫烟','宝琴':'薛宝琴'}

全名为value,别称为key,为什么不反过来全名为key呢?因为全名对应了很多别称,而key不能重复,否则转换成列表时会自动删除重复。

程序源码

import jieba
from wordcloud import WordCloud

def getFile():
    f = open('D:\\Python练习\\计算机二级教材(python)\\小说txt\\红楼梦.txt','r',encoding = 'utf-8')
    txt = f.read()
    f.close()
    jieba.load_userdict('D:\\Python练习\\计算机二级教材(python)\\分词词典\\红楼梦分词.txt')
    all_words = jieba.lcut_for_search(txt)
    words = []
    for i in all_words:
        if i in keyWord():
            words.append(i)
    return words

def keyWord():
    f = open('D:\\Python\\分词词典\\红楼梦分词.txt','r',encoding = 'utf-8')
    txt = f.read()
    f.close()
    name = txt.split()
    return name

def changeWord(words):
    with open('D:\\Python\\分词词典\\红楼梦替换词典.txt','r',encoding = 'utf-8') as f:
        txt = f.read()
    word_dict = eval(txt)
    keys = []
    values = []
    for k,v in word_dict.items():
        keys.append(k)
        values.append(v)
    for i in words:
        if i in keys:
            words.append(values[keys.index(i)])
    last_word = []
    for ch in words:
        if ch not in keys:
            last_word.append(ch)
    new_words = ' '.join(last_word)
    return last_word,new_words

def wordCount(last_word):
    counts = {}
    for word in last_word:
        counts[word] = counts.get(word,0) + 1
    items = list(counts.items())
    items.sort(key = lambda x:x[1],reverse = True)
    for i in range(10):
        word,count = items[i]
        print("{0:<10}{1:>5}".format(word,count))

def wordCloud(new_words):
    fontpath = 'STHUPO.TTF'
    wc = WordCloud(font_path = fontpath,
                   width=800,
                   height=600,
                   max_words=50,
                   max_font_size=150,
                   background_color = 'white', #背景板颜色
                   collocations = False,#去除重复单词 
                   ).generate(new_words) 
    wc.to_file('D:\\Python\\红楼梦人物词云.png')  

def main():
    words = getFile()
    last_word,new_words = changeWord(words)
    wordCount(last_word)
    wordCloud(new_words)

main()

输出前10位人物和出场次数:

贾宝玉 4050
贾母 2726
王熙凤 1774
林黛玉 1579
薛宝钗 1248
袭人 1131
王夫人 1011
贾政 927
贾琏 766
平儿 683

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!