《自然语言处理技术》——实训6 中文命名实体识别.docx
《《自然语言处理技术》——实训6 中文命名实体识别.docx》由会员分享,可在线阅读,更多相关《《自然语言处理技术》——实训6 中文命名实体识别.docx(21页珍藏版)》请在三一文库上搜索。
1、目录项目2初识文本基础处理1中文命名实体识别11 实训目标12 实训环境13 实训说明14 实训步骤24.1 COrPUSPrOCeSS类实现文本预处理21 .类定义及初始化22 .语料读写操作33 .标签提取及转换44 .语料初始化55 .语料预处理66 .窗口切分87 .特征提取98 .CorPUSPrOCeSS类重要函数说明104.2 CRF_NER类实现模型训练与模型预测175 实训小结19项目2初识文本基础处理在文命名实体识别1实训目标(1) 掌握使用Sklearn-Crfsuite库进行中文命名实体识别的方法。(2) 熟悉文本预处理流程,包括类定义及初始化、语料读写操作、标签提取及
2、转换、语料初始化、语料预处理、窗口切分、特征提取。(3) 掌握模型训练与预测流程,包括初始化模型参数、定义模型、模型训练、使用模型进行预测。2实训环境环境版本说明Windows1064电脑操作系统Python3.8.5Python语言版本pandas1.3.0主要用于数据读取、清洗等操作NumPy1.21.6主要用于Python中的数值计算jieba0.42.1主要用于文本分词Gensim4.2.0主要用于检索文本、计算文本相似度、训练词向量、建模主题等Matplotlib3.3.0主要用于数据可视化PaddIePaddle2.4.2是一个深度学习框架,提供了高效的计算框架和优化算法Paddl
3、eSpeech1.2.0主要用于语音和音频中的各种关键任务的开发scikit-leam1.0.2广泛地用于统计分析和机器学习建模等数据科学领域Librosa0.8.1主要用于分析一般的音频信号,是一个非常强大的Python语音信号处理的第三方库NLTK3.5是一个常用的自然语言处理工具包,可用于文本处理、语义分析、词性标注等SciPy1.7.3是一个科学计算工具包,可用于数学、科学、工程学等领域pyttsx32.9.0主要用于将文本转换成语音3实训说明使用Skleam-CrfSUite库进行中文命名实体识别,其实现步骤包括文本预处理(类定义及初始化、语料读写操作、标签提取及转换、语料初始化、语
4、料预处理、窗口切分、特征提取)、模型训练与预测(初始化模型参数、定义模型、模型训练、使用模型进行预测)。其中,将实现文本预处理步骤的代码定义为CorpusProcess类,将实现模型训练与预测步骤的代码定义为CRF_NER类,如图3-1所示。文本预处理步骤CorPUSProCeSS类类定义及初始化语料读写操作标签提取及转换模型训练与模型预测CRF_NER类初始化模型参数定义模型语料初始化模型训练语料预处理使用模型进行预测窗口切分特征提取图3-1中文命名实体识别步骤4实训步骤4.1CorpusProcess类实现文本预处理CorpusProcess类主要实现内容包括类定义及初始化、语料读写操作、
5、标签提取及转换、语料初始化、语料预处理、窗口切分以及特征提取。1 .类定义及初始化CorPUSProCeSS类定义及初始化如代码21所示。目前,CorPUSPrOCeSS类还没有做任何实际处理,只是定义了类的结构和初始化属性。后续的方法将在这个类中实现,用于预处理语料、提取特征、切分窗口等操作。代码2-1CorpusProcess类定义及初始化fromskleam_crfsuiteimportmetricsimportjoblib#用于保存和加载模型的库importsklearn_crfsuite#CRF模型库importre#正则表达式库classCorpusProcess(Object):
6、definit_(self):初始化self.train_corpus_path=./data/1980_01rmrb.txtn#训练集语料路径self.process_corpus_path=,.dataresult-rmrb.txt#处理后的语料路径self._maps=ut,:uT,u,nr,:uPER,uns,:u,ORG,u,nt,:u,LOC#定义标记与实体类别的对应关系self.tag_seq=None2 .语料读写操作语料读写操作如代码2-2所示,包括从文件中读取语料和将处理后的语料写入文件这两部分内容。read_COrPUS_from_file函数负责读取文件并返回一个包含文
7、件所有行的列表。write_corpus_to_file函数则将处理后的数据写入指定的文件。代码2-2语料读写操作defread_corpus_from_file(self,file_path):读取语料f=open(file_path,r,encoding=,utf-8,)lines=f.readlines()f.close()returnlinesdefwrite_corpus_to_file(self,data,f!le_path):写语料f=open(file_path,wb)f.write(data)f.close()# 实例化CorpusProcess类corpus_process
8、CorpusProcessO# 读取原始语料文件input_file_path=11.datainput.txtinputjines=corpus_process.read_corpus_from_file(input_file_path)PrintC原始语料为:H,inputjines)# 将处理后的数据写入新文件output_file_path=.tmpOUtPUt.txt”corpus_process.write_corpus_to_file(data=nn,.join(inputJines).encode(utf-8,),file_path=output_file_path)运行数据
9、读取操作代码,得到文件input.txt中的语料如下。原始语料为:ufeff我爱北京天安门W:天安门上太阳升W3.标签提取及转换标签提取及转换如代码2-3所示,不仅根据词性提取对应的实体标签,还将标签转换为BIO(BeginInsideOutside)模式。POS_to_tag函数根据输入的词性P在字典中查找并返回对应的实体标签,若找不到,则返回O(表示非实体)。tag_Perform函数将标签转换为BIo模式,即在实体词组的开头添加前缀,实体词组内部的其他词添加匚前缀,非实体词保持0o代码2-3标签提取及转换#由词性提取标签defpos_to_tag(self,p):#通过self._map
10、s来获取对应的标签t=self._maps.get(p,None)returntiftelse0#标签使用Blo模式deftag_perform(self,tag,index):ifindex=0andtag!=0:# 第一个词的标签为B_TAGreturnB_),.format(tag)eliftag!=0:# 非第一个词的标签为LTAGreturn*I_,.format(tag)else:# 没有实体的标签为Oreturntag#示例句子及其词性标注sentence=”李华/nr“,“在/p“,北京/ns“,“工作/v”#将词性标注转换为实体标签entity_tags=corpus_pro
11、cess.pos_to_tag(word.split(7)1)forwordinsentencePrint(实体标签为:,entity_tags)#将实体标签转换为BIo模式bio_tags=corpus_process.tag_perfbrm(tag,index)forindex,taginenumerate(entity_tags)Print(BIO模式标签为:,bio_tags)运行标签提取与转换代码,得到实体标签以及转换后的Blo模式标签如下。实体标签为:PER,0,ORG,0BIO模式标签为:|BPER,O,L0RG0输出的实体标签PER,OJORG;Orl表示为:第一个词是人名(P
12、ER),第二个词不是实体(0),第三个词是组织名(ORG),第四个词也不是实体(O)。而BIO模式标签B_PER,y,LORGJO则表示为:第一个词是一个人名实体的开始(B_PER),第二个词不是实体(0),第三个词是一个组织名实体的内部部分(LoRG),第四个词也不是实体(0)。4.语料初始化语料初始化如代码2-4所示,首先从文件中读取语料,然后将每行语料切分成单词列表。接着,将语料按词性标注序列和单词序列分开。将词性标注转换成BIO标记,并进行拼接操作。拼接好的标记序列会被扁平化,统一放到一个列表中。最后,将单词序列加上BOS(开始标记)和Ec)S(结束标记),并进行拼接操作。代码2-4语
13、料初始化#语料初始化definitialize(self):# 从文件中读取语料lines=self.read_corpus_from_file(self.process_corpus_path)# 将每行语料切分成单词列表WOrdsist=line.strip().split(,)forlineinlinesifline.strip()# 释放内存dellines# 初始化字、词性、标签序列self.init_sequence(words_list)definit_sequence(self,words_list):# 将语料按词性标注序列和单词序列分开words_seq=word.spli
14、t(,)0forwordinwordsforwordsinwords_listpos_seq=word.split(7)lforwordinwordsforwordsinwordsjist# 将词性标注转换成BIO标记,并进行拼接操作tag_seq=self.pos_to_tag(p)forpinposforposinpos_seqself.tag_seq=self.tag_perform(tag_seqindexi,w)forwinrange(len(words_seqindexi)foriinrange(len(tag_seqindex)forindexinrange(len(tag_se
15、q)# 将拼接好的标记序列扁平化,统一放到个IiSt中self.tag_seq=tfortagintag_seqfortintagfortag_seqinself.tag_seq# 将单词序列加上BOS和EOS,并进行拼接操作self.word_seq=,+wforwordinword_seqforWinword+,forword_seqinwords_seq#窗口统一切分# 返回单词序列和标记序列returnself.word_seq,self.tag_seqline=rr爱v中国/ns”# 将语料行切分成单词列表words=line.strip().split(,)# 将单词和词性分开wo
16、rds_seq=word.split(7)0forwordinwordspos_seq=word.split(7)lforwordinwords# 将词性标注转换成BIO标记tag_seq=corpus_process.pos_to_tag(p)forpinpos_seq# 获取BIO模式标签bio_tag_seq=corpus_process.tag_perform(tag_seqi,i)foriinrange(len(tag_seq)# 添加开始和结束标记word_seq_with_bos_eos=,+words_seq+,# 输出结果Print(词序列:,words_seq)Print(
17、词性序列:,pos_seq)print(BIO标记序列:”,bio_tag_seq)Print(带有开始和结束标记的词序列:,word_seq_with_bos_eos)运行语料初始化代码,从语料行到生成各种序列的过程如下。词序列:我词性序列:,rr爱BIO标记序列:O带有开始和结束标记的词序列:1,我从语料行到生成各种序列结果可以看出,词性序列包含了一个多余的词性“爱”,正确的词性序列应该只有一个元素行1,这可能是因为分词部分的处理不够完善导致的。5 .语料预处理语料预处理如代码2-5所示。虽然代码中包含了一些未实现的预处理函数(如process、ProCeSS_nr、ProCeSS_k和q
18、to_b函数),但是该函数并未对语料产生实际影响,后续(本任务的第小节)将会对预处理函数进行介绍。Pre_ProCeSS函数读取训练集语料文件,对每一行进行处理,然后将处理后的语料写入新的语料文件。代码2-5语料预处理defprocess_t(self,words):passdefprocess_nr(self,words):passdefprocess_k(self,words):passdefq_to_b(self,q_str):passdefpre_process(self):语料预处理lines=self.read_corpus_from_file(self.train_corpus
19、path)new_lines=forlineinlines:words=self.q_to_b(line.strip().split(u)pro_words=self.process_t(words)pro_words=self.process_nr(pro_words)pro_words=self.process_k(pro_words)newjines.append(,.join(pro-words1:)self.write-corpus-to-file(data=n.join(new-lines).encode(,utf-8,),file_path=self.process_corpu
20、s_path)words=李nrJ丽nr在/p一九九七年/t二十二月此十十一日/t/与c张11三mV会面vjpro_words=corpus_process.init_sequence(words)Print(沫预处理的语料:n,words:)PrintC预处理后的语料:11pro_words:)运行语料预处理代码,得到未处理语料和预处理后的语料如下。未预处理的语料:李nr丽nr在p一九九七年t,十二月/t丁三十一日与c,张nr:三nrJ会面v7,w预处理后的语料:(,n,r,W,n,r,p,九,九七,年t,JJ十;二,,月T,VEOS,r,J三十;一1曰,f,与,c,张;n,T,三,n,r,
21、1,会,面,v,w,0,O,O,0,0,O,0,O,0,0,O,0,0,0,0,O,0,O,0,0,O,0,O,0,O,O,0,0,0,O,O,0,O,O,O,0)从预处理后的结果可以看出,未预处理的语料是一个列表,包含了一句话中每个词的词语和词性标注。预处理后的语料是一个元组,其中包含了两个列表,第一个列表是单词序列,包含了每句话中每个词的单词(没有词性标注),并且在每句话的开始和结束位置添加了特殊的词BOS和EOS第二个列表是标记序列,使用BIO标记,每个标记表示该位置上的单词是否属于一个实体。6 .窗口切分窗口切分如代码2-6所示,主要用于通过滑动窗口的方式对词序列进行切分。滑动窗口是一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自然语言处理技术 自然语言处理技术实训6 中文命名实体识别 自然语言 处理 技术 实训 中文 命名 实体 识别
