zoukankan      html  css  js  c++  java
  • Python库之jieba库

    一、jieba库概述

    jieba是优秀的中文分词第三方库

    • 中文文本需要通过分词获得单个的词语
    • jieba是优秀的中文分词第三方库,需要额外安装
    • jieba库提供三种分词模式,最简单只需要掌握一个函数

    二、jieba库安装

    cmd命令行下:
    pip install jieba
    

    三、jieba分词的原理

    jieba分词依靠中文词库

    • 利用一个中文词库,确定汉字之间的关联概率
    • 汉字间概率大的组成词组,形成分词结果

    四、jieba分词的3种模式

    • 精确模式:把文本精确地切分开,不存在冗余单词(最常用)
    • 全模式:把文本中所有可能的词语都扫描出来,有冗余
    • 搜索引擎模式:在精确模式的基础上,对长词再次切分

    五、jieba库常用函数

    | 函数 | 描述 |
    | ---- | ---- | ---- |
    | jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果 |
    | jieba.lcut(s,cut_all=True) | 全模式,返回一个列表类型的分词结果,存在冗余 |
    | jieba.lcut_for_search(s) | 搜索引擎模式,返回一个列表类型的分词结果,存在冗余 |
    | jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果 |
    | jieba.add_word(s) | 向分词词典增加新词w |

    例子:

    >>> jieba.lcut("中国是一个伟大的国家")
    ['中国', '是', '一个', '伟大', '的', '国家']
    
    >>> jieba.lcut("中国是一个伟大的国家", cut_all=True)
    ['中国', '国是', '一个', '伟大', '的', '国家']
    
    >>> jieba.lcut_for_search("中华人民共和国是伟大的")
    ['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '伟大', '的']
    
    

    六、文本词频示例

    问题分析

    代码如下:

    def getText():
        # 打开 hamlet.txt 这个文件
        txt = open("hamlet.txt", "r").read()
        # 避免大小写对词频统计的干扰,将所有单词转换为小写
        txt = txt.lower()
        # 将文中出现的所有特殊字符替换为空格
        for ch in '|"#$%^&*()_+-=\`~{}[];:<>?/':
            txt = txt.replace(ch, " ")
        # 返回一个所以后单词都是小写的,单词间以空格间隔的文本
        return txt
    
    hamletTxt = getText()
    # split() 默认使用空格作为分隔符
    words = hamletTxt.split()
    counts = {}
    for word in words:
        counts[word] = counts.get(word,0) + 1
    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))
    
    

    上面代码中的

    items.sort(key=lambda x:x[1], reverse=True)
    

    是根据单词出现的次数进行排序,其中使用了 lambda 函数。更多解释请看:
    https://www.runoob.com/python/att-list-sort.html

    下面使用 jieba 库来统计《三国演义》中任务出场的次数:

    import jieba
    txt = open("threekingdoms.txt","r",encoding="utf-8").read()
    words = jieba.lcut(txt)
    counts = {}
    for word in words:
        if len(word) == 1:
            continue
        else:
            counts[word] = counts.get(word, 0) + 1
    
    items = list(counts.items())
    items.sort(key=lambda x:x[1], reverse=True)
    for i in range(15):
        word, count = items[i]
        print("{0:<10}{1:>5}".format(word,count))
    

    运行结果:

    曹操          953
    孔明          836
    将军          772
    却说          656
    玄德          585
    关公          510
    丞相          491
    二人          469
    不可          440
    荆州          425
    玄德曰         390
    孔明曰         390
    不能          384
    如此          378
    张飞          358
    

    我们可以看到得出的结果与我们想象的有些差异,比如

    • “却说”、“二人”等与人名无关
    • “诸葛亮”、“孔明”都是同一个人
    • “孔明”和“孔明曰”分词不符合我们的需求

    所以我们需要对上面代码进行优化,在词频统计的基础上,面向问题改造我们的程序。

    下面是《三国演义》人物数量统计代码的升级版,升级版中对于某些确定不是人名的词,即使做了词频统计,也要将它删除掉。使用寄一个集合excludes来接收一些确定不是人名但是又排序比较靠前的单词列进去。

    import jieba
    txt = open("threekingdoms.txt","r",encoding="utf-8").read()
    excludes = {"将军","却说","荆州","二人","不可","不能","如此"}
    words = jieba.lcut(txt)
    counts = {}
    for word in words:
        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 == "曹操"
        else:
            rword = word
        counts[rword] = counts.get(rword, 0) + 1
    
    items = list(counts.items())
    items.sort(key=lambda x:x[1], reverse=True)
    for i in range(15):
        word, count = items[i]
        print("{0:<10}{1:>5}".format(word,count))
    
    

    运行结果:

    曹操          963
    孔明          847
    张飞          366
    商议          359
    如何          352
    主公          340
    军士          320
    吕布          303
    左右          298
    军马          297
    赵云          283
    刘备          282
    引兵          279
    次日          278
    大喜          274
    

    可以看出还是有像“商议”、“如何”等不是人物的词出现在统计结果,我们将这些词加入到 excludes 中,多次运行程序后最后得到《三国演义》任务出场顺序前20:

    七、文本词频统计问题举一反三

    应用问题扩展

    • 《红楼梦》、《西游记》、《水浒传》...等名著都可以统计它的任务出场次数
    • 政府工作报告、科研论文、新闻报道...中出现的大量的词频进行分析,进而找到每篇文章的重点内容
    • 进一步,对文本的词语或词汇绘制成词云,使其展示的效果更加直观

    以上内容资料均来源于中国大学MOOC网-北京理工大学Python语言程序设计课程
    课程地址:https://www.icourse163.org/course/BIT-268001

  • 相关阅读:
    JavaScript创建块级作用域
    JavaScript数组求最大值 面试题
    JavaScript类数组转换为数组 面试题
    JavaScript实现深拷贝(深复制) 面试题
    javascript洗牌算法 乱序算法 面试题
    3GPP 测试 /etc/udev/ruse.d/50文件 /lib/udev/ruse.d/55* 网络配置
    【网络】TCP/IP连接三次握手
    SVN 使用方法
    Git 使用方法
    LoadRunner性能测试工具
  • 原文地址:https://www.cnblogs.com/keepcode/p/14436010.html
Copyright © 2011-2022 走看看