第二节 中文分词(1 / 1)

前面已经谈到过分词的问题。因为词是表达语义的最小单位,所以几乎所有语言处理模型都是建立在识别词的基础之上的,这是自然语言处理中的一个基本问题。

英文的词之间存在天然的分界符(空格),所以只要识别分界符就可以解决大部分分词问题。这里之所以说解决的是大部分问题,是因为在手写文本识别任务中,因为存在书写不规范的问题,所以英文同样需要更高级的分词技术。更重要的,在中文、日文等词之间不存在明确分界符的语言中,准确分词是几乎所有其他自然语言处理工作的前提。接下来以中文为例介绍如何实现分词任务。

一个简单的处理分词问题的方法是建立中文词典,需要对句子进行分词时,要从词典中查询,遇到词典中存在的词汇就标识出来。这样做存在一个小问题,就是词典需要不断更新;还有一个大的问题,就是它不能很好地适应中文的复杂性。例如,“研究生命起源”,正确的分词方式是“研究/生命/起源”。但是在词典中还可以查询到“研究生”“命”,如果按照“研究生/命/起源”分词是不正确的,但是机器并不能确定使用哪种方式分词,所以如果只采用查询词典的方式分词效果不是很好。

有一些办法可以改进这些缺点。例如,很多学者在20世纪90年代以前,尝试通过建立大量的文法规则来解决问题。但是语言的复杂性决定了基于规则的方法依然不是十分成功。随着基于统计的方法开始大量应用于自然语言处理,分词问题慢慢取得了越来越好的效果。现在已经有多个效果较好的开源分词工具,如结巴分词(jieba)、盘古分词、LTP、THULAC等。下面使用在网络上抓取的新闻文本作为案例,介绍如何利用结巴分词实现文本的分词工作。相关的文本数据可以在平台下载。

首先需要安装结巴分词模块,可以在命令行窗口通过如下命令安装

pip install jieba

在工作目录中存放待分词的文本文件“text.txt”,打开这个文本文件可以看到这是一则新闻。

导入两个模块codecs和jieba。实际工作中,需要处理的文本来源不同,所使用的编码方式有可能也不相同。当需要对编码格式进行转换时,就需要用到codecs这个模块。另一个模块jieba是分词需要使用的主要工具。

In[1]:import codecs

In[2]:import jieba

指定需要进行分词的文件为“text.txt”,分词结果生成并存放在文件“textsep.txt”中。指定字符编码格式为“utf-8”,并通过readline读取文本中的第一行。

In[3]:result=codecs.open('textsep.txt','w','utf-8')

In[4]:source=codecs.open("text.txt",encoding='utf-8')

In[5]:line=source.readline()

通过循环语句逐行读取文本进行分词。通过line.rstrip('\n')去除每一行后的换行符,用jieba.cut进行分词并保存到seg_list中,参数cut_all=False表示采用精确模式进行分词,最后把所有分词结果使用空格作为分隔连接起来。打印分词结果可以看到分词基本准确,但也有一些不够准确的地方。

In[7]:while line!="":

line=line.rstrip('\n')

seg_list=jieba.cut(line,cut_all=False)

output=' '.join(list(seg_list))

print(output)

result.write(output+' ')

line=source.readline()

结巴分词还有更多的参数可以调整,读者可以逐个尝试调整参数,观察分词结果会有什么变化。