环境: Python3.6 + windows10
1. jieba 是Python中的优秀的中文分词第三方库
--中文文本需要通过分词获得单个的词语
2. jieba 库提供三种分词模式 ,最简单只需要掌握一个函数
3.jieba库的安装
只需要在cmd 中, pip install jieba
4.. jieba分词的原理
通过中文词库的方式来识别分词的
-- 利用一个中文词库,确定汉字之间的关联概率
-- 通过计算汉字之间的概率,汉字间概率大的组成词组,形成分词结果
-- 除了分词,用户还可以添加自定义的词组
1.jieba分词的三种模式
精确模式 : 把文本精确的切分开,不存在冗余单词 (就是切分开之后一个不剩的精确组合) 常用
全模式 : 把文本中所有可能的词语都扫描出来,有冗余
即: 可能有一个文本,可以从不同的角度来切分,变成不同的词语。在全模式下把不同的词语都挖掘出来
搜索引擎模式:在精确 模式基础上,对长词语再次切分
2. jieba库的常用函数
(1)精确模式 函数 jieba.lcut(str) 返回列表类型
import jieba """jieba.lcut(str)""" s = "中国是一个伟大的国家" print(jieba.lcut(s)) """ 输出结果: ['中国', '是', '一个', '伟大', '的', '国家'] """
(2)全模式 jieba.lcut(str,cut_all=True) 返回列表类型 ,有冗余
print(jieba.lcut(s,cut_all=True)) """输出结果:['中国', '国是', '一个', '伟大', '的', '国家']"""
(3) 搜索引擎模式: jieba.lcut_for_search(str) 返回列表类型,有冗余
先按照精确模式进行分词,然后把把比较长的词进行再次分词
s1 = "中华人民共和国是伟大的" print(jieba.lcut_for_search(s1)) ''' 输出结果 : ['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '伟大', '的'] '''
(4) jieba.add_word(str) 向分词词典添加新词 str
文本词频的统计 : 一篇文章中,出现了哪些词?哪些词出现的最多?
1. 首先是英文文本 ,对照英文的分词,进行中文分词 用到的英文文本的网站 网站的文本赋全部赋值下来,然后进行保存,: https://python123.io/resources/pye/hamlet.txt
def getText(): txt = open("E:\\\shuju\\hamelet.txt", "r").read() # 文章中的所有单词转化为小写 txt = txt.lower() # 使用空格个来替换掉所有的符号 for ch in "!\"#$%&()*+,-./:;<>=?@[\\]_'{|}~": txt = txt.replace(ch, " ") return txt def main(): hamletTxt = getText() words = hamletTxt.split() counts = {} for word in words: # 获取键对应的值,如果键不存在,给出默认值0 # 获取 每个单词出现的次数 counts[word] = counts.get(word, 0) + 1 # 把字典的键值对转化为元组,全部存放在列表里面 items = list(counts.items()) # 进行排序,按照每个元组的第二个值,即字典的值,进行降序排序 items.sort(key=lambda x:x[1],reverse=True) # 对降序排序的前10个进行处理, # 格式化输出 : word: 最低长度为10,不够补空格 counts: 最低长度为5,不够的话补空格 # print(items) for i in range(10): word,counts = items[i] print("{0:<10}{1:>5}".format(word,counts)) if __name__ == '__main__': main()
运行结果:
the 1143 and 966 to 762 of 669 i 631 you 554 a 546 my 514 hamlet 471 in 451
2.中文的文本进行分析,和英文的相比不同,中文中的有名称、词语成语等
现在只统计三国演义中的人物的出现次数,取出排行前10的人物出现的次数
中文的文本网站: 三国演义的片段文本: https://python123.io/resources/pye/threekingdoms.txt
详细看代码的注释
"""人物出场统计""" import jieba # 读取所有的文件 txt = open("E:\\shuju\\threekingdoms.txt","r",encoding="utf-8").read() # 使用jieba分词的精确模式 words = jieba.lcut(txt) counts = {} '''对进行分词的之后的结果进行处理,解决类似于孔明和诸葛亮是一个人物的问题,给其重新赋值''' for word in words: # 排除长度为1的 if len(word) == 1: continue elif word == "诸葛亮" or word == "孔明曰": rword = "孔明" 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 '''因为分词之后,可能不是人物的词要比人物的次数多, 所以进行处理,如果统计的结果里面出现了不是人物的结果, 就对其进行删除,可以先不进行处理,看看会出现哪些值, 然后把这些值放在一个集合里面,然后可以进行相应的删除 多次进行运行,然后添加之后,就可以得到想要的结果''' excludes = {"将军","却说","二人","不可","荆州","不能","如此","商议","如何","主公", "军士","左右","军马","引兵","次日","大喜","东吴","天下","于是","今日", "不敢","魏兵","陛下","不知","一人","人马","汉中","只见","众将","后主", "大叫","上马","蜀兵"} for ex in excludes: del counts[ex] # 删除不是人物的值 items = list(counts.items()) # 安装从大到小进行排序 items.sort(key=lambda x:x[1],reverse=True) # 只要前排序时候出场次数最多的前10个 for i in range(10): word,count = items[i] print("{0:<10}{1:>5}".format(word,count))
运行结果:
曹操 1451 孔明 1383 刘备 1252 关羽 784 周瑜 438 张飞 358 吕布 300 赵云 278 孙权 264 司马懿 221
3.同样的道理,我们可以进行西游记等,还有其他的中文文本的统计,
还有中文的期刊。新闻等,都是可以进行统计的。