wsj什么意思

更新时间:2022-12-30 00:16:52 阅读: 评论:0


2022年12月30日发(作者:streer)

“自然语言处理”实验报告

专业:智能科学与技术

班级: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小时内删除。

上一篇:comap
下一篇:adm是什么意思
标签:wsj什么意思
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图