目录
- 常用分词工具
- jieba分词使用
- 分词的原理
- 代码实现
- 常用的分词工具:
- jieba分词
在python中最好用的分词工具 - HanLP
Han Language Processing 汉语言处理包 HanLP 是由一系列模型与算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用。 - 中科院计算所ICTCLAS
free版开放了源代码,方便用户学习
- jieba分词
- jieba分词工具
-
安装
pip install jieba
-
匹配模式
- 精准模式
试图把句子最精准的分开,适合与文本分析; - 全模式
把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义; - 搜索引擎模式
在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- 精准模式
-
分词相关
-
jieba.cut()
该函数是结巴分词常用的函数,使用该函数会把分词结果作为一个生成器返回,需要遍历生成器得到结果(这对于大文件分词十分友好),其参数内容如下:
-
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'> 全匹配模式,结果为: 中华 中华人民 中华人民共和国 华人 人民 人民共和国 共和 共和国 万岁 精准模式模式,结果为: 中华人民共和国 万岁 搜索引擎模式,结果为: 中华 华人 人民 共和 共和国 中华人民共和国 万岁
-
jieba.lcut()和jieba.lcut_for_search()
这两个函数分别对应jieba.cut()和jieba.cut_for_search(),不用之处在于返回的是一个列表,而不是一个生成器。
-
-
字典相关
-
字典内容
字典是一个txt的文件,其中一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。如下:王小二 5 里小三 2 nr 等等等 3 i
代码示例:
import jieba jieba.load_userdict("mydict.txt") # 导入用户自定义词典 jieba.add_word('我傻了') # 动态添加自定义单词 jieba.del_word('王小二') # 动态删除字典```
-
-
- 分词的原理
jieba分词原理简述- 基于匹配规则的方法
正向最大匹配、逆向最大匹配、双向最大匹配、最少词数分词 - 基于概率的分词方法
LM(语言模型)、HMM(隐马尔可夫模型)、CRF(条件随机场)
- 基于匹配的方法注意事项:
- 使用最大匹配算法的不能够对单词进行细分,
- 局部最优,但是对于全局不一定
- 效率依赖于max_len,最大匹配的长度
- 存在歧义。
- 基于匹配规则的方法
- 代码实现(最大匹配):
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