需要借助一个中文词频分析工具--jieba库。
什么是jieba库
jieba是Python中一个重要的第三方中文分词函数库
通过指令pip install jieba 安装
使用:
>>>import jieba
>>>jieba.lcut("中国是一个伟大的国家")
['中国', '是', '一个', '伟大', '的', '国家']
jieba库解析
jieba库主要提供分词功能,可以辅助自定义分词词典。
例:
实现思路
主要思路
提取文本,将文本分成若干词组,将不需要的词组删除,遍历词组统计词组出现的次数。
具体步骤
- 首先将文本读取并保存为字符串;
- 使用jieba库的lcut函数将字符串分开返回词组列表;
- 遍历词组列表计算词组出现次数将,词组及次数添加到字典中(同时需要考虑人物多称的情况)
- 需要考虑jieba库会分开的是所有词语,而不是具体的人物名称,因此需要考虑将不需要的词组排除;
- 将字典的键和值保存为列表,并按次数排序,最后输出。
代码实现
import jieba
excludes = {"将军","却说","荆州","二人","不可","不能","如此",
"商议","如何","主公","军士","左右","军马","引兵",
"次日","大喜","天下","东吴","于是","今日","不敢",
"魏兵","陛下","一人","都督","人马","不知","汉中"}#此字典用于放需要排除的非人物词语
txt = open("三国演义.txt","r",encoding='utf-8').read();
words = jieba.lcut(txt) #使用jieba库对文本进行精确分词,返回列表类型
counts = {} #使用字典保存各人物的出场次数
for word in words:
if len(word) == 1:#词长度为1的情况直接下一个词
continue
elif word == "诸葛亮" or word == "孔明曰":#修改文本中出现的人物名字,一个人物可能有多个别称
rword = "孔明"
elif word == "关公" or word == "云长":
rword = "关羽"
elif word == "玄德" or word == "玄德曰":
rword = "刘备"
elif word == "孟德" or word == "丞相":
rword = "曹操"
else:
rword = word
counts[rword] = counts.get(rword,0) + 1#将rword添加到字典中,如果不存在字典中则返回0,如果存在则在原值加1
for word in excludes:#遍历需要排除词语的字典,将其在word中删除
del(counts[word])
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))
运行结果