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