引言
在中文自然语言处理这一领域之中, 文本分类、情感分析呀还有机器翻译等等这些比较高级的任务, 它们的基础都是中文分词。
而结巴分词也就是人们常说的jieba这一工具, 因为效率很高使用起来也很简单准确率高这些原因所以受到了广泛欢迎。本文呢是要带您深入去了解结巴分词背后的算法原理是什么样子的同时还要通过一些具体的例子来展示它是怎么被应用的。
1. 结巴分词算法概述
结巴分词, 实际上主要是用了好几种不一样的做法和策略, 这些做法和策略被组合在一起, 目的就是为了能够实现更加快速也更加精准的分词效果。
2. 前缀词典与Trie树
Trie树是种树形结构, 它的作用在于能够迅速地从字符串数据集当中去把那些键给检索出来, 而在结巴分词这个应用场景里, Trie树被用来把所有那些可能的词条前缀都给存进去这么个做法, 从而就让词典查找的这个过程的效率大大地加速了, 那么当咱们有个人输入过来了一个句子的时侯, 结巴分词方面就会对那个Trie树进行遍历这样的一个动作, 目的就是为了要找到所有的可能的前缀词, 这样做, 就是为了给后面的那一套动态规划的过程提前做好准备的这么回事儿。
图例:
root|a----b| |c d----e| | |f g h----i
这是一个被简化过的Trie树的具体例子。该示例清楚地展示了包括“abc”、“abde”和“abghi”这些具体的词语在内, 是如何实现数据存储的。
3. 利用动态规划的方法来进行求解, 目的是找出概率最大的那条路径。
把全部可能的用来作为前缀的词汇都给找到以后, 结巴这个分词工具就会采用属于动态规划范畴的那种方法, 然后, 它会依托一个所谓的语言模型去办事。比如说那个语言模型是基于频率来构建的, 接着就会去逐一计算每一条分词路径所对应的概率。
最后, 系统会从众多结果里面, 挑出那个概率数值最大的路径。把它当作最终输出的分词结果就可以了。说起来, 整个过程跟算法在隐马尔可夫模型里面的应用情况是类似的。
伪代码:
# 假设dp[i]表示前i个字符的最优分词路径的概率# words是Trie树搜索得到的所有可能词列表for i in range(len(text)):for word in words_ending_at_i:dp[i] = max(dp[i], dp[i - len(word)] * prob_of_word)
4. 未登录词识别
在词典中没有出现的词语, 也就是那些未登录的词, 结巴分词提供了好几种识别方法, 其中最常见的做法是运用一个基于HMM的模型, 这个模型通过计算字符之间的转移概率以及发射概率, 进而去预测新生成的词语, 另外一方面还可以借助统计TF-IDF的方法, 来找出那些高频出现的新词。
5. 实际应用与优化
在实际应用当中, 结巴分词是提供了丰富的接口的, 并且它还提供了参数调整选项的, 这样一来, 它就能满足不同场景的具体需求的了。例如, 用户可以通过调整词典这种方式来做优化特定领域的分词效果的, 再或者, 也可以开启新词发现功能的,这么做的话, 是能够增强对未登录词的识别能力的。
优化建议:
6. 结论
结巴分词因为在效率方面很高效, 在准确度方面很准确, 在使用难度方面很轻松明白, 所以在中文自然语言处理那个行业里边占据了一个很重要的地位。
通过深入地去理解它背后那些算法的基本原理, 我们是可以更好地去利用这一件工具的, 而且可以在实际的应用过程里不断地进行优化以及改进这个动作的。希望这本文档能够帮助到您, 让您能够更好地掌握这个叫作结巴分词的知识点, 并且在您的项目工作里头发挥出来它的最大价值。