jieba分词中文分词:源码地址:https://github.com/fxsjy/jieba
其特点:
-
支持三种分词模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
-
支持繁体分词
-
支持自定义词典
-
MIT 授权协议
jieba分词中用到的算法:
- 基于字典树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
- 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
- 对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法
一、基于字典树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
gen_pfdict加载dict.txt生成字典树,lfreq存储dict.txt每个词出现了多少次,以及每个词的所有前缀,前缀的频数置为0,ltotal是所有词出现的总次数,得到的字典树存在FREQ中。
get_DAG函数是根据FREQ对于每个句子sentence生成一个有向无环图,图信息存在字典DAG中,其中DAG[pos]是一个列表[a, b, c...],pos从0到len(sentence) - 1,表示sentence[pos : a + 1],sentence[pos, b + 1]...这些单词出现在了dict中。
def gen_pfdict(f):
lfreq = {}
ltotal = 0
#f_name = resolve_filename(f)
f_name = f.split('/')[-1]
#既遍历索引,又遍历元素,且指定起始索引为 1
#对于遍历对象是文件而言,元素为每一行的文本
with open(f,'r',encoding = 'utf-8') as fr:
for lineno, line in enumerate(fr.readlines(), 1):
try:
#print(line.strip())
line = line.stri