自然语言处理实验报告材料.docx
- 文档编号:6616717
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:34
- 大小:281.95KB
自然语言处理实验报告材料.docx
《自然语言处理实验报告材料.docx》由会员分享,可在线阅读,更多相关《自然语言处理实验报告材料.docx(34页珍藏版)》请在冰豆网上搜索。
自然语言处理实验报告材料
“自然语言处理”实验报告
专业:
智能科学与技术
班级:
1501
学号:
0918150102
姓名:
宋晓婷
日期:
2018/4/16
实验1
1、实验目的:
本实验学习如何在利用NLTK进行分词\词性分析与句法分析,。
通过次实验项目的练习,增强学生对课堂理论知识的理解,帮助学生以知识获取与自主实践相结合,学习对英文自然语言信息的处理的实践。
2、实验原理和内容:
NLTK自然语言处理工具包,里面包含了许多处理自然语言的库可以直接调用,本实验利用NLTK对obama。
txt语料库进行对应的分词和词频统计,再对布朗语料库进行词性和句法分析。
3、实验环境和编程语言:
windows下anaconda3spyder(python3.6)
4、主要功能及实现:
4.1怎样载入自己的英文语料库(obama.txt),在自己的语料库中找出responsibility,education和working出现的频率及其他们词干出现的频率。
(使用nltk的英文分词函数tokenize和stem)。
①使用open以及read函数读取obama.txt文档,调用nltk里面的word_tokenize()函数,先把文档进行分词,再调用nltk中的FreDist()函数进行词频统计。
统计responsibility,education和working出现的频率。
结果见表一。
②提取词干的时候,NLTK中提供了三种最常用的词干提取器接口,即 Porterstemmer,LancasterStemmer和SnowballStemmer。
统计词干频率时,先对全文提取词干(whole_stems),然后在提取的词干中统计三者词干出现的频率,结果见表二。
表一原词以及对应词干频率统计
responsibility(respons)
education(educ)
working(work)
原词出现频率
8
11
2
词干出现频率
9
11
12
(全文总词数:
3066全文总词干数:
3066)
表二三种词干提取器提取结果
Porterstemmer
LancasterStemmer
SnowballStemmer
responsibility
respons
respons
respons
education
educ
educ
educ
working
work
work
work
4.2写程序处理布朗语料库,找到以下答案:
4.2.1哪些名词常以他们复数形式而不是它们的单数形式出现?
(只考虑常规的复数形式,-s后缀形式的)。
①先查看布朗语料库里面包含的类别(如图一)
图一布朗语料库包含类别
②选取其中一个类别的语料库adventure,提取里面的所有NNS标注的复数词放入word_double;提取NN标注而非NNS标注的单数词放入word_single;然后对这两个词表提取词干,比较两个词干表里面相同的词干,同时去除里面重复出现的词干,然后再在复数词表里面找出这些词。
可得常以复数不以单数出现的词有:
handseyesclothesfoolskidsnightshorsesmountainshillsfenceswingsbuildingsriflesfriendswarsEyesridershopesspringssnakeshousestimeslightsRiderstroubleskeysrocksLooksbootslookscigarettesstreetscountiesauthoritiesmeansdeputiesmurdersHousesSpringssaloonsbarsattackersholesZerospowerselbowsLightsofficersfeelingswatersthroatslifeboatsislandsunclesmothershairsvalleysHillsCommanderskillsofficescentersfarmershornsproductstalksmarinesmurderersstorespersons
4.2.2选择布朗语料库的不同部分(其他目录),计数包含wh的词:
此处我查找新闻(news)类别里面包含wh的词,结果如图二
图二布朗语料库新闻类别中包含wh的词
wheat:
1wherever:
1whip:
2whipped:
2wholesale:
1whichever:
1
whisking:
1why:
14wheeled:
2wholly-owned:
1whims:
1where:
59
whiplash:
1which:
245whereby:
3white:
57wheels:
1who:
268wheel:
4
whites:
2when:
169whatever:
2whose:
22white-clad:
1while:
55wholly:
1
whether:
18what:
95whopping:
1whole:
11whom:
8whirling:
1whiz:
2
4.3、输出brown文本集名词后面接的词性,结果如图三
图三brown文本集名词后面接的词性
由统计可知:
名词后面出现频率最高的是ADP(介词和后置词)第二是标点第三是动词依次是名词、连接词、副词、限定词、PRT、形容词、数量词、代名词、以及其他。
4.4句法分析演示
使用nltk的句法分析器parser(自底向上)
nltk.app.srparser()后打开以下窗口,运行step会逐步演示对mydogsawamanintheparkwithastatue这句话进行文法分析。
结果见图四、图五
图四parser句法分析器
nltk.app.rdparser()使用递归下降解析器(自顶向下),进行文法分析文法=词法+句法
图五rdparser递归下降解析器
4.5对话框系统
nltk里面一共有5个对话框系统,我选择1,情绪分析。
结果如图六、图七
图六
图七
5、实验结论
掌握了对语料库的基本操作,分词分句、统计词频以及对词性分析。
句法分析的自顶向上以及自底向下思路简单但是实现起来比较麻烦,回溯会出现多次。
实验中掌握了两种不同的句法分析的流程。
nltk的对话框经测试后觉得有点基础,分析以及人机对话的可用性不是很强。
实验2中文分词
1、实验目的和内容
a.用最大匹配算法设计分词程序实现对文档分词,并计算该程序分词召回率。
b.可以输入任意句子,显示分词结果。
实验数据:
(1)word_freq_list.txt分词词典
(2)pku_test.txt未经过分词的文档文件
(3)pku_test_gold.txt经过分词的文档文件
2、实验原理
核心思想:
最大匹配算法
算法描述:
正向最大匹配法算法如下所示:
逆向匹配法思想与正向一样,只是从右向左切分,这里举一个例子:
输入例句:
S1="计算语言学课程有意思";
定义:
最大词长MaxLen=5;S2="";分隔符=“/”;
假设存在词表:
…,计算语言学,课程,意思,…;
最大逆向匹配分词算法过程如下:
(1)S2="";S1不为空,从S1右边取出候选子串W="课程有意思";
(2)查词表,W不在词表中,将W最左边一个字去掉,得到W="程有意思";
(3)查词表,W不在词表中,将W最左边一个字去掉,得到W="有意思";
(4)查词表,W不在词表中,将W最左边一个字去掉,得到W="意思"
(5)查词表,“意思”在词表中,将W加入到S2中,S2="意思/",并将W从S1中去掉,此时S1="计算语言学课程有";
(6)S1不为空,于是从S1左边取出候选子串W="言学课程有";
(7)查词表,W不在词表中,将W最左边一个字去掉,得到W="学课程有";
(8)查词表,W不在词表中,将W最左边一个字去掉,得到W="课程有";
(9)查词表,W不在词表中,将W最左边一个字去掉,得到W="程有";
(10)查词表,W不在词表中,将W最左边一个字去掉,得到W="有",这W是单字,将W加入到S2中,S2=“/有/意思”,并将W从S1中去掉,此时S1="计算语言学课程";
(11)S1不为空,于是从S1左边取出候选子串W="语言学课程";
(12)查词表,W不在词表中,将W最左边一个字去掉,得到W="言学课程";
(13)查词表,W不在词表中,将W最左边一个字去掉,得到W="学课程";
(14)查词表,W不在词表中,将W最左边一个字去掉,得到W="课程";
(15)查词表,“意思”在词表中,将W加入到S2中,S2=“课程/有/意思/”,并将W从S1中去掉,此时S1="计算语言学";
(16)S1不为空,于是从S1左边取出候选子串W="计算语言学";
(17)查词表,“计算语言学”在词表中,将W加入到S2中,S2=“计算语言学/课程/有/意思/”,并将W从S1中去掉,此时S1="";
(18)S1为空,输出S2作为分词结果,分词过程结束。
3、实验平台及语言
windowsanconda3spyder(python3.6)
4、主要功能及实现
4.1算法流程图
图八正向最大匹配算法实验流程图
4.2实验结果
a、基于上述算法,写代码实现。
实现前对词典中的词的最大长度进行计算,可得词典里面词最大词长为4。
于是初始化三个空列表来存放词长为2、3、4的词。
把原词典里面的词分成三份,这样匹配时可以加快匹配速度。
匹配完之后计算召回率(R)、准确率(P)、F测度,
准确率:
P=系统输出正确词的个数/系统输出词的个数(词典词的个数)*100%
召回率:
R=系统输出正确词的个数/金标词典中词的个数(词典词的个数)*100%
F-测度:
F=2*P*R/(P+R)
以下是实现结果,如图九。
图九最大匹配算法性能值
整理成表之后可得表三
表三正向最大匹配算法评价
正向最大匹配算法
准确率(P)
82.7830%
召回率(R)
88.7967%
F-测度
85.6844%
b、将文本文件改成外部输入,对输入的词自动分词,以下是测试结果:
图十实验2-b测试
5、实验结论
正向最大匹配算法是汉语分词的一个重要算法,思路简单,实验中我将词顺序存储,但是把词长不同的词分开,比较的时候在对应词长的列表里面进行比较,这样大大提高了算法的运行效率。
对于逆向匹配算法,虽然思路和正向差不多,但是对我而言实践起来比正向要困难。
同时我最后分词的准确率不高,对分词歧义并没有进行消除,这可能是导致歧义的原因之一。
实验三中文文本分类
1、小组成员以及分工
宋晓婷、陈曦
分工:
陈曦数据预处理
宋晓婷数据预处理(去html标签以及分词)、特征提取以及分类
2、实验目的和内容
对语料库进行数据预处理,利用朴素贝叶斯算法或SVM完成对测试集的文本进行分类。
语料库主要包括健康、财经、教育三个类别,每个类别里面各有6篇文档以及一篇test.txt待测试的文档。
3、实验原理以及数据处理
自然语言处理文本分类的主要步骤如图十一
图十一实验5流程图
预处理部分:
去除文档中的html标签,删除文档中多余的空格和换行。
这里没有去除停用词,因为在后续调用sklearn中的算法的时候可以直接利用其中的算法进行停用词去除。
分词:
这里调用的是结巴中文分词系统(importjieba)。
结构和表示-构建词向量空间:
对于分好词的文档,利用sklearn里面的bunch数据结构,由于给的test.txt测试集没有标签,在后续对算法测评的时候无法测评,于是把每篇文档中的第五篇5.txt分出来作为测试集。
用这三篇文档作为测试集来进行算法测评。
Bunch化后训练集以及测试集数据如表四、表五所示。
TF-IDF算权重、提取特征:
去除测试集和训练集中的停用词,计算数据集里面的词频,把词频大于50%的去掉,因为这些高频词对分类的特异性没有多大作用,而后根据词频,计算每个词的权重,得到权重矩阵(tdm),,并把这些词统一到同一个词向量空间里面提取特征。
分类:
此处是多分类,调用sklearn中的朴素贝叶斯函数中的伯努利模型和多项式模型,以及svm中的SVC算法,用训练集数据进行训练,利用训练好的算法预测类别。
评价:
计算准确率(P),召回率(R),F-测评值
表四Bunch化后训练集数据
target_name
filenames
label
contents
财经
D:
\spyder程序\题目一\训练集\财经\0.txt
财经
重要财务指标财务指标每股收益...
D:
\spyder程序\题目一\训练集\财经\1.txt
财经
致命的停滞:
谁在监测京石高速?
杜家...
D:
\spyder程序\题目一\训练集\财经\2.txt
财经
朱宏任:
上半年工业经济运行总体保持平稳...
D:
\spyder程序\题目一\训练集\财经\3.txt
财经
利率市场化或推升高风险贷款...
D:
\spyder程序\题目一\训练集\财经\4.txt
财经
*ST炎黄保壳仍无具体措施...
健康
D:
\spyder程序\题目一\训练集\健康\0.txt
健康
中国每天新增加糖尿病患者约...
D:
\spyder程序\题目一\训练集\健康\1.txt
健康
重酒石酸间羟胺注射液鲜花...
D:
\spyder程序\题目一\训练集\健康\2.txt
健康
脂肪乳注射液(C14-24)【主要...
D:
\spyder程序\题目一\训练集\健康\3.txt
健康
马来酸麦角新碱注射液...
D:
\spyder程序\题目一\训练集\健康\4.txt
健康
盐酸可乐定片【注意事项】...
教育
D:
\spyder程序\题目一\训练集\教育\0.txt
教育
《杜拉拉升职记》开播的时候...
D:
\spyder程序\题目一\训练集\教育\1.txt
教育
中学拟用平板电脑代替纸质教材...
D:
\spyder程序\题目一\训练集教育\2.txt
教育
2013考研数学备考指导...
D:
\spyder程序\题目一\训练集\教育\3.txt
教育
高考后学生纷纷去看心理医生...
D:
\spyder程序\题目一\训练集\教育\4.txt
教育
2012政法干警行测数学运算指南...
表五bunch化后测试集数据
target_name
filenames
label
contents
财经
D:
\spyder程序\题目一\测试集\财经\5.txt
财经
中俄专家谈东盟:
三方...
健康
D:
\spyder程序\题目一\测试集\健康\5.txt
健康
水杨酸软膏【主要成分】水杨酸。
...
教育
D:
\spyder程序\题目一\测试集\教育\5.txt
教育
学生课程生活日记显示:
本市...
4、实验平台和语言
windowsanaconda3spyder(python3.6)
5、实验结果
表六实验3.1结果
测评
总结
准确率(P)
召回率(R)
F-测评
效果最好的是朴素贝叶斯中的多项式模型,该模式适合多分类问题。
朴素贝叶斯
多项式(alpha=0.001)
94.4%
93.3%
93.3%
伯努利(alpha=0.001)
50.0%
66.7%
68.3%
svm.SVC
线性核(C=0.1)
85.2%
73.3%
68.3%
多项式核(C=0.1)
93.9%
92.8%
92.9%
6、实验结论
对于中文文本分类,初次动手尝试,拿到数据集之后也是不知道该如何下手。
参考网上一篇博客。
里面博主对于中文文本分类说的很清楚,让我受益颇多。
对于分本分类采用bunch结构也是一个非常巧妙地结构化表示方法。
四、实验1-3代码
实验一
#-*-coding:
utf-8-*-
"""
CreatedonThuApr509:
39:
092018
@author:
sxt
"""
#NatrualLanguage
#experiment_1
fromnltkimport*
importnltk
file=open('obama.txt')
raw_file=file.read()
#读取文件
sens=nltk.sent_tokenize(raw_file)
#将文本拆分成句子列表
words=nltk.word_tokenize(raw_file)
#geteverywordofthetxt,分词
#print('obama中的总词数:
')#总词数
#print(len(words))
fdist=nltk.FreqDist(words)
sdist=nltk.FreqDist(sens)
'''
print('responsibility出现次数:
')
print(fdist['responsibility'])
print('education出现次数:
')
print(fdist['education'])
print('working出现次数:
')
print(fdist['working'])
'''
#提取三个词的词干
fromnltk.stem.lancasterimportLancasterStemmer
lancaster_stemmer=LancasterStemmer()
#print('responsibility的词干:
')
#print(lancaster_stemmer.stem('responsibility'))
#print(sdist['respons'])
#print('education的词干:
')
#print(lancaster_stemmer.stem('education'))
#print('working的词干:
')
#print(lancaster_stemmer.stem('working'))
'''
fromnltk.stem.porterimportPorterStemmer
porter_stemmer=PorterStemmer()
print('responsibility的词干:
')
print(porter_stemmer.stem('responsibility'))
print('education的词干:
')
print(porter_stemmer.stem('education'))
print('working的词干:
')
print(porter_stemmer.stem('working'))
fromnltk.stemimportSnowballStemmer
snowball_stemmer=SnowballStemmer('english')
print('responsibility的词干:
')
print(snowball_stemmer.stem('responsibility'))
print('education的词干:
')
print(snowball_stemmer.stem('education'))
print('working的词干:
')
print(snowball_stemmer.stem('working'))
'''
'''
#统计词干出现的频率,先对全文提取词干
whole_stems=[lancaster_stemmer.stem(t)fortinwords]#提取全文的词干
print('全文词干总数:
')
print(len(whole_stems))
wdist=nltk.FreqDist(whole_stems)
print('responsibility的词干出现频率:
')
print(wdist['respons'])
print('education的词干出现频率:
')
print(wdist['educ'])
print('working的词干出现频率:
')
print(wdist['work'])
'''
#实验1.2
fromnltk.corpusimportbrown
importnltk
importre
'''
#包含wh的词计数
c=brown.categories()#布朗语料库包含的目录类别
news_text=brown.words(categories='news')#新闻
#romance_text=brown.words(categories='romance')#浪漫
ndist=nltk.FreqDist([w.lower()forwinnews_text])
modals=set([wforwinnews_textifre.search('^wh',w)])
forminmodals:
print(m+':
',ndist[m])
'''
#名词后面词性统计
#brown_Irnd_tagged=brown.tagged_words(categories='learned',tagset='universal')
#tags=[b[1]for(a,b)innltk.bigrams(brown_Irnd_tagged)ifa[1]=='NOUN']
#tags=[b[1]for(a,b)innltk.bigrams(brown_Irnd_tagged)ifa[0]=='often']
#nd=nltk.FreqDist(tags)#统计频率
#nd.tabulate()
#统计常以复数形式出现的词
#wsj=nltk.corpus.treebank.tagged_words(simplify_tags=True)
#word_tag_fd=nltk.FreqDist(wsj)
#fromnltk.corpusimportbrown
importnltk.stem
fromnltk.stem.porterimportPorterStemmer
porter_stemmer=PorterStemmer()
#print(brow
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自然语言 处理 实验 报告 材料