中文信息处理实验2——基于词表的分词

目录

实验目的:

实验要求:

参考代码:

实验结果:


实验目的:

        加深对汉语文本信息处理基础理论及方法的认识和了解,锻炼和提高分析问题、解决问题的能力。通过对具体项目的任务分析、数据准备、算法设计和编码实现以及测试评价几个环节的练习,基本掌握实现一个自然语言处理系统的基本过程。

实验要求:

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.结巴分词

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值