双字及以上搜索:快,但不够精确,比如“懿”,“瑜”,“郃(武将张郃)”的未被查找带来排序误差。
上代码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个干扰项