分词
分词是指将由连续字符组成的语句,按照一定的规则划分成一个个独立词语的过程。不同的语言具有不同的语法结构,以常见的英文和中文举例,英文的句子中是以空格为分隔符的,所以可以指定空格为分词的标记,而中文并没有一个形式上的分界符,它只有字、句和段能通过明显的分界符来简单地划分。因此,中文分词要比英文分词困难很多。
根据中文的结构特点,可以把分词算法分为以下三类:
- 基于规则的分词方法
基于规则的分词方法,又称为机械分词方法,它是按照一定的策略将待分析的中文句子与一个“充分大的”机器词典中的词条进行匹配。如果在词典中找到了某个字或词语,则表示匹配成功。
基于规则的分词方法,其优点是简单且易于实现,缺点是匹配速度慢,而且不同的词典产生的歧义也会不同。
- 基于统计的分词方法
基于统计的分词方法,它的基本思想是常用的词语是比较稳定的组合。在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词,所以字与字相邻出现的频率能够较好地反映成词的可信度。当训练文本中相邻出现的紧密程度高于某个阈值时,便可以认为此字组可能构成了一个词。
基于统计的分词方法所应用的主要统计模型有:N 元文法模型(N-gram)、隐马尔可夫模型(Hiden Markov Model,HMM)、最大熵模型(ME)、条件随机场模型(Conditional Random Fields,CRF)等。
- 基于理解的分词方法
基于理解的分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果,它的基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。这种分词方法需要使用大量的语言知识和信息。
由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
要想在NLTK中实现对英文分词,则可以调用word_tokenize()函数基于空格或标点对文本进行分词,并返回单词列表。不过,需要先确保已经下载了punkt分词模型,否则函数是无法使用的。
比如现在有一句英文“Python is a structured and powerful object-oriented programming language.”,将这句话按空格进行划分,示例代码如下。
In [6]: # 原始英文文本
sentence = 'Python is a structured and powerful
object-oriented programming language.'
# 将句子切分为单词
words = nltk.word_tokenize(sentence)
words
Out[6]: ['Python', 'is', 'a', 'structured', 'and', 'powerful',
'object-oriented', 'programming', 'language', '.']
从输出结果中可以看出,所有以空格分隔的英文字符被划分为多个子字符串,包括标点符号,这些子串存放在一个列表中。
jieba分词是国内使用人数最多的中文分词工具,它基于中文分词的原理,提供了相应的操作模块或方法。
例如,将上述句子换成由汉字组成的字符串“传智专修学院推出颠覆式办学模式”,则可以通过jieba.cut() 函数进行划分,该函数接收如下三个参数:
(1) 需要分词的字符串。
(2) cut_all参数用来控制是否采用全模式。
(3) HMM 参数用来控制是否使用 HMM 模型。
如果将cut_all参数设为True,则表示按照全模式进行分词,若设为False,则表示的是按照精确模式进行分词,示例代码如下。
In [7]: import jieba
# 原始中文文本
sentence = '传智专修学院推出颠覆式办学模式'
# 全模式划分中文句子
terms_list = jieba.cut(sentence, cut_all=True)
print('【全模式】:'+ '/'.join(terms_list))
# 精确模式划分中文句子
terms_list = jieba.cut(sentence, cut_all=False)
print('【精确模式】:'+ '/'.join(terms_list))
打印结果为:
【全模式】:传/智/专修/修学/学院/推出/颠覆/式/办学/模式
【精确模式】:传智/专修/学院/推出/颠覆/式/办学/模式
从输出结果中可以看出,整个句子按照某种规则划分成了多个不同的字或词语,不过在全模式下,词语中出现了重复的汉字,这表明全模式会把所有可能的分词全部输出,而在准确模式下,词语中不会再出现重复的汉字,并且划分的词语相对来说是比较精准的。
注意:
如果文本中出现了一些特殊的字符,比如@、表情符号(如“:)”)等,则可以使用正则表达式进行处理。