美文网首页
三国演义主要人物姓名词云

三国演义主要人物姓名词云

作者: 小伙在杭州 | 来源:发表于2019-04-09 15:26 被阅读0次
    一、大致思路

    1、引用的库:jieba,WordCloud,matplotlib
    2、先建立主要人物姓名的词典(包括人物的字),词典格式 姓名 频率 词性
    3、打开三国演义txt,输出一个只有主要人物姓名和字的列表
    4、将字转换成对应的姓名,并以字符串形式输出,空格分割:
    这一步挺绕的,因为三国里面的人物有时候称呼对方的字号,比如关羽,也被叫成关云长,云长即是他的字。但是显示的词云要求只出现一个姓名,如此的话就需要找出列表中的字,然后将字替换成对应的姓名。
    我的方法是:
    创建一个字典,key为姓名,value为字,由于人物姓名和字很多,所以以字符串形式创建,采用了特殊格式,如:'{'曹操':'孟德','赵云':'子龙'}'。采用字典格式的好处是,用eval()函数即可将str转换成dict。
    然后遍历字典,将key和value添加到各自列表中,再遍历文本分词之后的列表,找出那一个元素属于value的列表,找到后append对应的key,使用index函数。然后删除列表中所有的value。(不会直接替换,只能用这种先添加后删除的笨办法了)
    5、显示词云

    二、程序架构图
    程序结构图.png
    三、编写程序
    import jieba
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    def main():
        ls_f = getFile()
        wc_f  = changeFile(ls_f)
        wordCloud(wc_f )
    def onlyName():  #返回一个只有人物姓名和字的列表
        a = open('D:\\Python练习\\计算机二级教材(python)\\分词词典\\三国演义分词.txt','r',encoding = 'utf-8')
        b = a.read().split()
        a.close()
        name = []
        for ch in b:
            if '\u4e00' <= ch <= '\u9fff':
                name.append(ch)
        return name
    
    def getFile():  #获得一个三国演义文本,并分词。剔除除姓名以外的所有词
        a = open('D:\\Python练习\\计算机二级教材(python)\\三国演义.txt','r',encoding = 'utf-8')
        b = a.read()
        a.close()
        jieba.load_userdict('D:\\Python练习\\计算机二级教材(python)\\分词词典\\三国演义分词.txt')
        c = jieba.lcut(b,cut_all = True)
        ls_f = []
        for ch in c:
            if ch in onlyName():
                ls_f.append(ch)
        return ls_f
    
    def changeFile(ls_f):  #将列表中的人物字更换成对应的姓名
        a = open('D:\\Python练习\\计算机二级教材(python)\\分词词典\\三国演义人物字.txt','r',encoding = 'utf-8').read()
        b = eval(a)
        key_list = []
        values_list = []
        for key,values in b.items():
            key_list.append(key)
            values_list.append(values)
        for ch in ls_f:
            if ch in values_list:
                ls_f.append(key_list[values_list.index(ch)])
        f = []
        for ch in ls_f:  #去除人物字
            if ch not in values_list:
                f.append(ch)
        wc_f = ' '.join(f)
        return wc_f
    
    def wordCloud(wc_f):  #生产词云
        fontpath = 'STHUPO.TTF'
        wc = WordCloud(font_path = fontpath,
                       scale = 6, #值越大字体越清晰
                       background_color = 'white', #背景板颜色
                       random_state = 10, #随机样式,
                       collocations = False,)#去除重复单词 
        wc.generate(wc_f)  
        plt.figure(dpi=200) #通过这里可以放大或缩小
        plt.imshow(wc,interpolation='catrom',vmax=1000)
        plt.axis("off")
        plt.show()
    
    main()
    
    四、生成词云图片
    Figure_1.png

    相关文章

      网友评论

          本文标题:三国演义主要人物姓名词云

          本文链接:https://www.haomeiwen.com/subject/evxfiqtx.html