赞
踩
中文分词问题主要来源于:在汉语中,句子是以字为单位的,但是语义理解仍然是需要以词为单位,所以也就存在了中文分词问题。
主要的技术可以分为:规则分词、统计分词以及混合分词(规则+统计)
基于规则的分词是一种机械分词,主要依赖于维护词典,在切分时将与剧中的字符串与词典中的词进行匹配。
主要的切分方法包括三种:正向最大匹配法、逆向最大匹配法以及双向最大匹配法。
#定义正向最大匹配法类 class MM(object): def __init__(self): self.window_size=3 #词典中最长字符串包含的字数 def cut(self,text): result=[] index=0 text_length=len(text) dic=['研究','研究生','生命','命','的','起源'] #词典 while text_length>index: #只要还有字就进行匹配 for size in range(self.window_size+index,index,-1): #生成可能长度 piece=text[index:size] if piece in dic: index=size-1 #匹配成功将index设置为匹配成功的最后一个字的位置 break index=index+1 #开始下一个字符串的匹配 result.append(piece+'----') print(result) if __name__=='__main__': text='研究生命的起源' tokenizer=MM() tokenizer.cut(text)
结果如下所示:
[‘研究生----’, ‘命----’, ‘的----’, ‘起源----’]
#定义逆向最大匹配法类 class RMM(object): def __init__(self): self.window_size=3 def cut(self,text): result=[] index=len(text) #从文本末尾开始 dic=['研究','研究生','生命','命','的','起源'] while index>0: for size in range(index-self.window_size,index): piece=text[size:index] #找到最后几个字组成的字符串 if piece in dic: index=size+1 #将位置更新为匹配到的最后一个字的位置 break index=index-1 #开始新的位置 result.append(piece+'----') result.reverse() #由于从最后进行匹配,所以顺序是反的,需要颠倒过来 print(result) if __name__=='__main__': text='研究生命的起源' tokenizer=RMM() tokenizer.cut(text)
结果如下所示:
[‘研究----’, ‘生命----’, ‘的----’, ‘起源----’]
#定义双向最大匹配法的类 class BMM(object): def __init__(self): self.window_size=3 self.result_MM=[] self.result_RMM=[] self.num_MM=0 self.num_RMM=0 #正向最大 def MM(self,text): index=0 text_length=len(text) dic=['研究','研究生','生命','命','的','起源'] #词典 while text_length>index: #只要还有字就进行匹配 for size in range(self.window_size+index,index,-1): #生成可能长度 piece=text[index:size] if piece in dic: index=size-1 #匹配成功将index设置为匹配成功的最后一个字的位置 break index=index+1 #开始下一个字符串的匹配 self.result_MM.append(piece+'----') if len(piece)==1: self.num_MM+=1 #逆向最大 def RMM(self,text): index=len(text) #从文本末尾开始 dic=['研究','研究生','生命','命','的','起源'] while index>0: for size in range(index-self.window_size,index): piece=text[size:index] #找到最后几个字组成的字符串 if piece in dic: index=size+1 #将位置更新为匹配到的最后一个字的位置 break index=index-1 #开始新的位置 self.result_RMM.append(piece+'----') if len(piece)==1: self.num_RMM+=1 self.result_RMM.reverse() #由于从最后进行匹配,所以顺序是反的,需要颠倒过来 def cut(self,text): if len(self.result_MM)>len(self.result_RMM): result=self.result_RMM elif len(self.result_MM)<len(self.result_RMM): result=self.result_MM elif len(self.result_MM)==len(self.result_RMM): if self.result_MM==self.result_RMM: result=self.result_RMM else: if self.num_MM>self.num_RMM: result=self.result_RMM else: result=self.result_MM print(result) if __name__=='__main__': text='研究生命的起源' tokenizer=BMM() tokenizer.MM(text) tokenizer.RMM(text) tokenizer.cut(text)
结果如下所示:
[‘研究----’, ‘生命----’, ‘的----’, ‘起源----’]
主要思想:将每个词视作由字组成,如果相连的字在不同文本中出现次数越多,就越可能是一个词。
基于统计的分词一般有以下两步:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。