双字及以上搜索:快,但不够精确,比如“懿”,“瑜”,“郃(武将张郃)”的未被查找带来排序误差。

上代码1:

import jieba
txt=open('threekingdoms.txt','r',encoding='utf-8').read()
words=jieba.lcut(txt)
counts={} #创建空字典
#excludes集合由多次迭代运行逐步完善至不影响前15名结果
excludes={'将军', '却说', '二人', '不可', '荆州', '不能','如此', '商议', '如何',\
         '主公', '军士', '左右','引兵','次日', '军马', '赵云', '大喜', '孙权', \
         '天下', '东吴', '于是', '今日','不敢', '魏兵', '陛下', '一人', '都督', \
         '人马', '不知','汉中', '只见', '众将', '后主','蜀兵', '上马','大叫',\
         '太守','此人','夫人', '先主', '后人', '背后', '城中', '天子', '一面',\
         '何不','大军', '忽报', '先生', '百姓', '何故', '然后', '先锋', '不如',\
         '赶来', '原来','令人', '江东', '下马', '喊声', '正是','徐州', '忽然', \
         '因此', '成都', '不见', '未知', '大败','大事', '之后', '一军', '引军',\
         '起兵', '军中', '接应', '进兵', '大惊','可以'}
for word in words:
    if len(word)==1:
        continue
    elif word =='丞相':  #这里忘记打第二个word==会出现keyerror:excludes里面的元素,————当天下午补充,丞相也有可能指后期诸葛亮
        rword='曹操'
    elif word=='玄德曰' or word == '玄德':
        rword='刘备'
    elif word=='孔明曰' or word == '诸葛亮':
        rword='孔明'
    elif word=='云长':
        rword='关公'  #出现'关羽'次数极少
    else:
        rword=word
    counts[rword]=counts.get(rword,0)+1
for word in excludes:
    del counts[word]
items=list(counts.items()) #应该是key value item
items.sort(key=lambda x:x[1],reverse=True)
print('出场次数详情(17个):')
for i in range(17):  #无限次循环直到满足条件停要用while;遍历范围用for,都不用if,if是单次用的!!!!!!!!!!
    word,count=items[i]
    print('{2}th:{0:<10}:{1:>6}'.format(word,count,i+1)) #忽略1st表达,,排名比索引+1
print('出场次数排行TOP15:')
for i in range(15):
    print(items[i][0],end=',')
print('\n双字及以上粗略迭代寻找需要手动清除{0}个干扰项'.format(len(excludes)))

输出:

出场次数详情(17个):
1th:曹操 : 1444
2th:孔明 : 1383
3th:刘备 : 1252
4th:关公 : 775
5th:张飞 : 358
6th:吕布 : 300
7th:司马懿 : 221
8th:周瑜 : 217
9th:袁绍 : 191
10th:马超 : 185
11th:魏延 : 180
12th:黄忠 : 168
13th:姜维 : 151
14th:马岱 : 127
15th:庞德 : 122
16th:孟获 : 122
17th:以为 : 121
出场次数排行TOP15:
曹操,孔明,刘备,关公,张飞,吕布,司马懿,周瑜,袁绍,马超,魏延,黄忠,姜维,马岱,庞德,孟获(并列)
双字及以上粗略迭代寻找需要手动清除78个干扰项

 

 

单字搜索:相对双字更精确,但更麻烦费时,由此可能造成更大误差,比如此程序中“诸葛亮”这一重要元素没有被迭代到造成极大误差,要想查找到需要更往后,这将消耗大量人力。但是这并不能说明精确度相对第一种差,因为在足够多的迭代次数下,这种方法无疑比第一种更精确。

上代码2:

import jieba
txt=open('threekingdoms.txt','r',encoding='utf-8').read()
words=jieba.lcut(txt)
counts={} #创建空字典
excludes={',', '。', '"', ':', '曰', '之', '、', ';', '?', '!', '也', '吾', '与', '而',\
          '将','\n', '了', '有', '在', '为', '来', '不', '我', '去', '又', '皆', '于', '人',\
          '曹', '乃','见', '矣','遂', '是','将军', '等', '今', '中', '至', '欲', '却说',\
          '此', '到','便','兵', '得', '从', '被', '杀', '汝', '已', '可', '上', '问', '走',\
          '出','言','亦','若', '以', '令', '二人', '蜀', '使',' ','不可','荆州','下', '却',\
          '后', '寨', '张', '只', '时', '死', '不能', '其', '如此', '无', '军', \
         '斩','说', '请', '一', '且', '商议', '并', '如何', '回', '主公', '他', \
          '军士', '听', '“', '事', '”','左右', '军马', '就', '即', '者', \
          '引兵', '引', '次日', '二', '大喜', '正', '诸', '则', '前', '看', \
          '你', '往', '所', '耳', '天下', '更', '耶', '东吴', '于是', '退', \
          '起', '大', '众','今日','不敢','望','魏兵', '日', '自', '毕', '臣',\
          '陛下', '尽', '一人','人马', '不知', '城', '马', '汉中', '当', '但',\
          '都', '只见', '众将', '取', '如', '帐', '待', '还', '未', '后主',\
          '云', '虽', '忽', '必', '谁', '既', '地', '投', '蜀兵', '擒', \
          '上马', '某', '大叫', '朕', '急', '入','太守', '此人', '夫人',\
          '先主', '后人','非', '背后', '城中', '守', '天子', '用', '一面',\
          '何不', '把'}
for word in words:
    if word=='操' or word=='丞相':  #这里'操刀便砍'等里面的'操'可能会涉及,\
        # 但三国多用'提刀','拔刀'等,故忽略,不忽略也没办法,因为方法没那么智能,不能因小失大
        rword='曹操'
    elif word=='玄德曰' or word=='玄德':
        rword='刘备'
    elif word=='孔明曰':
        rword='孔明'
    elif word=='云长':
        rword='关公'
    elif word=='瑜':
        rword='周瑜'
    elif word=='懿':
        rword='司马懿'
    else:
        rword=word
    counts[rword]=counts.get(rword,0)+1
for word in excludes:
    del counts[word]
items=list(counts.items()) #应该是key value item
items.sort(key=lambda x:x[1],reverse=True)
liword=[]
print('出场次数详情:')
for i in range(16):  #无限次循环直到满足条件停要用while!!!不用if,if是单次用的!!!!!!!!!!
    word,count=items[i]
    print('{2}th:{0:<10}:{1:>6}'.format(word,count,i+1))
print('出场次数排行榜TOP15:')
for i in range(15):
    print(items[i][0],end=',')
print('\n单字精确迭代寻找需要手动清除{0}个干扰项'.format(len(excludes)))

输出:

出场次数详情:
1th:曹操 : 2132
2th:刘备 : 1252
3th:孔明 : 1226
4th:关公 : 775
5th:周瑜 : 494
6th:司马懿 : 462
7th:张飞 : 358
8th:吕布 : 300
9th:赵云 : 278
10th:孙权 : 264
11th:郃 : 253
12th:都督 : 221
13th:袁绍 : 191
14th:马超 : 185
15th:魏延 : 180
16th:黄忠 : 168
出场次数排行榜TOP15:
曹操,刘备,孔明,关公,周瑜,司马懿,张飞,吕布,赵云,孙权,郃,都督,袁绍,马超,魏延,
单字精确迭代寻找需要手动清除182个干扰项