自然语言处理实验报告材料Word下载.docx
《自然语言处理实验报告材料Word下载.docx》由会员分享,可在线阅读,更多相关《自然语言处理实验报告材料Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
3066〕
表二三种词干提取器提取结果
Porterstemmer
LancasterStemmer
SnowballStemmer
responsibility
respons
education
educ
working
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:
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从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+R>
以下是实现结果,如图九.
图九最大匹配算法性能值
整理成表之后可得表三
表三正向最大匹配算法评价
正向最大匹配算法
准确率〔P〕
82.7830%
召回率〔R〕
88.7967%
F-测度
85.6844%
b、将文本文件改成外部输入,对输入的词自动分词,以下是测试结果:
图十实验2-b测试
正向最大匹配算法是汉语分词的一个重要算法,思路简单,实验中我将词顺序存储,但是把词长不同的词分开,比拟的时候在对应词长的列表里面进展比拟,这样大大提高了算法的运行效率.对于逆向匹配算法,虽然思路和正向差不多,但是对我而言实践起来比正向要困难.同时我最后分词的准确率不高,对分词歧义并没有进展消除,这可能是导致歧义的原因之一.
实验三中文文本分类
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化后测试集数据
中俄专家谈东盟:
三方...
水杨酸软膏[主要成分]水杨酸....
学生课程生活日记显示:
本市...
4、实验平台和语言
windowsanaconda3spyder<
python3.6>
5、实验结果
测评
总结
F-测评
效果最好的是朴素贝叶斯中的多项式模型,该模式适合多分类问题.
朴素贝叶斯
多项式〔alpha=0.001〕
94.4%
93.3%
伯努利〔alpha=0.001〕
50.0%
66.7%
68.3%
线性核〔C=0.1〕
85.2%
73.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<
#geteverywordofthetxt,分词
#print<
obama中的总词数:
#总词数
len<
words>
fdist=nltk.FreqDist<
sdist=nltk.FreqDist<
sens>
print<
responsibility出现次数:
fdist['
responsibility'
]>
education出现次数:
education'
working出现次数:
working'
#提取三个词的词干
fromnltk.stem.lancasterimportLancasterStemmer
lancaster_stemmer=LancasterStemmer<
responsibility的词干:
lancaster_stemmer.stem<
sdist['
respons'
education的词干:
working的词干:
fromnltk.stem.porterimportPorterStemmer
porter_stemmer=PorterStemmer<
porter_stemmer.stem<
fromnltk.stemimportSnowballStemmer
snowball_stemmer=SnowballStemmer<
english'
snowball_stemmer.stem<
#统计词干出现的频率,先对全文提取词干
whole_stems=[lancaster_stemmer.stem<
t>
fortinwords]#提取全文的词干
全文词干总数:
wdist=nltk.FreqDist<
responsibility的词干出现频率:
wdist['
education的词干出现频率:
educ'
working的词干出现频率:
work'
fromnltk.corpusimportbrown
importre
#包含wh的词计数
c=brown.categories<
#布朗语料库包含的目录类别
news_text=brown.words<
categories='
news'
#新闻
#romance_text=brown.words<
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<
learned'
tagset='
universal'
#tags=[b[1]for<
a,b>
innltk.bigrams<
brown_Irnd_tagged>
ifa[1]=='
NOUN'
]
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
brown.categories<
#打出布朗语料库里面的类别
brown_news_tagged=brown.tagged_words<
adventure'
brown_news_tagged>
word_double=nltk.FreqDist<
wordfor<
word,tag>
inbrown_news_taggediftag.startswith<
NNS'
#提取词性标注为复数的词
word_single=nltk.FreqDist<
N'
andnottag.startswith<
#word_single=nltk.FreqDist<
#word_double=nltk.FreqDist<
#提取词性标注为单数的词
double_keys=list<
word_double.keys<
single_keys=list<
word_sin