Python人工智能编程基础(微课版)课件 项目16 自然语言处理入门_第1页
Python人工智能编程基础(微课版)课件 项目16 自然语言处理入门_第2页
Python人工智能编程基础(微课版)课件 项目16 自然语言处理入门_第3页
Python人工智能编程基础(微课版)课件 项目16 自然语言处理入门_第4页
Python人工智能编程基础(微课版)课件 项目16 自然语言处理入门_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python人工智能编程基础项目16自然语言处理入门主讲教师:XXX课前导入小曹是一个热爱阅读的年轻人,他特别喜欢看小说。每当有空闲时间,他都会拿起一本小说,沉浸在故事的世界里。然而,小曹不仅仅满足于阅读小说,他还希望从中发现一些有趣的规律和信息。为了实现这个目标,小曹开始学习自然语言处理(NLP)技术。通过使用Python编程语言和NaturalLanguageToolkit(NLTK)库,小曹可以对小说中的文本进行分析,从而发现一些有趣的故事元素。重难点重点:难点:数据分析、NLTK库、机器学习算法调用NLTK库调用原理、实验结果可视化分析CONTENTS《中国工农红军长征纪实》语料库分析《三国演义》字符过滤分析基于HMM中文词分析基于朴素贝叶斯情感分析目录CONTENTS01020304parTONE《中国工农红军长征纪实》语料库分析01知识储备:语料库读取1

语料通常指在统计自然语言处理中实际上不可能观测到大规模的语言实例。所以人们简单地用文本作为替代,并把文本中的上下文关系作为现实世界中语言的上下文关系的替代品。语料库一词在语言学上意指大量的文本,通常经过整理,具有既定格式与标记。其具备三个显著的特点:语料库中存放的是在语言的实际使用中真实出现过的语言材料。语料库以电子计算机为载体承载语言知识的基础资源,但并不等于语言知识。真实语料需要经过加工(分析和处理),才能成为有用的资源。

在NaturalLanguageToolkit(NLTK)库中,使用PlaintextCorpusReader函数实现对语料库的读取,可以实现各种文本格式的读取,该函数的具体形式为:

fromnltk.corpusimportPlaintextCorpusReader

fileids():该方法返回语料库中的文本标识列表

words(fileids):该方法接受一个或多个文本标识作为参数,返回文本单词列表

raw(fileids):该方法接受一个或多个文本标识为参数,返回文本原始字符串

sents(fileids):该方法接受一个或多个文本标识为参数,返回文本中的句子列表知识储备:词频率分布

1

在NLTK中,若要显示文本中每个出现的标识符的频率分布,使用FreqDist函数实现文本数字统计,该函数的具体形式为:fdist=nltk.FreqDist(file)

File:该方法返回语料库中的文本词的统计次数知识储备:了解NLTK基本操作函数1

NLTK(自然语言处理工具包)是一个开源的计算机程序包,其中包含了许多用于自然语言处理的函数。

concordance():用于搜索文章中指定单词在文章中出现的位置,并显示上下文。

similar():用于搜索文章中与目标用法、意义相似的词。

common_contexts(["",""]):用于搜索两个或多个单词共同的上下文。

generate():用于自动生成文章,其中输出时,标点符号被从前面的词分裂出去。

tokenize(text):用于将文本分割成单词。

phoneme_convert(text):用于将单词转换为语音。

download(url):用于下载URL对应的数据。

ne_word2vec(text,size,window_size,min_count,max_count,seed):用于训练一个word2vec模型。

download(url,outfile):用于将数据下载到指定的文件中。preprocess(text):用于对文本进行预处理,如去除停用词、标点符号等。知识储备:了解NLTK基本操作函数1

clean_text(text):用于清除文本中的标点符号、空格等。

download(url,savefile):用于将数据下载到指定的文件中,并将文件保存为新文件。

download_30days(url,savefile):用于下载指定URL中的所有数据,并将其保存为新文件。

download_all(url,savefile):用于下载指定URL中的所有数据,并将其保存为新文件。

ne_preprocess(text,size,window_size,min_count,max_count):用于对文本进行预处理,如去除停

clean_text_ne(text):用于清除文本中的标点符号、空格等。

download_10days(url,savefile):用于下载指定URL中的所有数据,并将其保存为新文件。

download_all_10days(url,savefile):用于下载指定URL中的所有数据,并将其保存为新文件。

ne_clean_text(text):用于清除文本中的标点符号、空格等。

download_30days_clean(url,savefile):用于下载URL中的数据,并保存文件,删除文件中的停用词。

download_all_30days_clean(url,savefile):用于下载指定URL中的所有数据,并将其保存为新文件,同时删除文件中的停用词,并保留文本中的标点符号。任务实操——实现语料库读取、显示操作1任务实操实现语料库读取、显示操作

此案例通过介绍使用NLTK包实现文本的读取、显示、分析操作,帮助大家更好地应用自然语言处理算法解决实际问题。【例1】本案例通过NTK包读取本地文本《中国工农红军长征纪实》.txt实现语料库操作,具体操作如下:任务实操——实现语料库读取、显示操作1importnltkfromnltk.tokenizeimport*fromnltk.corpusimportPlaintextCorpusReaderaspcr#1.建设语料库corpus_root="data"corpora=pcr(corpus_root,"中国工农红军长征纪实.txt")print(corpora.fileids())#获取语料库的TXT文件名#2.语料库检索#代码2:统计“红军”、“共产党”的词频withopen('data/中国工农红军长征纪实.txt','r',encoding='utf-8')asf:#打开文本fiction=f.read()#读取文本len(set(fiction))#统计用词量len(fiction)/len(set(fiction))#平均每个词的使用次数print(fiction.count('红军'))#使用次数print(fiction.count('共产党'))#使用次数任务实操——实现语料库读取、显示操作1#3:统计高频词次数fdist=nltk.FreqDist(fiction)print(fdist.most_common(15))#统计前15个高频词或高频标识符#4:使用jieba进行分词importreimportjiebaprint(fiction)#\u4e00-\u9fa5用于判断是不是中文的一个条件cleaned_data=''.join(re.findall('[\u4e00-\u9fa5]',fiction))wordlist=jieba.lcut(cleaned_data)#结巴分词处理text=nltk.Text(wordlist)#封装成text对象print(text)#5:查看指定单词(农民)上下文text.concordance(word='农民',width=30,lines=3)#6:绘制词汇离散图importmatplotlibasmplmpl.rcParams['font.sans-serif']=['SimHei']words=['红军','共产党']nltk.draw.dispersion.dispersion_plot(text,words,title='词汇离散图')任务实操——实现语料库读取、显示操作1任务实操实验结果展示任务巩固——《七剑下天山》语料库读取、显示1任务巩固《七剑下天山》语料库读取、显示

请编写一个程序,统计文本《七剑下天山》.TXT中七剑主人公:凌未风、易兰珠、飞红巾、武琼瑶、桂仲明、冒浣莲、张华昭离散图,并将运行结果与代码保存上交。实验运行结果如下图所示。parTTWO《三国演义》字符过滤分析02知识储备:Jieba包基本介绍2

在文本分析中,分词是必不可少的一个环节。而jieba可以说是分词领域的佼佼者,是我们经常用到的一个python分词库。该包可以支持三种分词模式、支持繁体分词、支持自定义词典。具体如下:(1)支持三种分词模式:精确模式:试图将句子最精确的切开,适合文本分析。全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。(2)支持繁体分词(3)支持自定义词典知识储备:Jieba包的基本操作

2(1)jieba.cut方法,接受三个输入参数:需要分词的字符串;cut_all参数用来控制是否采用全模式;HMM参数用来控制是否使用HMM模型例如:jieba.cut("我来到北京清华大学",cut_all=True),该不能解决歧义,比如清华大学,只会输出清华大学。(2)jieba.cut_for_search方法,接受两个输入参数:需要分词的字符串;是否使用HMM模型。例如:jieba.cut_for_search("我来到北京清华大学"),该方法适合用于搜索引擎的分词,粒度比较细任务实操——实现《三国演义》字符过滤2任务实操实现《三国演义》字符过滤

本案例在Python环境下,通过文本分析的方法解析小说《三国演义》并通过字符筛选过滤得三国演义小说中人物次数:曹操、孔明、刘备、关羽、张飞。具体代码如下:任务实操——实现《三国演义》字符过滤2#导入jieba包importjieba#读取三国演义小说txt=open(r"data/三国演义.txt",'r',encoding='gbk').read()words=jieba.lcut(txt)#精确模式分词,重点1counts={}#创建字典,存放人名word和次数countforwordinwords:iflen(word)==1:#排除一个字(非人名)continue#同人不同名合并elifword=="诸葛亮"orword=="孔明曰":rword="孔明"elifword=="关公"orword=="云长":rword="关羽"elifword=="玄德"orword=="玄德曰":rword="刘备"elifword=="孟德"orword=="丞相":rword="曹操"else:rword=wordcounts[rword]=counts.get(rword,0)+1任务实操——实现《三国演义》字符过滤2#构建过滤词stop_words={'将军','却说','二人','不可','荆州','不能','如此','商议'}forwordinstop_words:delcounts[str(word)]#过滤得到三国人物:曹操、孔明、刘备、关羽、张飞

items=list(counts.items())#将字典转换为列表items.sort(key=lambdax:x[1],reverse=True)#重点3num=5#打印出场数前num的人名foriinrange(num):word,count=items[i]print("{0:<13}{1:>3}".format(word,count))任务实操——实现《三国演义》字符过滤2任务实操实验结果展示任务巩固——过滤提取其他三国人物2任务巩固过滤提取其他三国人物

请编写一个程序,将小说《三国演义》中人物除了曹操、孔明、刘备、关羽、张飞在得到吕布、孙权三国人物,并将运行结果与代码保存上交。效果如下图所示。parTTHREE基于HMM中文词分析03知识储备:HMM模型介绍3HMM(HiddenMarkovModel)是一种统计模型,用来描述一个隐含未知量的马尔可夫过程(马尔可夫过程是一类随机过程,它的原始模型是马尔科夫链),它是结构最简单的动态贝叶斯网,是一种著名的有向图模型,主要用于时序数据建模。在语音识别、自然语言处理等领域有广泛应用。知识储备:HMM文本分类

3在文本分类中使用HMM模型需要了解以下步骤:①模型中的隐藏状态:在中文分词中一般只有4个状态:STATES={‘B’,‘I’,‘E’,‘S’},B:代表一个词的开始I:代表一个词的中间部分,若词为两个字则没有IE:代表一个词的结束S:代表一个单独的字作为一个词例如:小明是中国人,对应的状态序列就是:B,E,S,B,I,E②观察状态:在中文分词中就是对应每一个字符。③状态转移矩阵A在中文分词中就是状态序列STATES={‘B’,‘I’,‘E’,‘S’}的转移概率,这个状态概率矩阵是在训练阶段参数估计中得到。在中文分词中状态转移矩阵是一个4*4的矩阵,{'B':{'B':0.0,'I':0.0,'E':0.0,'S':0.0},'I':{'B':0.0,'I':0.0,'E':0.0,'S':0.0},'E':{'B':0.0,'I':0.0,'E':0.0,'S':0.0},'S':{'B':0.0,'I':0.0,'E':0.0,'S':0.0}}④混淆矩阵(发射概率矩阵)B在中文分词中发射概率指的是每一个字符对应状态序列STATES={‘B’,‘M’,‘E’,‘S’}中每一个状态的概率,通过对训练集每个字符对应状态的频数统计得到。任务实操——利用HMM模型实现中文词分类3任务实操利用HMM模型实现中文词分类

【例3】本案例利用HMM模型对新闻词进行分类。具体代码如下:importos#若要二次运行,则需删除已生成的json文件,否则会继续对原文件写入内容并出现解析错误importjsonimportdatetime任务实操——利用HMM模型实现中文词分类3#1.HMM训练代码deftrain():#初始化参数trans_prob={}#转移概率emit_prob={}#发射概率init_prob={}#状态出现次数Count_dict={}state_list=['B','M','E','S']forstateinstate_list:trans={}forsinstate_list:trans[s]=0trans_prob[state]=transemit_prob[state]={}init_prob[state]=0Count_dict[state]=0count=-1#读取并处理单词、计算概率矩阵path='data/trainCorpus.txt'forlineinopen(path,'r'):count+=1line=line.strip()ifnotline:continue任务实操——利用HMM模型实现中文词分类3#读取每一行的单词word_list=[]foriinline:ifi!='':word_list.append(i)#标注每个单词的位置标签word_label=[]forwordinline.split():label=[]iflen(word)==1:label.append('S')else:label+=['B']+['M']*(len(word)-2)+['E']word_label.extend(label)#统计各个位置状态下的出现次数,用于计算概率forindex,valueinenumerate(word_label):Count_dict[value]+=1ifindex==0:init_prob[value]+=1else:trans_prob[word_label[index-1]][value]+=1emit_prob[word_label[index]][word_list[index]]=(emit_prob[word_label[index]].get(word_list[index],0)+1.0)任务实操——利用HMM模型实现中文词分类3#初始概率forkey,valueininit_prob.items():init_prob[key]=value*1/count#转移概率forkey,valueintrans_prob.items():fork,vinvalue.items():value[k]=v/Count_dict[key]trans_prob[key]=value#发射概率,采用加1平滑forkey,valueinemit_prob.items():fork,vinvalue.items():value[k]=(v+1)/Count_dict[key]emit_prob[key]=value#将3个概率矩阵保存至json文件model='tmp/hmm_model.json'f=open(model,'a+')f.write(json.dumps(trans_prob)+'\n'+json.dumps(emit_prob)+'\n'+json.dumps(init_prob))f.close()任务实操——利用HMM模型实现中文词分类3#2.维特比算法,求解最大概率状态序列defviterbi(text,state_list,init_prob,trans_prob,emit_prob):V=[{}]path={}#初始概率forstateinstate_list:V[0][state]=init_prob[state]*emit_prob[state].get(text[0],0)path[state]=[state]#当前语料中所有的字key_list=[]forkey,valueinemit_prob.items():fork,vinvalue.items():key_list.append(k)#计算待分词文本的状态概率值,得到最大概率序列fortinrange(1,len(text)):V.append({})newpath={}

任务实操——利用HMM模型实现中文词分类3forstateinstate_list:iftext[t]inkey_list:emit_count=emit_prob[state].get(text[t],0)else:emit_count=1(prob,a)=max([(V[t-1][s]*trans_prob[s].get(state,0)*emit_count,s)forsinstate_listifV[t-1][s]>0])V[t][state]=probnewpath[state]=path[a]+[state]path=newpath#根据末尾字的状态,判断最大概率状态序列ifemit_prob['M'].get(text[-1],0)>emit_prob['S'].get(text[-1],0):(prob,a)=max([(V[len(text)-1][s],s)forsin('E','M')])else:(prob,a)=max([(V[len(text)-1][s],s)forsinstate_list])return(prob,path[a])任务实操——利用HMM模型实现中文词分类3#3:得到最大概率的词defcut(text):state_list=['B','M','E','S']model='tmp/hmm_model.json'#先检查当前路径下是否有json文件,如果有json文件,需要删除ifos.path.exists(model):f=open(model,'rb')trans_prob=json.loads(f.readline())emit_prob=json.loads(f.readline())init_prob=json.loads(f.readline())f.close()else:trans_prob={}emit_prob={}init_prob={}#利用维特比算法,求解最大概率状态序列prob,pos_list=viterbi(text,state_list,init_prob,trans_prob,emit_prob)

任务实操——利用HMM模型实现中文词分类3#判断待分词文本每个字的状态,输出结果begin,follow=0,0forindex,charinenumerate(text):state=pos_list[index]ifstate=='B':begin=indexelifstate=='E':yieldtext[begin:index+1]follow=index+1elifstate=='S':yieldcharfollow=index+1iffollow<len(text):yieldtext[follow:]任务实操——利用HMM模型实现中文词分类3#4:训练、分词text='学校是学习的好地方!'starttime=datetime.datetime.now()train()endtime=datetime.datetime.now()print((endtime-starttime).seconds)cut(text)print(text)print(str(list(cut(text))))任务实操——利用HMM模型实现中文词分类3任务实操实验结果展示任务巩固——模型测试3任务巩固模型测试

输入中文词:”我是学生,我要好好学习,天天向上!”,请使用上述训练好的模型进行测试并观察实验结果,并将运行结果与代码保存上交。实验结果如下图所示。parTFOUR基于朴素贝叶斯情感分析04知识储备:朴素贝叶斯算法应用4

朴素贝叶斯是一种基于贝叶斯定理和特征条件独立假设的分类方法。朴素贝叶斯算法的核心思想是利用概率论中的贝叶斯定理,结合特征之间相互独立的假设,来进行分类任务。这种算法在文本分类、垃圾邮件过滤等领域有着广泛的应用。其名称中的“朴素”一词来源于它的一个重要假设:特征之间相互独立,即任何一个特征的出现不会影响其他特征的出现概率。尽管在实际应用中,这个假设往往并不成立,但朴素贝叶斯算法仍然表现出了良好的性能。

朴素贝叶斯算法的历史背景可以追溯到18世纪的英国数学家托马斯·贝叶斯,他提出了一种观点:通过使用客观的新信息来更新我们对某个事物最初的信念,从而得到一个新的、改进了的信念。这一理论后来被称为贝叶斯定理,它是朴素贝叶斯算法的数学基础。。知识储备:词频率分布

4

本文通过sklearn算法包中调用MultinomialNB()函数进行情感分类,该函数的具体形式为:sklearn.naive_bayes.MultinomialNB(alpha=1.0)

alpha:拉普拉斯平滑系数,默认为1.0。任务实操——朴素贝叶斯实现商品评论情感分类4任务实操朴素贝叶斯实现商品评论情感分类

【例4】本案例利用朴素贝叶斯算法实现商品评论情感分类,根据用户购买商品的评论记录,从而得出用户对商品是好评还是差评。具体代码如下:#导入包importpandasaspdimportnumpyasnpimportjiebaimportmatplotlib.pyplotaspltfromsklearn.feature_extraction.textimportCountVectorizer#文本特征抽取fromsklearn.naive_bayesimportMultinomialNB#朴素贝叶斯分类任务实操——朴素贝叶斯实现商品评论情感分类4#获取数据集data=pd.read_csv("./data/书籍评价.csv",encoding="gbk")#数据预处理content=data["内容"]data.loc[:,"评价"]#类比SQL将"好评"条件下的"评论编号"列的值设置为1冒号代表选中所有行

增加标签为“好评编号”的一列data.loc[data.loc[:,"评价"]=="好评","评论编号"]=1#将"差评"条件下的"评论编号"列的值设置为0data.loc[data.loc[:,"评价"]=="差评","

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论