今天研究了一下中文分词,下面用两种简单的算法(正向最大匹配分词算法和逆向最大匹配分词算法)实现。
#字典生成
def load_dic(filename):
f=open(filename,'r',encoding='utf-8')
word_dic=set()
max_length=1
for line in f:
word=line.strip()
word_dic.add(word)
if len(word)>max_length:
max_length=len(word)
return max_length, word_dic
#正向最大匹配分词
def fmm_word_seg(sentence, word_dic, max_length):
begin=0
words=[]
while begin<len(sentence):
for end in range(min(begin+max_length, len(sentence)), begin, -1):
word=sentence[begin:end]
if word in word_dic or end==begin+1:
words.append(word)
break
begin=end
return words
max_len, word_dic=load_dic('lexicon.txt') #中文词汇库
words=fmm_word_seg(input(), word_dic, max_len)
for word in words:
print(word)
#字典生成
def load_dic(s):
words=s.split()
word_dic=set()
max_length=1
for word in words:
word_dic.add(word)
if len(word)>max_length:
max_length=len(word)
return max_length, word_dic
#逆向最大匹配分词
def fmm_word_seg(sentence, word_dic, max_length):
end=len(sentence)
words=[]
while end>0:
for begin in range(max(end-max_length, 0),end):
word=sentence[begin:end]
if word in word_dic or end==begin+1:
words.append(word)
break
end=begin
return words
max_len, word_dic=load_dic(input())
words=fmm_word_seg(input(), word_dic, max_len)
for i in range(len(words)-1,-1,-1):
print(words[i]) #逆序打印
两种算法略有不同,但总体思路类似。对于不同的中文句子,两种算法可能有的适用,有的不适用。例如
研究生命的起源
这句话,使用正向最大匹配分词算法时,会被分成
研究生 命 的 起源
,但使用逆向最大匹配分词算法就可以得到正确结果。当然逆向最大匹配分词算法也不是对所有句子都适用。
总的来看,两种算法都能一定程度上实现中文句子的分词,但都不完善,现阶段也没有百分百准确的分词算法,这一领域还有较大的研究空间。