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