分词是文本分析工作的第一步,分词的准确性直接影响对后续任务的表现。
1. 分词任务
根据语言特点,分词任务主要可分类两大类。一类是英文等拉丁语系文本的分词,英文单字成词,且词与词之间由空格隔开,该类任务较为简单,直接按空格分开即可。
另一类是中文文本分词,中文多字成词,且词与词之间没有明显区分标志,因此中文分词较为复杂,需借助词表和算法等工具实现分词需求。而幸运的是,目前分词技术已相对成熟,实际工作中可使用Jieba分词等开源工具直接完成分词需求。
2. 分词算法
中文分词都是基于词库匹配实现的,分词方法主要分为不考虑句子语义,直接基于词库匹配规则的分词方法,和考虑句子语义,基于概率统计的分词方法两大类。其中,按匹配规则分词常使用最大匹配算法。
而考虑语义的概率统计分词方法,要先基于词库获取所有可能的分词组合结果,然后将所有结果输入语言模型,计算出概率最大的组合作为最终的分词结果。针对分词任务实时性的需求,出于效率考虑,常用unigram语言模型 + 维特比算法快速得到考虑语义的分词结果。
(更近一步说,HMM、CRF等时间序列模型可以得到更好的概率统计分词效果,它们在成熟开源工具中被广泛使用)
2.1 最大匹配算法
最大匹配是一种基于匹配单词长度最大化的贪心算法,它分为前向最大匹配、后向最大匹配和双向最大匹配三种分词方式。
前向最大匹配算法按从前向后顺序,将文本子字符串与词库中单词进行匹配,匹配时词库单词按长度从大到小排列依次参与匹配(文本子字符串切片长度与匹配词库单词长度相同),匹配成功则将字符子串划分为一个独立的单词并继续匹配后续文本。后向最大匹配算法则是将文本按从后向前顺序完成上述过程。
小贴士:将词典中同长度单词编制成一哈希表,然后将文本子字符串进行哈希查找有无匹配项,可最大匹配算法的时间复杂度从 O ( n 2 ) O(n^2) O(n2)降低到 O ( n ) O(n) O(n)。
2.2 unigram模型 + 维特比算法
unigram模型假设词与词之间相互独立,即多个词语共同出现的概率等于它们各自单独出现的概率的乘积。
维特比算法将文本改造成一个具有n+1个节点的有向图(n等于文本字数),然后将文本中的每一个字依次放到初始节点到终止节点的连线上(每条连接仅放一个字),如下图所示。
然后连接自始向终方向的所有可能连线,每条连线所包含的单字组成此连线所代表的词,每条从始至终的路径代表一种可能的分词结果。在寻找最大概率分词结果前,还应遍历每条表所代表的词是否在词库中出现,若未在词库中出现应删除这条边。
维特比算法是一种基于贪心策略的动态规划算法,可用它找出从初始节点到终止节点的最短路径,为概率最大的分词结果。
3. 分词工具
工具名称 | 适用语言 | 项目网址 |
---|---|---|
Jieba分词 | 中文 | https://github.com/fxsjy/jieba |
SnowNLP | 中文 | https://github.com/isnowfy/snownlp |
LTP | 中文 | http://www.ltp-cloud.com/ |
HanLP | 中英日俄法德等104种语言 | https://github.com/hankcs/HanLP |