目录
实验目的:
加深对汉语文本信息处理基础理论及方法的认识和了解,锻炼和提高分析问题、解决问题的能力。通过对具体项目的任务分析、数据准备、算法设计和编码实现以及测试评价几个环节的练习,基本掌握实现一个自然语言处理系统的基本过程。
实验要求:
1.基于第一次实验得到的词表,编写一个正向最大匹配分词程序。
2.编写一个评价程序,自动计算分词结果的准确率、召回率、F测度。
3.使用结巴、ICTCLAS分词系统、哈工大的LTP平台等分词功能,对人民日报语分词,然后对比自己的分词结果
参考代码:
print("任务1——分词系统:")
s1=input("请输入文本:") #小刚刚刚刚来过
s=""
Maxlen=5
if s1=="":#空
print(s)
else:
with open("词表.txt",'r',encoding='utf-8') as f2:
s3=f2.read().strip('\n')
while len(s1)!=0:
w=s1[:Maxlen]
while w not in s3:
if len(w)>1:#不在词表里,则去掉最后一个字
w = w[:-1]
else:
break
s = s + w + '/'
s1 = s1[len(w):]
print(s)
s1=input("请输入文本:") #小刚刚刚刚来过
s=""
Maxlen=5
if s1=="":#空
print(s)
else:
with open("词表.txt",'r',encoding='utf-8') as f2:
s3=f2.read().strip('\n')
while len(s1)!=0:
w=s1[:Maxlen]
while w not in s3:
if len(w)>1:#不在词表里,则去掉最后一个字
w = w[:-1]
else:
break
s = s + w + '/'
s1 = s1[len(w):]
print(s)
print("***************************************")
print("任务2——评价系统:")
#给每个字编号并分割
def sign(str):
l=[]
n=0 #n标记当前字的编号,从第0个开始
for w in str.split("/"):
if w!="":
x=n+len(w)
l.append((n,x-1))
n=x
return set(l)#返回集合,便于按位与
# s1="山西/大学/的/学生/毕业/后/留/在/了/山西大学/" #正确输出情况
# s2="山西大学/的/学生/毕业/后/留/在/了/山西/大学/" #系统实际输出
s1=s
s2=input("请输入正确输出:")
N1=s1.count("/") #测试集中的总词数4
N2=s2.count("/") #系统输出的总词数5
N3=len(sign(s1)&sign(s2)) #系统输出正确的词数3
def estimate(N1,N2,N3):
R=N3/N1
P=N3/N2
F=2*P*R/(P+R)
print("召回率为",R,"\n精确率为",P,"\nF测度为",F)
estimate(N1,N2,N3)
print("任务1——分词系统:")
s1=input("请输入文本:") #小刚刚刚刚来过
s=""
Maxlen=5
if s1=="":
print(s)
else:
with open("词表.txt",'r',encoding='utf-8') as f2:
s3=f2.read().strip('\n')
# if s3.__contains__("\n"):
# print(True)
while len(s1)!=0:
w=s1[:Maxlen]
while w not in s3:
if len(w)>1:
w = w[:-1]
else:
break
# if w in s3 or len(w)==1:
s = s + w + '/'
s1 = s1[len(w):]
print(s)
print("***************************************")
print("任务2——评价系统:")
#给每个字编号并分割
def sign(str):
l=[]
n=0 #n标记当前字的编号,从第0个开始
for w in str.split("/"):
if w!="":
x=n+len(w)
l.append((n,x-1))
n=x
return set(l)#返回集合,便于按位与
# s1="山西/大学/的/学生/毕业/后/留/在/了/山西大学/" #正确输出情况
# s2="山西大学/的/学生/毕业/后/留/在/了/山西/大学/" #系统实际输出
s1=s
s2=input("请输入正确输出:")
N1=s1.count("/") #测试集中的总词数4
N2=s2.count("/") #系统输出的总词数5
N3=len(sign(s1)&sign(s2)) #系统输出正确的词数3
def estimate(N1,N2,N3):
R=N3/N1
P=N3/N2
F=2*P*R/(P+R)
print("召回率为",R,"\n精确率为",P,"\nF测度为",F)
estimate(N1,N2,N3)
print("***************************************")
print("任务3——结巴系统")
#全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
#搜索引擎:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。---介于全模式和精确模式之间
#精确模式:试图将句子最精确地切开,适合文本分析;
#搜索引擎更注重召回率因为要保证的是不遗漏正确的分词,精确率可以差一点,比如说搜索一页得不到想要的结果,可以多搜几页
def sign2(list):
l=[]
n=0 #n标记当前字的编号,从第0个开始
for w in list:
if w!="":
x=n+len(w)
l.append((n,x-1))
n=x
return set(l)#返回集合,便于按位与
import jieba
if __name__ == '__main__':
str1 = '我去北京天安门广场跳舞'
a = jieba.lcut(str1, cut_all=True) # 全模式
print('全模式:{}'.format(a))
b = jieba.lcut(str1, cut_all=False) # 精简模式
print('精简模式:{}'.format(b))
c = jieba.lcut_for_search(str1) # 搜索引擎模式
print('搜索引擎模式:{}'.format(c))
s1=input("输入正确输出:")
N1=s1.count('/')
N2=len(b)
N3=len(sign(s1)&sign2(b))
print("结巴分词系统的评价:")
estimate(N1,N2,N3)
实验结果:
1.正向最大匹配分词程序
2.评价程序
3.结巴分词