自然语言处理实验报告材料.docx
《自然语言处理实验报告材料.docx》由会员分享,可在线阅读,更多相关《自然语言处理实验报告材料.docx(29页珍藏版)》请在冰豆网上搜索。
自然语言处理实验报告材料
"自然语言处理〞实验报告
专业:
智能科学与技术
__1501
__0918150102
某某:
宋晓婷
日期:
2018/4/16
实验1
1、实验目的:
本实验学习如何在利用NLTK进展分词\词性分析与句法分析,.通过次实验项目的练习,增强学生对课堂理论知识的理解,帮助学生以知识获取与自主实践相结合,学习对英文自然语言信息的处理的实践.
2、实验原理和内容:
NLTK自然语言处理工具包,里面包含了许多处理自然语言的库可以直接调用,本实验利用NLTK对obama.txt语料库进展对应的分词和词频统计,再对布朗语料库进展词性和句法分析.
3、实验环境和编程语言:
windows下anaconda3spyder
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.统计词干频率时,先对全文提取词干,然后在提取的词干中统计三者词干出现的频率,结果见表二.
表一原词以与对应词干频率统计
responsibility〔respons〕
education
working
原词出现频率
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;然后对这两个词表提取词干,比拟两个词干表里面一样的词干,同时去除里面重复出现的词干,然后再在复数词表里面找出这些词.
可得常以复数不以单数出现的词有:
handseyesclothesfoolskidsnightshorsesmountainshillsfenceswingsbuildingsriflesfriendswarsEyesridershopesspringssnakeshousestimeslightsRiderstroubleskeysrocksLooksbootslookscigarettesstreetscountiesauthoritiesmeansdeputiesmurdersHousesSpringssaloonsbarsattackersholesZerospowerselbowsLightsofficersfeelingswatersthroatslifeboatsislandsunclesmothershairsvalleysHillsmanderskillsofficescentersfarmershornsproductstalksmarinesmurderersstorespersons
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、形容词、数量词、代名词、以与其他.
使用nltk的句法分析器parser〔自底向上〕
nltk.app.srparser<>后打开以下窗口,运行step会逐步演示对mydogsawamanintheparkwithastatue这句话进展文法分析.结果见图四、图五
图四parser句法分析器
nltk.app.rdparser<>使用递归下降解析器〔自顶向下〕,进展文法分析文法=词法+句法
图五rdparser递归下降解析器
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
4、主要功能与实现
图八正向最大匹配算法实验流程图
a、基于上述算法,写代码实现.实现前对词典中的词的最大长度进展计算,可得词典里面词最大词长为4.于是初始化三个空列表来存放词长为2、3、4的词.把原词典里面的词分成三份,这样匹配时可以加快匹配速度.匹配完之后计算召回率〔R〕、准确率〔P〕、F测度,
准确率:
P=系统输出正确词的个数/系统输出词的个数〔词典词的个数〕*100%
召回率:
R=系统输出正确词的个数/金标词典中词的个数〔词典词的个数〕*100%
F-测度:
F=2*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
财经
财经
重要财务指标财务指标每股收益...
财经
致命的停滞:
谁在监测京石高速?
杜家...
财经
朱宏任:
上半年工业经济运行总体保持平稳...
财经
利率市场化或推升高风险贷款...
财经
*ST炎黄保壳仍无具体措施...
健康
健康
中国每天新增加糖尿病患者约...
健康
重酒石酸间羟胺注射液鲜花...
健康
脂肪乳注射液〔C14-24〕[主要...
健康
马来酸麦角新碱注射液...
健康
盐酸可乐定片[须知事项]...
教育
教育
《杜拉拉升职记》开播的时候...
教育
中学拟用平板电脑代替纸质教材...
教育
2013考研数学备考指导...
教育
高考后学生纷纷去看心理医生...
教育
2012政法干警行测数学运算指南...
表五bunch化后测试集数据
target_name
filenames
label
contents
财经
财经
中俄专家谈东盟:
三方...
健康
健康
水杨酸软膏[主要成分]水杨酸....
教育
教育
学生课程生活日记显示:
本市...
4、实验平台和语言
windowsanaconda3spyder
5、实验结果
测评
总结
准确率〔P〕
召回率〔R〕
F-测评
效果最好的是朴素贝叶斯中的多项式模型,该模式适合多分类问题.
朴素贝叶斯
多项式〔alpha=0.001〕
94.4%
93.3%
93.3%
伯努利〔alpha=0.001〕
50.0%
66.7%
68.3%
线性核〔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
#将文本拆分成句子列表
words=nltk.word_tokenize
#geteverywordofthetxt,分词
#print<'obama中的总词数:
'>#总词数
#print>
fdist=nltk.FreqDist
sdist=nltk.FreqDist
'''
print<'responsibility出现次数:
'>
print
print<'education出现次数:
'>
print
print<'working出现次数:
'>
print
'''
#提取三个词的词干
fromnltk.stem.lancasterimportLancasterStemmer
lancaster_stemmer=LancasterStemmer<>
#print<'responsibility的词干:
'>
#print>
#print
#print<'education的词干:
'>
#print>
#print<'working的词干:
'>
#print>
'''
fromnltk.stem.porterimportPorterStemmer
porter_stemmer=PorterStemmer<>
print<'responsibility的词干:
'>
print>
print<'education的词干:
'>
print>
print<'working的词干:
'>
print>
fromnltk.stemimportSnowballStemmer
snowball_stemmer=SnowballStemmer<'english'>
print<'responsibility的词干:
'>
print>
print<'education的词干:
'>
print>
print<'working的词干:
'>
print>
'''
'''
#统计词干出现的频率,先对全文提取词干
whole_stems=[lancaster_stemmer.stemfortinwords]#提取全文的词干
print<'全文词干总数:
'>
print>
wdist=nltk.FreqDist
print<'responsibility的词干出现频率:
'>
print
print<'education的词干出现频率:
'>
print
print<'working的词干出现频率:
'>
print
'''
fromnltk.corpusimportbrown
importnltk
importre
'''
#包含wh的词计数
c=brown.categories<>#布朗语料库包含的目录类别
news_text=brown.words#新闻
#romance_text=brown.words#浪漫
ndist=nltk.FreqDist<[w.lower<>forwinnews_text]>
modals=set<[wforwinnews_textifre.search<'^wh',w>]>
forminmodals:
print',ndist[m]>
'''
#名词后面词性统计
#brown_Irnd_tagged=brown.tagged_words
#tags=[b[1]forinnltk.bigramsifa[1]=='NOUN']
#tags=[b[1]forinnltk.bigramsifa[0]=='often']
#nd=nltk.FreqDist#统计频率
#nd.tabulate<>
#统计常以复数形式出现的词
#wsj=nltk.corpus.treebank.tagged_words
#word_tag_fd=nltk.FreqDist
#fromnltk.corpusimportbrown
fromnltk.stem.porterimportPorterStemmer
porter_stemmer=PorterStemmer<>
#print>#打出布朗语料库里面的类别
brown_news_tagged=brown.tagged_words
#print
word_double=nltk.FreqDistinbrown_news_taggediftag.startswith<'NNS'>>#提取词性标注为复数的词
word_single=nltk.FreqDistinbrown_news_taggediftag.startswith<'N'>andnottag.startswith<'NNS'>>
#word_single=nltk.FreqDistinbrown_news_taggediftag.startswith<'NNS'>>#提取词性标注为复数的词
#word_double=nltk.FreqDistinbrown_news_taggediftag.startswith<'N'>andnottag.startswith<'NNS'>>
#提取词性标注为单数的词
double_keys=list>
single_keys=list