“自然语言处理”实验报告
专业:智能科学与技术
班级:1501
学号:**********
姓名:***
日期:2018/4/16
2/32
目录
实验1............................................................................................................................................................3
1、实验目的:.......................................................................................................................................3
2、实验原理和内容:.........................................................................................................................3
3、实验环境和编程语言:................................................................................................................3
4、主要功能及实现:.........................................................................................................................3
5、实验结论...........................................................................................................................................8
实验2中文分词........................................................................................................................................8
1、实验目的和内容.............................................................................................................................8
2、实验原理...........................................................................................................................................9
3、实验平台及语言...........................................................................................................................10
4、主要功能及实现...........................................................................................................................11
4.1算法流程图...............................................................................................................................11
4.2实验结果.....................................................................................................................................11
5、实验结论.........................................................................................................................................13
实验三中文文本分类...........................................................................................................................13
1、小组成员以及分工.......................................................................................................................13
2、实验目的和内容...........................................................................................................................13
3、实验原理以及数据处理..............................................................................................................14
4、实验平台和语言...........................................................................................................................16
5、实验结果.........................................................................................................................................16
6、实验结论.........................................................................................................................................16
四、实验1-3代码.................................................................................................................................17
3/32
实验1
1、实验目的:
本实验学习如何在利用NLTK进行分词词性分析与句法分析,。通过次实
验项目的练习,增强学生对课堂理论知识的理解,帮助学生以知识获取与
自主实践相结合,学习对英文自然语言信息的处理的实践。
2、实验原理和内容:
NLTK自然语言处理工具包,里面包含了许多处理自然语言的库可以直接
调用,本实验利用NLTK对obama。txt语料库进行对应的分词和词频统
计,再对布朗语料库进行词性和句法分析。
3、实验环境和编程语言:
windows下anaconda3spyder(python3.6)
4、主要功能及实现:
4.1怎样载入自己的英文语料库(),在自己的语料库中找出
responsibility,education和working出现的频率及其他们词干出现的频率。(使用
nltk的英文分词函数tokenize和stem)。
①使用open以及read函数读取文档,调用nltk里面的word_tokenize()
函数,先把文档进行分词,再调用nltk中的FreDist()函数进行词频统计。统计
responsibility,education和working出现的频率。结果见表一。
4/32
②提取词干的时候,NLTK中提供了三种最常用的词干提取器接口,即Porter
stemmer,LancasterStemmer和SnowballStemmer。统计词干频率时,先对全
文提取词干(whole_stems),然后在提取的词干中统计三者词干出现的频率,结果
见表二。
表一原词以及对应词干频率统计
(全文总词数:3066全文总词干数:3066)
表二三种词干提取器提取结果
PorterstemmerLancasterStemmerSnowballStemmer
responsibilityresponsresponsrespons
educationeduceduceduc
workingworkworkwork
4.2写程序处理布朗语料库,找到以下答案:
4.2.1哪些名词常以他们复数形式而不是它们的单数形式出现?(只考虑常
规的复数形式,-s后缀形式的)。
①先查看布朗语料库里面包含的类别(如图一)
图一布朗语料库包含类别
②选取其中一个类别的语料库adventure,提取里面的所有NNS标注的复数词
放入word_double;提取NN标注而非NNS标注的单数词放入word_single;然后
responsibility(respons)education(educ)working(work)
原词出现频率8112
词干出现频率91112
5/32
对这两个词表提取词干,比较两个词干表里面相同的词干,同时去除里面重复出
现的词干,然后再在复数词表里面找出这些词。
可得常以复数不以单数出现的词有:
4.2.2选择布朗语料库的不同部分(其他目录),计数包含wh的词:
此处我查找新闻(news)类别里面包含wh的词,结果如图二
图二布朗语料库新闻类别中包含wh的词
handyesclothesfoolskidsnightshorsmountainshillsfenceswingsbuildings
riflesfriendswarsEyesridershopesspringssnakeshoustimeslightsRiders
troubleskeysrocksLooksbootslookscigarettesstreetscountiesauthoritiesmeans
deputiesmurdersHousSpringssaloonsbarsattackersholesZerospowerlbows
Lightsofficersfeelingswatersthroatslifeboatsislandsunclesmothershairsvalleys
HillsCommanderskillsofficescentersfarmershornsproductstalksmarinesmurderers
storespersons
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:2who:22white-clad:1while:55wholly:1
whether:18what:95whopping:1whole:11whom:8whirling:1whiz:2
6/32
4.3、输出brown文本集名词后面接的词性,结果如图三
图三brown文本集名词后面接的词性
由统计可知:
名词后面出现频率最高的是ADP(介词和后置词)第二是标点第三是动词依
次是名词、连接词、副词、限定词、PRT、形容词、数量词、代名词、以及其他。
4.4句法分析演示
使用nltk的句法分析器parr(自底向上)
er()后打开以下窗口,运行step会逐步演示对mydogsawaman
intheparkwithastatue这句话进行文法分析。结果见图四、图五
图四parr句法分析器
7/32
er()使用递归下降解析器(自顶向下),进行文法分析文法=词法
+句法
图五rdparr递归下降解析器
4.5对话框系统
nltk里面一共有5个对话框系统,我选择1,情绪分析。结果如图六、图七
图六
8/32
图七
5、实验结论
掌握了对语料库的基本操作,分词分句、统计词频以及对词性分析。句法
分析的自顶向上以及自底向下思路简单但是实现起来比较麻烦,回溯会
出现多次。实验中掌握了两种不同的句法分析的流程。nltk的对话框经测
试后觉得有点基础,分析以及人机对话的可用性不是很强。
实验2中文分词
1、实验目的和内容
a.用最大匹配算法设计分词程序实现对文档分词,并计算该程序分词召回率。
b.可以输入任意句子,显示分词结果。
实验数据:
(1)word_freq_分词词典
9/32
(2)pku_未经过分词的文档文件
(3)pku_test_经过分词的文档文件
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="课程有";
10/32
(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)
11/32
4、主要功能及实现
4.1算法流程图
图八正向最大匹配算法实验流程图
4.2实验结果
a、基于上述算法,写代码实现。实现前对词典中的词的最大长度进行计算,可
得词典里面词最大词长为4。于是初始化三个空列表来存放词长为2、3、4的词。
把原词典里面的词分成三份,这样匹配时可以加快匹配速度。匹配完之后计算召
12/32
回率(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测试
13/32
5、实验结论
正向最大匹配算法是汉语分词的一个重要算法,思路简单,实验中我将词
顺序存储,但是把词长不同的词分开,比较的时候在对应词长的列表里面
进行比较,这样大大提高了算法的运行效率。对于逆向匹配算法,虽然思
路和正向差不多,但是对我而言实践起来比正向要困难。同时我最后分词
的准确率不高,对分词歧义并没有进行消除,这可能是导致歧义的原因之
一。
实验三中文文本分类
1、小组成员以及分工
宋晓婷、陈曦
分工:陈曦数据预处理
宋晓婷数据预处理(去html标签以及分词)、特征提取以及分类
2、实验目的和内容
对语料库进行数据预处理,利用朴素贝叶斯算法或SVM完成对测试集的文本
14/32
进行分类。
语料库主要包括健康、财经、教育三个类别,每个类别里面各有6篇文档以
及一篇待测试的文档。
3、实验原理以及数据处理
自然语言处理文本分类的主要步骤如图十一
图十一实验5流程图
预处理部分:去除文档中的html标签,删除文档中多余的空格和换行。这里没
有去除停用词,因为在后续调用sklearn中的算法的时候可以直接利用其中的算
法进行停用词去除。
分词:这里调用的是结巴中文分词系统(importjieba)。
结构和表示-构建词向量空间:对于分好词的文档,利用sklearn里面的bunch数
据结构,由于给的测试集没有标签,在后续对算法测评的时候无法测评,
于是把每篇文档中的第五篇分出来作为测试集。用这三篇文档作为测试集
来进行算法测评。Bunch化后训练集以及测试集数据如表四、表五所示。
TF-IDF算权重、提取特征:去除测试集和训练集中的停用词,计算数据集里面
的词频,把词频大于50%的去掉,因为这些高频词对分类的特异性没有多大作用,
而后根据词频,计算每个词的权重,得到权重矩阵(tdm),,并把这些词统一到
15/32
同一个词向量空间里面提取特征。分类:此处是多分类,调用sklearn中的朴素
贝叶斯函数中的伯努利模型和多项式模型,以及svm中的SVC算法,用训练集
数据进行训练,利用训练好的算法预测类别。
评价:计算准确率(P),召回率(R),F-测评值
表四Bunch化后训练集数据
target_namefilenameslabelcontents
财经
D:spyder程序题目一训
练集财经
财经重要财务指标财务指标
每股收益...
D:spyder程序题目一训
练集财经
财经致命的停滞:谁在监
测京石高速?杜家...
D:spyder程序题目一训
练集财经
财经朱宏任:上半年工业经
济运行总体保持平稳...
D:spyder程序题目一训
练集财经
财经利率市场化或推升高
风险贷款...
D:spyder程序题目一训
练集财经
财经*ST炎黄保壳仍无
具体措施...
健康
D:spyder程序题目一训
练集健康
健康中国每天新增加糖尿病
患者约...
D:spyder程序题目一训
练集健康
健康重酒石酸间羟胺注射液
鲜花...
D:spyder程序题目一训
练集健康
健康脂肪乳注射液(C14
-24)【主要...
D:spyder程序题目一训
练集健康
健康马来酸麦角新碱注射液...
D:spyder程序题目一训
练集健康
健康盐酸可乐定片【注意事
项】...
教育
D:spyder程序题目一训
练集教育
教育《杜拉拉升职记》开
播的时候...
D:spyder程序题目一训
练集教育
教育中学拟用平板电脑代替
纸质教材...
D:spyder程序题目一训
练集教育
教育2013考研数学备
考指导...
D:spyder程序题目一训
练集教育
教育高考后学生纷纷去看
心理医生...
D:spyder程序题目一训
练集教育
教育2012政法干警行
测数学运算指南...
16/32
表五bunch化后测试集数据
target_namefilenameslabelcontents
财经D:spyder程序题目一测
试集财经
财经中俄专家谈东盟:三
方...
健康D:spyder程序题目一测
试集健康
健康水杨酸软膏【主要成
分】水杨酸。...
教育D:spyder程序题目一测
试集教育
教育学生课程生活日记显
示:本市...
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%
线性核(C=0.1)85.2%73.3%68.3%
多项式核(C=0.1)93.9%92.8%92.9%
6、实验结论
对于中文文本分类,初次动手尝试,拿到数据集之后也是不知道该如何下手。
参考网上一篇博客。里面博主对于中文文本分类说的很清楚,让我受益颇多。
对于分本分类采用bunch结构也是一个非常巧妙地结构化表示方法。
17/32
四、实验1-3代码
实验一
#-*-coding:utf-8-*-
"""
CreatedonThuApr509:39:092018
@author:sxt
"""
#NatrualLanguage
#experiment_1
fromnltkimport*
importnltk
file=open('')
raw_file=()
#读取文件
ns=_tokenize(raw_file)
#将文本拆分成句子列表
words=_tokenize(raw_file)
#geteverywordofthetxt,分词
#print('obama中的总词数:')#总词数
#print(len(words))
fdist=st(words)
sdist=st(ns)
'''
print('responsibility出现次数:')
print(fdist['responsibility'])
print('education出现次数:')
print(fdist['education'])
print('working出现次数:')
print(fdist['working'])
'''
#提取三个词的词干
terimportLancasterStemmer
lancaster_stemmer=LancasterStemmer()
#print('responsibility的词干:')
#print(lancaster_('responsibility'))
#print(sdist['respons'])
#print('education的词干:')
#print(lancaster_('education'))
#print('working的词干:')
#print(lancaster_('working'))
'''
18/32
importPorterStemmer
porter_stemmer=PorterStemmer()
print('responsibility的词干:')
print(porter_('responsibility'))
print('education的词干:')
print(porter_('education'))
print('working的词干:')
print(porter_('working'))
portSnowballStemmer
snowball_stemmer=SnowballStemmer('english')
print('responsibility的词干:')
print(snowball_('responsibility'))
print('education的词干:')
print(snowball_('education'))
print('working的词干:')
print(snowball_('working'))
'''
'''
#统计词干出现的频率,先对全文提取词干
whole_stems=[lancaster_(t)fortinwords]#提取全文的词干
print('全文词干总数:')
print(len(whole_stems))
wdist=st(whole_stems)
print('responsibility的词干出现频率:')
print(wdist['respons'])
print('education的词干出现频率:')
print(wdist['educ'])
print('working的词干出现频率:')
print(wdist['work'])
'''
#实验1.2
importbrown
importnltk
importre
'''
#包含wh的词计数
c=ries()#布朗语料库包含的目录类别
news_text=(categories='news')#新闻
#romance_text=(categories='romance')#浪漫
ndist=st([()forwinnews_text])
modals=t([wforwinnews_('^wh',w)])
forminmodals:
print(m+':',ndist[m])
19/32
'''
#名词后面词性统计
#brown_Irnd_tagged=_words(categories='learned',tagt='universal')
#tags=[b[1]for(a,b)s(brown_Irnd_tagged)ifa[1]=='NOUN']
#tags=[b[1]for(a,b)s(brown_Irnd_tagged)ifa[0]=='often']
#nd=st(tags)#统计频率
#te()
#统计常以复数形式出现的词
#wsj=_words(simplify_tags=True)
#word_tag_fd=st(wsj)
#importbrown
importPorterStemmer
porter_stemmer=PorterStemmer()
#print(ries())#打出布朗语料库里面的类别
brown_news_tagged=_words(categories='adventure')
#print(brown_news_tagged)
word_double=st(wordfor(word,tag)inbrown_news_taggedif
with('NNS'))#提取词性标注为复数的词
word_single=st(wordfor(word,tag)inbrown_news_with('N')
with('NNS'))
#word_single=st(wordfor(word,tag)inbrown_news_taggedif
with('NNS'))#提取词性标注为复数的词
#word_double=st(wordfor(word,tag)inbrown_news_with('N')
with('NNS'))
#提取词性标注为单数的词
double_keys=list(word_())
single_keys=list(word_())
a=[]
b=[]
c=[]
d=[]
e=[]
w=0
foriinrange(len(double_keys)):
x=porter_(double_keys[i])
(x)#提取常见复数的词干放进a中
forjinrange(len(single_keys)):
20/32
y=porter_(single_keys[j])
(y)#提取常见单数的词干,放进b
#print(a)
#print(b)
fornina:
forminb:
ifm==n:
(w)#单复数词干相同的字数的放进c
w=w+1#统计
#print(c)
#forginc:
#(double_keys[g])
#d=[double_keys[g]forginc]
#print(d)
foriinrange(len(d)):
ifd[i]==d[i-1]:
(d[i])#去除重复的词
#print(e)
result=list(t(e))#结果
(key=)
print('常以复数不以单数出现的词有:')
foriinresult:
ifi[-2]=="'":
(i)
foriinresult:
print(i)
实验二
#-*-coding:utf-8-*-
"""
CreatedonThuApr1212:58:362018
@author:sxt
"""
#-*-coding:utf-8-*-
MAXLEN=4
importcodecs
importre
#语料
#word_freq_分词词典
#pku_未经过分词的文档文件,测试集
#pku_test_经过分词的文档文件,金标语料库
21/32
words_test=('pku_','rb')
test=words_().decode('gbk')#需要分词的
#金标语料库
gold_words=('pku_test_','rb')
gold=gold_().decode('gbk')
gold_()
#标准词典
dic=('word_freq_','rb')
diclines=nes()#按行读取
()
'''
foriindiclines:
len(i)
print(max(i))
'''
#分别存储四字词、三字词和二字词
char_4=[]
char_3=[]
char_2=[]
#j=0
foriindiclines:#词典每一行,解码
a=(r'([d]+s+)','',('gb18030','ignore').split('rn')[0])
#print((),len(()))
b=()
c=len(b)
ifc==4:
char_(b)
elifc==3:
char_(b)
el:
char_(b)
#j+=1;
char_4=t(char_4)#去重
char_3=t(char_3)
char_2=t(char_2)
ntences=[]
22/32
dicslines=('rn')#之前定义,读取的未分词数据
forntenindicslines:
(nten)#全放到句子里
#ntences=input("请输入字符串:")
temp=''
result=('','w','utf-8')#建新文件,存结果
#print(ntences[k],len(ntences[k]))
k=0
#正向最大匹配算法
whilek!=len(ntences):
i=0
whilei
ifi+MAXLEN
possible_word=ntences[k][i:i+MAXLEN].split('rn')[0]#取长度为4
ifpossible_wordinchar_4:#四字词,能查到
temp+=possible_word+''
#(possible_word+'')
i+=MAXLEN#i每次变化不同,取词串的长度
continue
ifi+3
possible_word=ntences[k][i:i+3].split('rn')[0]
ifpossible_wordinchar_3:
temp+=possible_word+''
#(possible_word+'')
i+=3
continue
ifi+2
possible_word=ntences[k][i:i+2].split('rn')[0]
ifpossible_wordinchar_2:
temp+=possible_word+''
#(possible_word+'')
i+=2
continue
possible_word=ntences[k][i]#为单字
temp+=possible_word+''
i+=1
k+=1#k值变化
23/32
temp=()#方法用于移除字符串头尾指定的字符(默认为空格)
(temp)#待切分的词结果写入temp
()
print(temp)
print('最大匹配分词结束')
result=('','rb','utf-8')
my=()
()
#print(gold)
gold_split_enter=('rn')#切片
gold=''
foriingold_split_enter:
gold+=i
gold_list=().split('')#split通过指定分隔符对字符串进行切片strip返回移除字符
串头尾指定的字符生成的新字符串。
my_list=('')#切片,去自己切分的结果
gold_len=len(gold_list)#验证
my_len=len(my_list)#自己的结果长度
correct=0
gold_before=''
my_before=''
i=1
j=1
gold_before+=gold_list[0]
my_before+=my_list[0]
ifgold_before==my_beforeandgold_list[0]==my_list[0]:#计算对的个数
correct+=1
whileTrue:
ifgold_list[i]==my_list[j]:
correct+=1
gold_before+=str(gold_list[i])
24/32
my_before+=str(my_list[j])
i+=1
j+=1
eliflen(gold_before)
gold_before+=str(gold_list[i])
i+=1
eliflen(gold_before)>len(my_before):
my_before+=str(my_list[j])
j+=1
elifgold_list[i]!=my_list[j]:
gold_before+=str(gold_list[i])
my_before+=str(my_list[j])
i+=1
j+=1
ifi>=len(gold_list)andj>=len(my_list):
#print('i',i,'j',j)
break
P=correct/my_len#准确率=系统输出正确词的个数/系统输出词的个数
R=correct/gold_len#召回率=系统输出正确词的个数/金标语料库中词的个数
F=(2*P*R)/(P+R)
print('准确率:',P)
print('召回率R:',R)
print('F-测度:',F)
实验2-1
#-*-coding:utf-8-*-
"""
CreatedonThuApr1215:41:022018
@author:sxt
"""
MAXLEN=4
importcodecs
importre
#word_freq_分词词典
#标准词典
dic=('word_freq_','rb')
diclines=nes()#按行读取
()
25/32
#分别存储四字词、三字词和二字词
char_4=[]
char_3=[]
char_2=[]
#j=0
foriindiclines:#词典每一行,解码
a=(r'([d]+s+)','',('gb18030','ignore').split('rn')[0])#分开写就好,太
长的不行
#print((),len(()))
b=()
c=len(b)
ifc==4:
char_(b)
elifc==3:
char_(b)
el:
char_(b)
char_4=t(char_4)#去重
char_3=t(char_3)
char_2=t(char_2)
#s1=input("请输入任意字符串:")
temp=''
ntence=input("请输入任意字符串:")
ntences=[]
dicslines=('rn')#之前定义,读取的未分词数据
forntenindicslines:
(nten)#全放到句子里
k=0
whilek!=len(ntences):#对每个字符
i=0
whilei
ifi+MAXLEN
possible_word=ntences[k][i:i+MAXLEN].split('rn')[0]#取长度为4
ifpossible_wordinchar_4:#四字词,能查到
temp+=possible_word+''
#(possible_word+'')
26/32
i+=MAXLEN#i每次变化不同,取词串的长度
continue
ifi+3
possible_word=ntences[k][i:i+3].split('rn')[0]
ifpossible_wordinchar_3:
temp+=possible_word+''
#(possible_word+'')
i+=3
ifpossible_wordinchar_2:
continue
ifi+2
possible_word=ntences[k][i:i+2].split('rn')[0]
ifpossible_wordinchar_2:
temp+=possible_word+''
#(possible_word+'')
i+=2
continue
possible_word=ntences[k][i]#为单字
temp+=possible_word+''
i+=1
k+=1#k值变化
temp=()#方法用于移除字符串头尾指定的字符(默认为空格)
print('分词结果为:')
#(temp)
print(temp)
实验3
#-*-coding:utf-8-*-
"""
CreatedonFriApr1311:08:542018
@author:sxt
"""
#importjieba
#importre
#importos
'''
#file=open('E:/课件/2018/自然语言处理/自然语言处理实验/题目三/题目一/财经
/',encoding='gb18030',errors='ignore')
27/32
#file=open(r'题目一/测试集/教育/','rb')
s=().decode('utf-8')
#预处理
#去标签用正则表达式,获得content内容
dr=e(r'<.*?>')
new=(r'',s)#去除html标签后的文本
content=e("rn","").strip()#删除换行和多余的空格
#先分词,再去掉停用词
word=(content,cut_all=Fal)
words=("".join(word))
#print("精确模式:"+"".join(words))
#停用词表
'''
'''
f=open(r'题目一/训练集/财经/','w')
final=[]
foriinwords:
ifi>u'u4e00'andi<=u'u9fa5':
(i)
forjinfinal:
(j+'')
#(words).encode('utf-8')
()
stop_words=open(r'E:/课件/2018/自然语言处理/自然语言处理实验/题目三/题目一/停
词.txt','rb')
stopwords=stop_().decode('utf-8')
#后发现sklearn里面的ti-idf可以自己去停用词,所有不需要以下结果
st=[]
forlineinstopwords:
line=()
line=('utf-8').decode('utf-8-sig')
(line)
final=[]
foriinwords:
#a=()
#forjina:
#print(j)
ifinotinst:
ifi>u'u4e00'andi<=u'u9fa5':
(i)
forkinfinal:
28/32
(k+'')
()
'''
'''
#自动分词
defsavefile(spath,content):
fp=open(spath,"w")
(content)
()
defreadfile(path):
fp=open(path,"r")
content=().decode('utf-8')
()
returncontent
#测试集路径
test_path="D:/spyder程序/题目一/测试集/"
#训练集
train_path="D:/spyder程序/题目一/训练集/"
catolist=r(test_path)#获取该目录下所有子目录
formydirincatolist:
test_dir=test_path+mydir+"/"#测试集test=corpus
train_dir=train_path+mydir+"/"#训练集g=train
(train_dir):
rs(test_dir)
file_list=r(test_dir)
forfile_pathinfile_list:#测试集分词
fullname=test_dir+file_path
content=readfile(fullname).strip()#读取文件内容
content=e("rn","").strip()#删除换行和多余的空格
conent_g=jieba_cut(content)
savefile(test_dir+file_path,"".join(content_g))
print('分词结束')
'''
portBunch
bunch=Bunch(target_name=[],label=[],filenames=[],contents=[])
#target_name类别集合(健康、教育、财经)
#label所有文本标签
#filenames文本文件的名字(等)
#contents分词后文件
29/32
#使用词向量空间
importpickle
importsys
#reload(sys)
importos
defreadfile(path):
withopen(path,"rb")asfp:
content=()
returncontent
defcorpus2Bunch(wordbag_path,train_path):
catelist=r(train_path)
bunch=Bunch(target_name=[],label=[],filenames=[],contents=[])
_(catelist)
formydirincatelist:
class_path=train_path+mydir+"/"
file_list=r(class_path)
forfile_pathinfile_list:
fullname=class_path+file_path
(mydir)
(fullname)
(readfile(fullname))
#将bunch存到wordbag_path里面
withopen(wordbag_path,"wb")asfile_obj:
(bunch,file_obj)
print("构建文本对象结束")
if__name__=="__main__":
#对训练集
wordbag_path="题目一/训练集/train_"#Bunch存储路径
train_path="题目一/训练集/"
corpus2Bunch(wordbag_path,train_path)
#对测试集Bunch化
wordbag_path="题目一/测试集/test_"#Bunch存储路径
train_path="题目一/测试集/"
corpus2Bunch(wordbag_path,train_path)
#-*-coding:utf-8-*-
"""
CreatedonSatApr1417:17:222018
@author:sxt
30/32
"""
#构造词向量空间
#对训练集中所有文本文件统一到一个向量空间中,方便提取特征
importpickle
importsys
fromimpimportreload
reload(sys)
importos
portBunch
e_portTfidfVectorizer
defreadfile(path):
withopen(path,"rb")asfp:
content=().decode('utf-8')
returncontent
defreadbunchobj(path):
withopen(path,"rb")asfile_obj:
bunch=(file_obj)
returnbunch
#写入bunch对象
defwritebunchobj(path,bunch_obj):
withopen(path,"wb")asfile_obj:
(bunch_obj,file_obj)
#创建TF-IDF词向量空间
defvector_space(stopword_path,bunch_path,space_patch,train_tfidf_path=None):
stopwordlist=readfile(stopword_path).splitlines()#读取停用词
bunch=readbunchobj(bunch_path)#导入分词后的词向量bunch对象
tfidfspace=Bunch(target_name=_name,label=,filenames=
names,tdm=[],words={})
#tdm放计算得到的权重矩阵
#words词典
#vectorizer=CountVectorizer()#构建一个计算词频(TF)的
#transformer=TfidfTransformer()#构建一个计算TF-IDF
#tfidf=_transform(_transform(corpus)
iftrain_tfidf_pathisnotNone:
trainbunch=readbunchobj(train_tfidf_path)
=
vectorizer=TfidfVectorizer(stop_words=stopwordlist,sublinear_tf=True,max_df=0.5,words=tr
31/32
)
=_transform(ts)
el:
vectorizer=TfidfVectorizer(stop_words=stopwordlist,sublinear_tf=True,
max_df=0.5)
=_transform(ts)
=_
writebunchobj(space_path,tfidfspace)
#vectorizer=TfidfVectorizer(stop_words=stopwordlist,sublinear_tf=True,max_df=0.5)
#sublinear_tf:计算tf值采用亚线性策略。比如,我们以前算tf是词频,现在用1+log(tf)
来充当词频。
#max_df:文档频率,设定为0.5,超过50%的差异性不大,对分类无太大影响
#=_transform(ts)
#=_
#writebunchobj(space_path,tfidfspace)
print("TF-IDF词向量空间创建完成")
if__name__=='__main__':
stopword_path="停词.txt"
bunch_path="题目一/训练集/train_"
space_path="题目一/训练集/"#词向量空间
vector_space(stopword_path,bunch_path,space_path)
bunch_path="题目一/测试集/test_"
space_path="题目一/测试集/"
train_tfidf_path="题目一/训练集/"
vector_space(stopword_path,bunch_path,space_path,train_tfidf_path)
#-*-coding:utf-8-*-
"""
CreatedonSatApr1418:13:272018
@author:sxt
"""
#portBunch
importpickle
_bayesimportMultinomialNB#多项式贝叶斯算法
_bayesimportBernoulliNB
fromsklearnimportsvm
#因为是多变量的
defreadbunchobj(path):
32/32
withopen(path,"rb")asfile_obj:
bunch=(file_obj)
returnbunch
trainpath="题目一/训练集/"
#trainpath=""
train_t=readbunchobj(trainpath)
testpath="题目一/测试集/"
#testpath=""
test_t=readbunchobj(testpath)
#训练分类器
clf=SVC(C=0.1)
#clf=(C=0.1,kernel='poly',degree=3)
#(train_,train_)
clf=MultinomialNB(alpha=0.001).fit(train_,train_)#朴素贝叶斯里的多项
式模型
#clf2=BernoulliNB(alpha=0.001).fit(train_,train_)#朴素贝叶斯里的伯努
利模型
predicted=t(test_)
#predicted=t(test_)
'''
forflabel,file_name,expct_cateinzip(test_,test_mes,predicted):
ifflabel!=expct_cate:
print(file_name,":实际类别:",flabel,"-->预测类别:",expct_cate)
print("预测完毕")
'''
#计算分类精度:
fromsklearnimportmetrics
defmetrics_result(actual,predict):
print('准确率:{0:.3f}'.format(ion_score(actual,
predict,average='weighted')))
print('召回率:{0:0.3f}'.format(_score(actual,
predict,average='weighted')))
print('F测评:{0:.3f}'.format(metrics.f1_score(actual,predict,average='weighted')))
metrics_result(test_,predicted)
本文发布于:2022-12-30 00:16:52,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/56311.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |