分词作为NLP的一项基本任务,其算法和原理的相关研究,在之前的文章(https://blog.csdn.net/weixin_44526949/article/details/98063167)中已经做了基本介绍。目前,分词技术也非常的成熟,而且研究人员也开发了很多软件包,这些软件包在项目中的使用效果也非常的好。本期对于分词,进行一次实战练习,来加强对分词算法的理解,主要是一些软件包的使用,随着技术的成熟,很多算法被封装成了软件包,这使得开发变得更加高效。
jieba分词软件作为国内使用比较多的工具,其是通过python开发的,而且,源码也比较简单,清晰易读,关于jieba源码分析,请参见该项目。jieba分词支持三种分词模式:精确模式、全模式、搜索引擎模式。对于精确模式,其目的是将句子最精确的分开,适合文本分析,一般,也是分词任务最常用的模式;全模式尽可能地把能够分成词的词语切分出来,但是,无法解决歧义;搜索引擎模式,是在精确模式的基础上,再对词进行细分。下面进行一些实战演练:
安装jieba非常简单,输入pip install jieba即可。
import jieba
sent1 = "机器学习是最有趣的研究领域之一"
sent2 = "自然语言处理是人工智能领域皇冠上的明珠"
sent3 = "AI是计算机科学最激动人心的领域"
sent4 = "为什么机器翻译是自然语言处理最具挑战性的领域?被誉为NLP领域的明珠"
print("sent1: ")
result_sent1_full_mode = jieba.cut(sent1, cut_all = True) # 全模式
result_sent1_acc_mode = jieba.cut(sent1) # 默认是精确模式
result_sent1_search_mode = jieba.cut_for_search(sent1) # 搜索引擎模式
print("全模式:"+"/".join(result_sent1_full_mode))
print("精确模式:"+"/".join(result_sent1_acc_mode))
print("搜索引擎模式:"+"/".join(result_sent1_search_mode))
print("="*10)
print("sent2: ")
result_sent2_full_mode = jieba.cut(sent2, cut_all = True)
result_sent2_acc_mode = jieba.cut(sent2)
result_sent2_search_mode = jieba.cut_for_search(sent2)
print("全模式:"+"/".join(result_sent2_full_mode))
print("精确模式:"+"/".join(result_sent2_acc_mode))
print("搜索引擎模式:"+"/".join(result_sent2_search_mode))
print("="*10)
print("sent3: ")
result_sent3_full_mode = jieba.cut(sent3, cut_all = True)
result_sent3_acc_mode = jieba.cut(sent3)
result_sent3_search_mode = jieba.cut_for_search(sent3)
print("全模式:"+"/".join(result_sent3_full_mode))
print("精确模式:"+"/".join(result_sent3_acc_mode))
print("搜索引擎模式:"+"/".join(result_sent3_search_mode))
print("="*10)
print("sent4: ")
result_sent4_full_mode = jieba.cut(sent4, cut_all = True)
result_sent4_acc_mode = jieba.cut(sent4)
result_sent4_search_mode = jieba.cut_for_search(sent4)
print("全模式:"+"/".join(result_sent4_full_mode))
print("精确模式:"+"/".join(result_sent4_acc_mode))
print("搜索引擎模式:"+"/".join(result_sent4_search_mode))
print("="*10)
对于以上4个句子,进行了三种模式的分词,最终结果如下:
可以看到分词效果还不错,将一些命名实体,比如NLP、AI也正确进行了切分。接下来介绍另外一种自然语言处理软件包,SnowNLP。
snownlp是一个用python开发的软件包,可以很方便的处理中文文本内容。安装也非常方便,在终端输入pip install snownlp即可完成安装。以下是使用snownlp来进行分词的一些代码。
from snownlp import SnowNLP
result_sent1_snownlp = SnowNLP(sent1)
result_sent2_snownlp = SnowNLP(sent2)
result_sent3_snownlp = SnowNLP(sent3)
result_sent4_snownlp = SnowNLP(sent4)
print("对于sent1,snownlp分词结果:"+str(result_sent1_snownlp.words))
print("对于sent2,snownlp分词结果:"+str(result_sent2_snownlp.words))
print("对于sent3,snownlp分词结果:"+str(result_sent3_snownlp.words))
print("对于sent4,snownlp分词结果:"+str(result_sent4_snownlp.words))
可以看到分词效果还可以,虽然没有jieba的丰富,但是,足以满足要求了。
接下来,介绍thulac软件包,THULAC(全称THU Lexical Analyzer for Chinese)是由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。该软件包在标准的数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,每秒可处理约15万字,分词速度可达到1.3MB/s。安装和普通的包安装类似,在终端输入pip install thulac即可。下面来进行实战演练。
import thulac
model = thulac.thulac(seg_only = True) # 定义模型,默认情况下,不仅会进行分词,而且还会进行词性标注,这里只分词
result_sent1_thulac = model.cut(sent1)
result_sent2_thulac = model.cut(sent2)
result_sent3_thulac = model.cut(sent3)
result_sent4_thulac = model.cut(sent4)
print("sent1: "+str(result_sent1_thulac))
print("sent2: "+str(result_sent2_thulac))
print("sent3: "+str(result_sent3_thulac))
print("sent4: "+str(result_sent4_thulac))
分词结果如下:
可以发现,在对第四句进行分词时,有些瑕疵,“为什么”这个词没有被分好,不过整体还不错。
接下来,引入下一个软件,NLPIR是自然语言处理中的一个大数据语义智能分析平台,由北京理工大学张华平博士主导开发的一项产品,该平台具有13大功能,包括数据的精准采集、文档抽取、新词发现、批量分词、语言统计、文本聚类、摘要实体、智能过滤、情感分析、文档去重、全文检索、编码转换等。安装也非常简单,在终端使用命令:pip install pynlpir即可。刚下载完之后,在使用的时候可能会出现错误,比如:可能终端会发出证书过期信息,不过会给出更新命令,在终端输入如下命令即可:
即可解决错误问题。
接下来,使用该软件包来完成相应的分词任务,代码如下:
import pynlpir
pynlpir.open() # 打开分词模型
result_sent1_nlpir = pynlpir.segment(sent1)
result_sent2_nlpir = pynlpir.segment(sent2)
result_sent3_nlpir = pynlpir.segment(sent3)
result_sent4_nlpir = pynlpir.segment(sent4)
print("sent1: "+str(result_sent1_nlpir))
print("sent2: "+str(result_sent2_nlpir))
print("sent3: "+str(result_sent3_nlpir))
print("sent4: "+str(result_sent4_nlpir))
运行后,结果如下:
可以看到,该工具分完词之后,并且会自动标注每一个词的词性,而且,词性标注,均使用英文单词,这非常符合我们的阅读习惯,我在第一次使用时,就被深深的吸引住了,这相比一些与其他软件的标注结果,比如nltk,要更加人性化,即使不查找词性的专用信息表,也能理解其标注结果。而且,从上面的标注结果,也能看到,正确率特别高。
接下来,介绍最后一款nlp软件包——HanLP,HanLP是一系列模型与算法组成的NLP工具包,并且完全开源,目标是普及自然语言处理在生产环境中的应用。安装也非常简单,在终端使用命令:pip install pyhanlp即可,但是下载完之后,在刚开始使用时,可能会出现下面的错误:
解决方法,这个可能有点麻烦,我在配置时遇到各种问题,最后参照这篇博客解决的(博客)。
下面进入该软件的实战环节,仍然只使用分词功能,因为本期着重强调分词,代码如下:
from pyhanlp import *
result_sent1_hanlp = HanLP.segment(sent1)
result_sent2_hanlp = HanLP.segment(sent2)
result_sent3_hanlp = HanLP.segment(sent3)
result_sent4_hanlp = HanLP.segment(sent4)
print("sent1: "+str(result_sent1_hanlp))
print("sent2: "+str(result_sent2_hanlp))
print("sent3: "+str(result_sent3_hanlp))
print("sent4: "+str(result_sent4_hanlp))
最终的分词结果如下所示:
可以看到,与NLPIR相比,在词性标注方面,不是非常的人性化,需要查看特定的HanLP词性标注文档,才能理解每一个标注的含义,而且,貌似这种分词更具有学术性,比如“机器翻译”和“自然语言处理”会当成一个整体来处理,这与前面的软件有所差异,更加具有“短语色彩”。
通过比较,各个软件包在分词方面,差异较小,分词结果基本都可以接受,不过小编觉得HanLP的配置稍微麻烦点,希望在NLP领域,本文能够给大家带来帮助。