自然语言处理

您所在的位置:网站首页 词典的分词方法 自然语言处理

自然语言处理

2023-01-22 12:24| 来源: 网络整理| 查看: 265

目录

一、 汉语分词介绍1

1.1 中文分词研究背景

1.2 中文分词的技术难点

1.3 中文分词的发展现状

二、 分词工具介绍

2.1 HanLP

2.2 Thulac

2.3 Jieba

三、 分词测试

3.1 数据集介绍

3.2 分词实现过程

3.3 分词量化RPF统计

四、 分词测试对比与总结

五、 附录1

5.1 成员分工

汉语分词介绍1.1 中文分词研究背景1.1.1 中文分词的含义及背景

中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。存在中文 分词技术,是由于中文在基本文法上有其特殊性,具体表现在:

以英文为代表的拉丁语系语言相比,英文以空格作为天然的分隔符,而中文由于继承自古代汉语的传统,词语之间没有分隔。古代汉语中除了连绵词和人名地名等,词通常就是单个汉字,所以当时没有分词书写的必要。而现代汉语中双字或多字词居多,一个字不再等同于一个词。在中文里,“词”和“词组”边界模糊。现代汉语的基本表达单元虽然为“词”,且以双字或者多字词居多,但由于人们认识水平的不同,对词和短语的边界很难去区分。例如:“对随地吐痰者给予处罚”,“随地吐痰者”本身是一个词还是一个短语,不同的人会有不同的标准,同样的“海上”“酒厂”等等,即使是同一个人也可能做出不同判断,如果汉语真的要分词书写,必然会出现混乱,难度很大。中文分词的方法其实不局限于中文应用,也被应用到英文处理,如手写识别,单词之间的空格就很清楚,中文分词方法可以帮助判别英文单词的边界。1.1.2 中文分词的作用

中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。中文分词对于搜索引擎来说,最重要的并不是找到所有结果,因为在上百亿的网页中找到所有结果没有太多的意义,没有人能看得完,最重要的是把最相关的结果排在最前面,这也称为相关度排序。中文分词的准确与否,常常直接影响到对搜索结果的相关度排序。从定性分析来说,搜索引擎的分词算法不同,词库的不同都会影响页面的返回结果。

1.2 中文分词的技术难点1.2.1 歧义识别

歧义是指同样的一句话,可能有两种或者更多的切分方法。主要的歧义有两种:交集型歧义和组合型歧义,例如:表面的,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面 的”和“表 面的”。这种称为交集型歧义(交叉歧义)。像这种交集型歧义十分常见,前面举的“和服”的例子,其实就是因为交集型歧义引起的错误。“化妆和服装”可以分成“化妆 和 服装”或者“化妆 和服 装”。由于没有人的知识去理解,计算机很难知道到底哪个方案正确。

交集型歧义相对组合型歧义来说是还算比较容易处理,组合型歧义就必须根据整个句子来判断了。例如,在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”就不是一个词;在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。这些词计算机又如何去识别?

如果交集型歧义和组合型歧义计算机都能解决的话,在歧义中还有一个难题,是真歧义。真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词。例如:“乒乓球拍卖完了”,可以切分成“乒乓 球拍 卖 完 了”、也可切分成“乒乓球 拍卖 完 了”,如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词。

1.2.2 未登录词

命名实体(人名、地名)、新词,专业术语称为未登录词。也就是那些在分词词典中没有收录,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解。句子“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“王军虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项既不划算又巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”还能不能算词?

除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。

1.3 中文分词的发展现状1.3.1 传统的中文分词方法

字符匹配法

最大匹配法的基本思想是先建立一个最长词条字数为6的词典, 然后取句子前6个字查词典,如查不到, 则去掉最后一个字继续查, 一直到找着一个词为止。最大匹配算法以及其改进方案是基于词典和规则的。其优点是实现简单,算法运行速度快,缺点是严重依赖词典,无法很好的处理分词歧义和未登录词。因此,如何设计专门的未登录词识别模块是该方法需要考虑的问题。常用的方法有:正向最大匹配法、逆向最大匹配法、最少切分、双向最大匹配法、复杂最大匹配法。

理解分词

理解性分词的基本思想是分词同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象,理解分词方法需要大量语言知识和信息。

统计分词方法

基于统计的中文分词方法有:隐马尔科夫模型(HMM)、最大熵马尔可夫模型(MEMM)、条件随机场(CRF)。

1.3.2 近年中文分词进展

近些年很多学者都用深度网络模型来对中文进行分词,以下就是较新分词方法的文献列表,它主要分为两类,一个是基于字符的中文分词,一类是基于词的中文分词。近些年很多学者致力于中文分词,对中文分词的方法进行了改进,其中运用到了RNN,CNN,GNN等深度神经网络来自动地获取特征,从而代替传统方法中手工定义的特征。从句子中获取简单的特征改为获取复杂的特征,从单一语料库单一标准的模型改进为可以使用多预料进行分词等等。总体可分为两类,如下:

第一类:基于字符的分词方法:根据字所在词的位置,对每个字打上标签。

第二类:基于词的分词方法。

分词工具介绍2.1 HanLPHanLP: Han Language Processing.是面向生产环境的多语种自然语言处理工具包,基于PyTorch和TensorFlow 2.x双引擎,目标是普及落地最前沿的NLP技术。HanLP具备功能完善、精度准确、性能高效、语料时新、架构清晰、可自定义的特点。借助世界上最大的多语种语料库,HanLP2.1支持包括简繁中英日俄法德在内的130种语言上的10种联合任务以及多种单任务。HanLP预训练了十几种任务上的数十个模型并且正在持续迭代语料库与模型。其功能有:分词,词性标注,命名实体识别,依存句法分析,成分句法分析,语义依存分析,语义角色标注,抽象意义表示,语义文本相似度对应的模型分别对应为:tok; pos; ner; dep; con; sdp; srl; amr; sts.量体裁衣,HanLP提供RESTful和native两种API,分别面向轻量级和海量级两种场景。无论何种API何种语言,HanLP接口在语义上保持一致。轻量级RESTful API仅数KB,适合敏捷开发、移动APP等场景。简单易用,无需GPU配环境,秒速安装。海量级native API依赖PyTorch、TensorFlow等深度学习技术,适合专业NLP工程师、研究者以及本地海量数据场景。要求Python 3.6至3.10,支持Windows,推荐*nix。可以在CPU上运行,推荐GPU/TPU。本次任务中重点关注分词功能,也就是关注其tok模型。2.2 ThulacTHULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。THULAC具有如下几个特点:能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。2.3 Jieba“结巴”(Jieba)是优秀的中文分词第三方开源库,具有很多功能,是一个强大且方便的工具包,目前已经有多种语言的实现方式。Jieba的主要功能是分词,它支持四种分词模式:精确模式,全模式,搜索引擎模式和paddle模式,其中精确模式是将句子分词切开,全模式则是寻找所有可能分词,搜索引擎模式是将精确模式结果的长词再进行切分,paddle模式是利用paddle深度学习框架进行的分词。这四种模式适用于不同的使用要求。除了分词功能,jieba还支持添加自定义字典、关键词提取、词性标注、并行分词、tokenize、Chinese Analyzer for Whoosh 搜索引擎、命令行分词等其他功能。无论是主要功能还是其他功能,jieba的使用一般只需要一个函数即可调用。操作简单,速度快,正确率高是其主要优点。Jieba分词算法主要有三点,其一是基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG),其二是采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合,其三是对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法。对于其他功能,jiaba也有采用其他算法,这里就不一一赘述。分词测试3.1 数据集介绍3.1.1 Local数据集:该数据集是老师提供的测试数据集,我们将其命名为local数据集以区别后续两个数据集,在该数据集中,包含有总计50个足球新闻领域的语料,我们还在其后添加了三句歧义较大的句子进行构建,但总体来说数据量较小。3.1.2 Pku_test数据集:PKU Test(北京大学测试数据集)是由北京大学的研究人员创建的一个中文语言测试数据集,其隶属于PKU数据集,该数据集包含有:1109947词,1826448字,是2005年由背景大学所创建的。它旨在评估自然语言处理(NLP)模型在诸如词性标注、命名实体识别和机器翻译等任务上的性能。该数据集包含大量手动注释的中文句子,以及每个任务的相应注释。注释是由该领域的专家创建的,该数据集广泛用于中文NLP研究。PKU Test通常被用作评估NLP模型在中文语言任务上的性能的基准。它是研究人员和开发人员在为中文开发NLP应用程序时的宝贵资源。3.1.3 Msr_test数据集:Microsoft Research (MSR) 中文分词数据集是一个由微软研究院收集的中文文本的集合,该文本已被标记为由单个汉字或词语组成的分词。 该数据集用于训练和评估中文分词算法的性能。数据集包含超过50万个分词,来自一系列中文新闻网站和博客的文本。每个分词都被标记为由单个汉字或词语组成,并且数据集还包括文本的元数据,例如文本来源和发布日期。MSR中文分词数据集是研究人员和开发人员在开发中文分词算法或系统时的宝贵资源。 它可以用于测试和评估分词算法的准确性和性能,并且可以帮助研究人员了解中文分词问题的复杂性和挑战。3.2 分词实现过程3.2.1 HanLp本次任务中选择安装海量级native API,使用pip install hanlp 语句安装PyTorch版。同时选择多任务模式运行,其工作流程为加载模型然后将其当作函数调用,例如下列联合多任务模型:import hanlpHanLP = hanlp.load(hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH) # 世界最大中文语料库HanLP('我爱自然语言处理!')

无论何种API何种开发语言何种自然语言,HanLP的输出统一为json格式兼容dict的Document。在上一个例子中输出结果为:

{'tok/fine': ['我', '爱', '自然', '语言', '处理', '!'], 'tok/coarse': ['我', '爱', '自然语言处理', '!'], 'pos/ctb': ['PN', 'VV', 'NN', 'NN', 'VV', 'PU'], 'pos/pku': ['r', 'v', 'n', 'n', 'v', 'w'], 'pos/863': ['r', 'v', 'a', 'n', 'v', 'w'], 'ner/msra': [], 'ner/pku': [], 'ner/ontonotes': [], 'srl': [[('我', 'ARG0', 0, 1), ('爱', 'PRED', 1, 2), ('自然语言处理', 'ARG1', 2, 5)], [('自然语言', 'ARGM-MNR', 2, 4), ('处理', 'PRED', 4, 5)]], 'dep': [(2, 'nsubj'), (0, 'root'), (4, 'nn'), (5, 'dep'), (2, 'ccomp'), (2, 'punct')], 'sdp': [[(2, 'Aft')], [(0, 'Root')], [(4, 'Desc')], [(5, 'Mann')], [(2, 'dCont')], [(2, 'mPunc')]], 'con': ['TOP', [['IP', [['NP', [['PN', ['我']]]], ['VP', [['VV', ['爱']], ['IP', [['VP', [['NP', [['NN', ['自然']], ['NN', ['语言']]]], ['VP', [['VV', ['处理']]]]]]]]]], ['PU', ['!']]]]]]}

而在实际分词测试过程中我们并不需要如此多的信息,只需要关注分词功能(tok)即可。同时注意到输出结构为python中的字典类型,而分词结果就是键'tok/fine'和'tok/coarse'的值['我', '爱', '自然', '语言', '处理', '!']和['我', '爱', '自然语言处理', '!']。因此在使用过程中使用 .setdefault(key) 即可筛选出目我们所关注的分词结果。具体操作代码如下:

import hanlpHanLP = hanlp.load(hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH) # 读入待分词文本文件 path = "待分词文本文件路径" file = open(path,encoding="utf-8") file_data = file.readlines() print("Results :\n") for sentence in file_data: dic = HanLP(sentence) res = dic.setdefault("tok/fine") #res = dic.setdefault("tok/coarse") res = '/'.join(res) print(res)

在本次任务中选择了其分词功能中的fine模式,也就是精细分词模式。使用open操作打开文件,再使用 .readlines() 逐行读出文本内容,再循环逐行进行分词任务,最后使用join()方法将分词结果以“/”连接起来。3.2.2 ThulacTHULAC需要分词和词性标注模型的支持,获取下载好的模型用户可以登录http://thulac.thunlp.org网站填写个人信息进行下载,并放到THULAC的根目录即可,或者使用参数model_path指定模型的位置。使用方式多样(以python为例):1.接口使用示例

import thulacthu1 = thulac.thulac(seg_only=True) #只进行分词,不进行词性标注,若括号内无内容,则为默认模式,进行词性标注thu1.cut_f("input.txt", "output.txt") #对input.txt文件内容进行分词,输出到output.txt

2.接口参数

thulac(user_dict=None, model_path=None, T2S=False, seg_only=False, filt=False, deli='_') 初始化程序,进行自定义设置user_dict设置用户词典,用户词典中的词会被打上uw标签。词典中每一个词一行,UTF8编码T2S默认False, 是否将句子从繁体转化为简体seg_only默认False, 时候只进行分词,不进行词性标注filt默认False, 是否使用过滤器去除一些没有意义的词语,例如“可以”。model_path设置模型文件所在文件夹,默认为models/deli默认为‘_’, 设置词与词性之间的分隔符

3.命令行运行(限pip安装使用)

python -m thulac input.txt output.txt#从input.txt读入,并将分词和词性标注结果输出到ouptut.txt中#如果只需要分词功能,可在增加参数"seg_only"python -m thulac input.txt output.txt seg_only

4.fast接口

有两个函数实现了fast接口,仅函数名改变,参数使用同普通函数cut -> fast_cut, cut_f -> fast_cut_f

3.2.3 Jieba我们的任务是对读入文本进行分词工作,因此采用的是Jieba的精确分词模式。精确分词会按照最大可能的分词组合进行分词,不会产生重复分词的问题,使用的函数为jieba.lcut(str),这个函数可以将str进行分词并返回分词列表。虽然Jieba分词可以对繁体进行分词,但是对于全角数字、字母却不可以合理分词,因此还需要将数据集由全角转换为半角。因此整个分词过程为:① 读入数据集中的一行文本② 对文本进行转换,把所有全角数字、字母转换为半角。③ 利用jieba.lcut函数分词④ 使用join方法连接分词⑤ 将结果写入新的文件具体代码如下:

import jieba files = ["local.txt", "msr.txt", "pku.txt"] def strQ2B(ustring): rstring = "" for uchar in ustring: inside_code = ord(uchar) if inside_code == 12288: # 全角空格直接转换 inside_code = 32 elif 65281

上图对不同语料库进行定量实验的整体框架流程:即对于每个数据集都要重复以上的流程框架,分别是,先从文件中按行抽取语料库句子,将用分词工具划分好的语料和正确划分的语料进行对比,分别先后计算每个句子的召回率、准确率、F1-测度,最后计算该工具在该语料库的总R、P、F值(取平均),进而将这三者写入csv文件,以便于之后进行实验结果可视化。R、P、F计算流程:R、P、F的计算公式分别如下所示:·P= 准确切分的词语数/切分出的所有词语数;·R= 准确切分的词语数/应该切分的词语数;·F=(+1)P*R/(*P+R);(这里取1,对P、R均等赋权)算法流程:

具体来说对于预测和分词语料的处理步骤是相似的,皆为先用’/’为语料进行分词,记录每个分词的起始和终止位置并且形成集合,调用len()函数分别计算两集合的分词数,即得到“切分出的所有词数”以及“应切分的词语数”,对两集合取交集再次调用len()即得到“准确切分的词语数”。带入公式得到最终计算结果。

四、分词测试对比与总结我们利用类似交叉括号数的方法进行分词结果正确率的计算。针对三个不同数据集,分别获取了每条语句的P,R,F1值,利用期望求解出整个数据集的P,R,F1值作为我们的分词结果。整体数据集的评价指标可以对整个分词工具进行评估,而每条语句的评价指标可以对数据集进行评估。结果可视化与分析如下:

从整体评价指标可以得到,在local数据集和msr数据集中,HanLP的分词指标均为最高,在pku数据集中Thulac的分词指标最高。而Jieba的分词指标在三个数据集中均为最低,可以认为jieba的分词效果不如HanLP和Thulac两个分词工具,但HanLP和Thulac的分词水平还无法区分。从单句的分析结果来看,总体上分词指标较为平稳,precision和recall的变化几乎一致,出现同增同减的情况。无论是哪种分词工具在面对不确定的数据集时都会出现分词指标波动的情况,以pku数据集为例,我们进行抽样后绘制出的图像中,Thulac和jieba甚至会出现指标为0的情况。这一方面说明pku数据集是具有较高挑战性的数据集,另一方面也说明我们的分词工具还有一定的学习和优化的空间。从local中选择分类正确率较低的第6句“一、给予辽宁队和山东队严重警告;”可以看到,这一句中的“一、”作为干扰项对分词产生了影响,所以使得分词指标在此句中有所下降。同时可以注意到在local数据集中的第51句,三个分词工具的指标数据均出现了大幅的下降。该句话为:“我也想过过过儿过过的生活。”可见,分词工具对于一些影视剧和生活中的口语化程度较高的语句分词效果不理想。此外,借助分词指标的波动情况也可以对分词工具进行比较,可以看到HanLP与Thulac的离散程度要小于Jieba,这也说明了Jieba工具在性能上是略差于HanLP和Thulac的。综上所述,我们测试了三种不同的分词工具,使用local、msr、pku三种测试语料进行研究,分词并计算P,R,F1评价指标。从结果上来看,无论是整体分词指标和单句分词指标,HanLP和Thulac的分词指标都要高于Jieba,但是这两个分词工具的指标各有优势,不能简单评价孰优孰劣。可以得出结论:HanLP和Thulac的分词水平相近而Jieba分词的分词水平则略差一些。

五、附录

5.1 成员分工



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3