热门推荐
65自然语言处理底层技术实现及应用--基于字典的中文分词方法
2024-11-05 16:33

中文分词就是将一个汉语句子中的词切分出来。为机器翻译、文本挖掘、情感分析等任务打好基础。你可能会好奇,为什么一定要先进行分词呢?
其实答案很简单,这就像 26 个字母一样,单个字母并不能表达某个意思,将其组合起来成为一个英文单词才有意义。
中文虽然有时候单个字也能表达具体的意思,但是往往要组成一个词才能表达一个完整的意思。例如这个字:学,如果只给你这个字,你的大脑可能啥也浮现不出现。但是当给你一个词,例如:学生、同学。不出意外的话,此时的你,大脑应该会产生对这两个词的联想。
目前,自然语言处理的计算工具主要是计算机。而计算机在识别文本信息时,也跟人一样。无法去理解字这种级别的特征,因此才需要进行分词。
分词工具
目前,常用的中文分词工具主要有:Stanford NLP、HanLP、结巴分词器 jieba 等。而在Python中常用的为 jieba 。让我们使用 jieba 来先做一个简单的例子。

65自然语言处理底层技术实现及应用--基于字典的中文分词方法

在 jieba 中,分词主要使用 方法。其接受三个输入参数,分别是:
字符串参数: 需要分词的字符串
cut_all 参数: 用来控制是否采用全模式
HMM 参数: 用来控制是否使用 HMM 模型

jieba.cut 方法中,参数 cut_all 默认的是 False,如果想要进行全模式切分,将其设置为 True。如下面实验:

从上面的实验可以看到,通过使用 jieba.cut 就可以对汉语句子进行分词。你是否跟我一样对 jieba 的工作原理充满着好奇,为什么它可以把句子的每个词准确的分开。不用着急,理解 jieba 的分词原理,一两句话是说不清楚的。接下来我们来着重讲解中文分词的原理。
当然你也可能对其工作原理不感兴趣,认为只需要会调用工具即可。但是,自然语言处理往往是一个很复杂的工作。如果你只会调用这些工具包来处理任务,那么可能你对自然语言处理的认识还停留在初级阶段。

词典为:【我,苹果,想,吃,今天,发放,可以】。
第一步:求出字典中词的最大长度 word_length。在这个例子中,最大长度的词只有两个字,因此,word_length = 2。
第二步:对句子进行切分,切分结果为:【我想|吃苹果】。
第三步:拿【我想】去和字典中的词进行匹配。
第四步:字典中没有【我想】这个词。因此将斜杠往左移动一位。此时切分结果为:【我|想吃苹果】。
第五步:拿【我】去和字典中的词进行匹配。字典中存在【我】这个词。因此得到一个切分结果【我】。
第六步:把句子中的【我】字去掉,此时的句子为:【想吃苹果】。
第七步:重复上述的过程,最后会得到的切分结果为:【我,想,吃,苹果】。

假设我们有两种切法:
【自然|语言|处理|是|人工|智能|的|一个|重要|分支】
【自然语言处理|是|人工智能|的|一个|重要|分支】

很显然,第二种切法,把【自然语言处理】和【人工智能】看做是一个词要更准确些,也更符合人对句子的理解。

前面主要讲述了基于字典的分词方法。为了更直观的理解,我们现在使用正向最大匹配法来构建一个分词器。正向最大匹配法的实现代码如下:

构建好分词器之后,我们现在创建一个字典来测试。

构建好分词器和字典之后,使用几个句子来进行测试。

从上面的实验结果可以看到,句子分词成功。你或许会有疑问,要是字典里一个对应的词也没有怎么办?我们现在就试一试。

也许正如你所想的一样,如果字典里一个对应的词都没有,则切分的最终结果会把每个字都切成一个词。这也是基于字典的切分方法的弊端。一般情况下,这种字典不包含的词被称作 未登录词 。关于未登录词的解决方法我们会在下一个实验中讲到。现在我们来测试一下基于正向最大匹配法的分词器性能如何。
这里我们使用北京大学计算语言学研究所提供的中文分词数据集,该数据将搜集的语料是 1998 年人民日报上的文本文字。该数据集可以在 Bakeoff 中下载。
在本次实验中,我们已经将数据存在了服务器中,通过执行下面代码下载到当前目录。

下载完成之后,就可以导入数据集。

查看出前六个句子,并打印出数据集的长度。

从上面结果可以看到,该数据集使用空格来将词与词之间区分开。并且总共包含 19056 份数据。该数据集里的每一份数据为一个段落。而分词器的输入为句子。因此将数据集切分成句子的形式。

从上面的打印结果,可以看出总共含有 54660 个句子。接下来使用该数据集构建一个词典,并划分一部分数据用于测试。

查看一下,我们的测试数据是什么样子的。

查看一下,测试数据对应数据集中所标注的分词结果。

下面使用我们前所构建的分词器来进行分词,并求出分词的准确率。注意:这里运行大概要 5 分钟,请耐心等待。

从上面的实验结果可知,分词的准确率约为 85% 左右。这个结果虽然并不算太理想,但也算还可以。下面我们打印出分词结果与数据集的标注结果,进行对比。

从上的结果可以看出,我们所构建的基于正向最大匹配的分词器,虽然简单,但分词效果还是很显著的,这也是许多分词器仍然使用这种古老方法的原因,因为我们只需要维护字典就可以。
下面我们使用 jieba 来对同样的数据进行切分,并计算出切分的准确率。

使用同样的方法,打印出 jieba 分词的结果。

有点意外,jieba 要比我们所构建的分词器要差一点,可能的原因是我们的字典和测试数据属于同一领域的数据,而 jieba 的字典数据则是常用的词数据,因为不同领域的知识通常有差异,常用的词语也不同。例如用医学、金融、法律等文本来测试我们所构建的分词器,效果应该会大打折扣。如下:

还有就是切词标准的差异。例如:在我们所使用的的数据中,姓名会切分成 “姓” 和 “名”,而 jieba 则不切分。如下:

但是 jieba 的速度要快许多,当然,这是其内部做了许多的优化。而我们只是搭建了一个简单的分词器,速度没有 jieba 快也是理所当然的,不要灰心。

在上一个实验中,我们讲解了中文分词的基本方法,并实现了正向最大匹配法。而本次挑战要求实现逆向最大匹配法。其实逆向最大匹配法与正向最大匹配法很相似。正向最大匹配法是从正向开始匹配,而逆向最大匹配法则是从反向开始匹配。两者的差别仅此而已。如果你对正向最大匹配法还不熟悉则可以再去看上一个实验的内容。下面我们再简单讲解一下逆向最大匹配法的流程。

假设我们有要分的句子为【去成都看大熊猫】,词典为【大熊猫,成都】。则切分过程如下:
切分第一个词:输入句子为【去成都看大熊猫】,从句子中取出后边的三个字(因为字典中词的最大长度为 3),开始匹配:
大熊猫
匹配成功,句子变为【去成都看】 。

切分第二个词:输入句子为【去成都看】,从句子中取出后边的三个字,开始匹配:
成都看
都看

单字为词,句子变为【去成都】 。

切分第三个词:输入句子为【去成都】,从句子中取出后边的三个字,开始匹配:
去成都
成都
匹配成功,句子变为【去】 。

切分第四个词:输入句子为【去】,从句子中取出后边的三个字,开始匹配:

单字成词,切分完毕 。
最后切分的结果为【去,成都,看,大熊猫】

    以上就是本篇文章【65自然语言处理底层技术实现及应用--基于字典的中文分词方法】的全部内容了,欢迎阅览 ! 文章地址:http://lianchengexpo.xrbh.cn/quote/13658.html 
     行业      资讯      企业新闻      行情      企业黄页      同类资讯      网站地图      返回首页 迅博思语资讯移动站 http://lianchengexpo.xrbh.cn/mobile/ , 查看更多