1 下定义

词是能够独立活动的最小语言单位。 在自然语言处理中,通常都是以词作为基本单位进行处理的。由于英文本身具有天生的优势,以空格划分所有词。 而中文的词与词之间没有明显的分割标记,所以在做中文语言处理前的首要任务,就是把连续中文句子分割成「词序列」。这个分割的过程就叫分词 word segmentation。 分词又称中文分词 chinese word segmentation,通常被缩写为 cws

举个栗子🌰:

输入:词是能够独立活动的最小语言单位。

输出:词 / 是 / 能够 / 独立 / 活动 / 的 / 最小 / 语言 / 单位 / 。

2 难点

我们先来看看中文分词有那些难点,主要包括两个方面:「切分歧义识别」和「未登录词识别」。下面👇用几个具体🌰感受一下:

2.1 切分歧义识别:

  1. 交集型歧义:
    • 化妆 / 和服 / 装
    • 化妆 / 和 / 服装
  2. 组合型歧义:
    • 这个 / 门 / 把手 / 坏了
    • 请 / 把 / 手 / 拿开
  3. 真歧义:
    • 乒乓 / 球拍 / 卖 / 完 / 了
    • 乒乓球 / 拍卖 / 完 / 了

2.2 未登录词识别:

包括人名、机构名、地名、产品名、商标名、简称、省略语、新词等都是很难处理的问题。

举个🌰:「躺枪」、「洗摸杯」等。

3 中文分词技术的分类:

3.1 「基于字符匹配」 的分词方法;

又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。

  1. 正向最大匹配法(由左到右的方向);
  2. 逆向最大匹配法(由右到左的方向);
  3. 最少切分(使每一句中切出的词数最小);
  4. 双向最大匹配法(进行由左到右、由右到左两次扫描)。

3.2 「基于词频统计」的分词方法;

一般来看,上下文中相邻的字出现在一起的次数越多,那么它们越有可能是一个词。因此词与词的共现频率可以反映出成词的可能性。这种方法可以很好的处理「新词」。常见的方法有 n-gram、t-test、HMM等(这里先不做解释,后面会详细举例,挖坑)。

3.3「基于知识理解」的分词方法。

在分词的同时进行句法、语义的分析,利用句法信息和语义信息来处理歧义现象,因而具有良好的歧义切分能力,但因为要对语言自身信息进行更多的处理,因而加大了实现的难度。

4 上手试试

这里使用开源的结巴中文分词包做演示,它支持三种分词模式:

  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

使用 pip 安装模块:

pip install jieba

输入 »

# encoding=utf-8
import jieba

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))

输出 »

【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

【精确模式】: 我/ 来到/ 北京/ 清华大学

【新词识别】:他, 来到, 了, 网易, 杭研, 大厦    (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)

【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

5 公开数据集

6 相关博客