中文分词
- 中文分词:指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本。
- 中文分词算法大致分为基于词典规则与基于机器学习这两大派。
- 词典中的字符串就是词。词的性质–齐夫定律:一个单词的词频与它的词频排名成反比。
- 比如,我们希望“北京大学”成为一整个词,而不是“北京 + 大学”之类的碎片。具体来说,就是在以某个下标为起点递增查词的过程中,优先输出更长的单词,这种规则被称为最长匹配算法。从前往后匹配则称为正向最长匹配,反之则称为逆向最长匹配。
- 双向最长匹配,流程如下:同时执行正向和逆向最长匹配,若两者的词数不同,则返回词数更少的那一个。否则,返回两者中单字更少的那一个。当单字数也相同时,优先返回逆向最长匹配的结果。
- 字符串集合常用字典树(trie树、前缀树)存储,这是一种字符串上的树形数据结构。字典树中每条边都对应一个字, 从根节点往下的路径构成一个个字符串。字典树将词语视作根节点到某节点之间的一条路径,并在终点节点上做个标记。要查询一个单词,只需顺着这条路径从根节点往下走。如果能走到标记的节点,则说明该字符串在集合中,否则不存在。
- 当词典大小为 n 时,虽然最坏情况下字典树的复杂度依然是O(logn) (假设子节点用对数复杂度的数据结构存储,所有词语都是单字),但它的实际速度比二分查找快。这是因为随着路径的深入,前缀匹配是递进的过程,算法不必比较字符串的前缀。
- 基于字典树的其它算法
首字散列其余二分的字典树
双数组字典树
AC自动机(多模式匹配)
基于双数组字典树的AC自动机 - DoubleArrayTrieSegment分词器是对DAT最长匹配的封装,默认加载hanlp.properties中CoreDictionaryPath制定的词典。
from pyhanlp import *
# 不显示词性
HanLP.Config.ShowTermNature = False
# 可传入自定义字典 [dir1, dir2]
segment = DoubleArrayTrieSegment()
# 激活数字和英文识别
segment.enablePartOfSpeechTagging(True)
print(segment.seg("江西鄱阳湖干枯,中国最大淡水湖变成大草原"))
print(segment.seg("上海市虹口区大连西路550号SISU"))
输出:
[江西, 鄱阳湖, 干枯, ,, 中国, 最大, 淡水湖, 变成, 大草原]
[上海市, 虹口区, 大连, 西路, 550, 号, SISU]