分词笔记

本文深入探讨了Python中最流行的中文分词工具——jieba的使用方法及原理,包括精准模式、全模式和搜索引擎模式的代码示例,以及如何自定义词典和调整分词效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

  1. 常用分词工具
  2. jieba分词使用
  3. 分词的原理
  4. 代码实现

  1. 常用的分词工具:
    • jieba分词
      在python中最好用的分词工具
    • HanLP
      Han Language Processing 汉语言处理包 HanLP 是由一系列模型与算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用。
    • 中科院计算所ICTCLAS
      free版开放了源代码,方便用户学习

  2. jieba分词工具
    • 安装
      pip install jieba

    • 匹配模式

      1. 精准模式
        试图把句子最精准的分开,适合与文本分析;
      2. 全模式
        把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
      3. 搜索引擎模式
        在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
    • 分词相关

      1. jieba.cut()
        该函数是结巴分词常用的函数,使用该函数会把分词结果作为一个生成器返回,需要遍历生成器得到结果(这对于大文件分词十分友好),其参数内容如下:
        jieba.cut()文档

      2. jieba.cut_for_search()
        该函数即为jieba的搜索引擎模式,同样返回的结果是一个生成器

        import jieba
        cut = jieba.cut("中华人民共和国万岁",cut_all=True)
        cut1 = jieba.cut("中华人民共和国万岁",cut_all=False) #默认为精 准模式
        cut2 = jieba.cut_for_search("中华人民共和国万岁")
        print(type(cut))
        print(type(cut2))
        print("全匹配模式,结果为:  ","  ".join(cut))
        print("精准模式模式,结果为:  ","  ".join(cut1))
        print("搜索引擎模式,结果为:  ","  ".join(cut2))
        
        <class 'generator'>
        <class 'generator'>
        全匹配模式,结果为:   中华  中华人民  中华人民共和国  华人  人民  人民共和国  共和  共和国  万岁
        精准模式模式,结果为:   中华人民共和国  万岁
        搜索引擎模式,结果为:   中华  华人  人民  共和  共和国  中华人民共和国  万岁
        
      3. jieba.lcut()和jieba.lcut_for_search()
        这两个函数分别对应jieba.cut()和jieba.cut_for_search(),不用之处在于返回的是一个列表,而不是一个生成器。

    • 字典相关

      1. 字典内容
        字典是一个txt的文件,其中一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。如下:

        王小二 5
        里小三 2 nr
        等等等 3 i
        

        代码示例:

        import jieba
        jieba.load_userdict("mydict.txt")  # 导入用户自定义词典
        jieba.add_word('我傻了')  # 动态添加自定义单词
        jieba.del_word('王小二')  # 动态删除字典```
        

  1. 分词的原理
    jieba分词原理简述
    1. 基于匹配规则的方法
      正向最大匹配、逆向最大匹配、双向最大匹配、最少词数分词
    2. 基于概率的分词方法
      LM(语言模型)、HMM(隐马尔可夫模型)、CRF(条件随机场)
    • 基于匹配的方法注意事项:
      • 使用最大匹配算法的不能够对单词进行细分,
      • 局部最优,但是对于全局不一定
      • 效率依赖于max_len,最大匹配的长度
      • 存在歧义。

  1. 代码实现(最大匹配):
      class split_word(object):
        def __init__(self):
            """
            res_list 用于保存分词的结果
            word_set 存放字典的集合
            """
            self.word_set = split_word.get_word_set()
    
        @staticmethod
        def get_word_set():
            """
            加载字典,并用set返回,用于提升查询效率
            :return:
            """
            word_set = set()
            for line in open("word_txt", "r", encoding="utf8"):
                word_set.add(line.strip())
            return word_set
    
        def max_split(self, word_):
            """
            正向最大匹配,寻找合适的词,过滤掉词典中不存在的词
            :param word_: 已经根据max_len 切分的字符串
            :return: 返回最后切分的词,到单个字也没有匹配到,则返回单个的字
            """
            if word_ in self.word_set or len(word_) == 1:
                return word_
            else:
                return self.max_split(word_[:len(word_) - 1])
    
        def split(self, string, max_len=5):
            """
            :param string: 需要切分的词
            :param max_len:  最大匹配长度
            :return: 以列表返回分词结果
            """
            res_list = []
            while True:
                if string == "":
                    break
                res = self.max_split(string[:max_len])
                if res == 1:
                    string = string[1:]
                else:
                    res_list.append(res)
                    string = string[len(res):]
            return res_list
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值