分词实验指导_第1页
分词实验指导_第2页
分词实验指导_第3页
分词实验指导_第4页
分词实验指导_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验二、中文分词 MAXLEN=4

importcodecs

#importsys

#语料

corpus=codecs.open('F:\\2018课件\自然语言处理\lkx_自然语言处理实验\分词实验\pku_test.txt','r','UTF-8')

corpusReader=corpus.read()

corpus.close()

#字典

dic=codecs.open('F:\\2018课件\自然语言处理\lkx_自然语言处理实验\分词实验\word_freq_list.txt','r','UTF-8')

diclines=dic.readlines()

dic.close()

#分别存储四字词、三字词和二字词

char_4=[]

char_3=[]

char_2=[]

foriindiclines:

iflen(i.decode().split('\r\n','rb')[0])==4:

char_4.append(i.decode().split('\r\n')[0])

eliflen(i.decode().split('\r\n')[0])==3:

char_3.append(i.decode().split('\r\n')[0])

else:

char_2.append(i.decode().split('\r\n')[0])

char_4=set(char_4)

char_3=set(char_3)

char_2=set(char_2)

sentences=[]

corpuslines=corpusReader.split('\r\n')

forsentenincorpuslines:

sentences.append(senten)

print('Pleasewaitafewseconds...')

temp=''

segResult=codecs.open('divide_result.txt','w','utf-8')

k=0

whilek!=len(sentences):

i=0

whilei<len(sentences[k]):

ifi+MAXLEN<len(sentences[k]):

possible_word=sentences[k][i:i+MAXLEN].split('\r\n')[0]

ifpossible_wordinchar_4:

temp+=possible_word+''

#segResult.write(possible_word+'')

i+=MAXLEN

continue

ifi+3<len(sentences[k]):

possible_word=sentences[k][i:i+3].split('\r\n')[0]

ifpossible_wordinchar_3:

temp+=possible_word+''

#segResult.write(possible_word+'')

i+=3

continue

ifi+2<len(sentences[k]):

possible_word=sentences[k][i:i+2].split('\r\n')[0]

ifpossible_wordinchar_2:

temp+=possible_word+''

#segResult.write(possible_word+'')

i+=2

continue

possible_word=sentences[k][i]

temp+=possible_word+''

#segResult.write(possible_word+'')

i+=1

#segResult.write('\r\n')

k+=1

temp=temp.strip()

segResult.write(temp)

segResult.close()

print('Segmentationends,calculatingprecisionrate,recallrateandf-score.')

segResult=codecs.open('divide_result.txt','r','utf-8')

my=segResult.read()

segResult.close()

gold_corpus=codecs.open('此处为金标分词结果路径','r','utf-8')

gold=gold_corpus.read()

gold_corpus.close()

gold_split_enter=gold.split('\r\n')

gold=''

foriingold_split_enter:

gold+=i

gold_list=gold.strip().split('')

my_list=my.split('')

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

#sys.stdout.write(my_list[0])

whileTrue:

ifgold_before==my_beforeandgold_list[i]==my_list[j]:

correct+=1

#sys.stdout.write(my_list[j])

gold_before+=str(gold_list[i])

my_before+=str(my_list[j])

i+=1

j+=1

eliflen(gold_before)<len(my_before):

gold_before+=str(gold_list[i])

i+=1

eliflen(gold_before)>len(my_before):

my_before+=str(my_list[j])

j+=1

elifgold_before==my_beforeandgold_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):

break

precision=correct/my_len

recall=correct/gold_len

f_score=2*precision*recall/(precision+recall)

print('precisionrate:',precision)

print('recallrate:',recall)

print('f-score:',f_score)实验内容用最大匹配算法设计分词程序实现对文档分词,并计算该程序分词的召回率。可以输入任意句子,显示分词结果。实验数据:(1)word_freq_list.txt分词词典(2)pku_test.txt未经过分词的文档文件(3)pku_test_gold.txt经过分词的文档文件实验所采用的开发平台及语言工具开发平台:任意语言工具:任意实验的核心思想和算法描述核心思想:最大匹配算法算法描述:正向最大匹配法算法如下所示:逆向匹配法思想与正向一样,只是从右向左切分,这里举一个例子:输入例句: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作为分词结果,分词过程结束。importcodecs

#获得分词字典,存储为字典形式

f1=codecs.open('F:\\2018课件\自然语言处理\lkx_自然语言处理实验\分词实验\word_freq_list.txt','r',encoding='gbk')

dic={}

while1:

line=f1.readline()

iflen(line)==0:

break

term=line.strip().replace('\r\n','')#去除字符串两侧的换行符,避免取最大分词长度时出差错

dic[term]=1

f1.close

#获得需要分词的文本,为字符串形式

f2=codecs.open('F:\\2018课件\自然语言处理\lkx_自然语言处理实验\分词实验\pku_test.txt','r',encoding='gbk')

chars=f2.read().strip().replace('\r\n','')#去除字符串两侧的换行符,避免截词时出差错

f2.close

##获得停用词典,存储为字典形式

#f3=codecs.open('stoplis.txt','r',encoding='gbk')

#stoplis={}

#while1:

#line=f3.readline()

#iflen(line)==0:

#break

#term=line.strip()

#stoplis[term]=1

#f3.close

#正向最大匹配分词算法

#遍历分词字典,获得最大分词长度

max_chars=0

forkeyindic:

iflen(key)>max_chars:

max_chars=len(key)

#定义一个空列表来存储分词结果

words=[]

n=0

whilen<len(chars):

matched=0

foriinrange(max_chars,0,-1):

s=char

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论