(2条消息) 基于词典的中文分词

说明

当前自然语言处理的理论都是基于西方语言学,而这些语言学结论大部分是从英语等语言中归纳出来的。那么问题来了:
对汉语适用吗?
不知道有没有人想过想过这个问题,反正多少年了搞中文信息处理的人都是这么用的,我们很自然地接受了语法、词、句法等概念,于是,中文信息处理的第一步便是所谓的“分词”。但我这里保留自己的观点:我认为汉语有没有“词”“句法”等概念还待研究。
这也是我为什么打算不做自然语言处理方向的原因。
话虽这么说,但是课程大作业还是要做的……之前倔强地想用c语言实现中文分词,被同学劝退了。于是入门Python,以下程序是本人人生第一个Python程序。小白一个,瞎写着玩的。
环境:pycharm

算法描述

基于词典的前向最大匹配算法是最粗糙地、最简单的实现中文分词功能的手段。给我一个词典,找出词典中最长词的字数(m),再给我段落,从头开始,先看前m个字,是否在词典里,不在的话看m-1个字符串是不是在词典里,以此类推,找到一个词就输出判断剩余文本。
后向和前向的差别就是它不是从头开始,而是从最后开始,看倒数第m个字符串是不是。

代码

为了方便,代码是这么运行的:先将要分词的文本写成str.txt文本文档放在一样的目录里;词典文件名dictionary.txt也放在同一目录下;结果会保存在data.txt文件中。
先放前向的代码(我觉得我的注释还是很详细的……):

#子函数:判断输入的str是否在词典里def search(str):    lens=len(str)    j=0    for i in range(lendict):        temp=dict[i:i+lens]        if(str==temp):            j=1 #存在的话返回1            break    return j#主函数dic=open("dictionary.txt", "r", encoding="utf-8")dict=dic.read()lendict=len(dict) #字典总长度#词典中最长词的长度m=5str=open("str.txt","r",encoding="utf-8")sentence=str.read()n=len(sentence) #待切分句子总长度j=0p=0word='F 'while(p<n):    if(n<=m):        print(sentence)        break    elif(n>m):        e=p+m        i=0        while(j!=1):            if(p>n):                p=n            #如果只有一个字直接输出            if(len(sentence[p:e-i])==1):                word=word+sentence[p:e-i]+' '                p=p+1                e=p+(m-1)                break            #调用子函数判断            j=search(sentence[p:e-i])            if(j==1):                word=word+sentence[p:e-i]+' '                p=p+len(sentence[p:e-i])                e=p+(m-1)                j=0                i=0                break            i=i+1with open('data.txt','a+',encoding='utf-8') as f:    f.write(word+'\n')print(word[2:len(word)])dic.close()str.close()

缺点很明显:暴力搜索,没有技巧可言。
再放后向的:

#子函数:判断输入的str是否在词典里def search(str):    lens=len(str)    j=0    for i in range(lendict):        temp=dict[i:i+lens]        if(str==temp):            j=1 #存在的话返回1            break    return j#主函数dic=open("dictionary.txt", "r", encoding="utf-8")dict=dic.read()lendict=len(dict) #字典总长度#词典中最长词的长度m=5str=open("str.txt","r",encoding="utf-8")sentence=str.read()n=len(sentence) #待切分句子总长度j=0p=nword=' B'while(p>0):    if(n<=m):        print(sentence)        break    elif(n>m):        b=p-m        i=0        while(j!=1):            if(p<m):                b=0            #如果只有一个字直接输出            if(len(sentence[b+i:p])==1):                word=sentence[b+i:p]+' '+word                p=p-1                b=p-m                break            #调用子函数判断            j=search(sentence[b+i:p])            if(j==1):                word=sentence[b+i:p]+' '+word                p=p-len(sentence[b+i:p])                b=p-m                j=0                i=0                break            i=i+1with open('data.txt','a+',encoding='utf-8') as f:    f.write('B '+word[0:len(word)-2]+'\n')print(word[0:len(word)-2])dic.close()str.close()

结果

最后放一张结果图:依次运行前向、后向后的结果:

(0)

相关推荐