目录

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

  1. 常用的分词工具:
  • jieba分词
    在python中最好用的分词工具
  • HanLP
    Han Language Processing 汉语言处理包 HanLP 是由一系列模型与算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用。
  • 中科院计算所ICTCLAS
    free版开放了源代码,方便用户学习
  1. jieba分词工具
  • 安装
    pip install jieba
  • 匹配模式
  1. 精准模式
    试图把句子最精准的分开,适合与文本分析;
  2. 全模式
    把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  3. 搜索引擎模式
    在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • 分词相关
  1. jieba.cut()
    该函数是结巴分词常用的函数,使用该函数会把分词结果作为一个生成器返回,需要遍历生成器得到结果(这对于大文件分词十分友好),其参数内容如下:
  2. lucene和hanlp的关系 hanlp和jieba_自然语言处理

  3. 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'>
全匹配模式,结果为:   中华  中华人民  中华人民共和国  华人  人民  人民共和国  共和  共和国  万岁
精准模式模式,结果为:   中华人民共和国  万岁
搜索引擎模式,结果为:   中华  华人  人民  共和  共和国  中华人民共和国  万岁
  1. 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