小技巧 - 中文detokenize(基于规则)

对于已经分词的中文句子,如何把他们粘合起来,成为一个正常的句子呢?

第一个反应,当然是去掉空格。
但是,中文句子里也经常有英文,或者其他语言的内容。一位去掉空格当然不可取。

那么,只去掉中文文字附近的空格呢?
这是本人想到的处理方法,如果您有其他方式,欢迎留言反馈给我。

下面就是根据这个想法实现的代码:


import re 

pat_zh = '[\u4e00-\u9fa5]+'
pat_en = '[a-zA-Z]+' 

# 去掉指定索引的字符
def remove_char(str, idx):
    front = str[:idx]  # up to but not including n
    back = str[idx + 1:]  # n+1 till the end of string
    return front + back

# 去除符号前后多余的空格
punc_arr = ',,、::.。*&))]】》>%!!?"”'  # 符号前不需要空格
punc_arr_left='(([【《<“'   # 符号后不需要空格
def rm_blank_punc(text):

    # 去除符号前多余的空格 
    if text.count(' ') > 0:
        for str in punc_arr:
            bstr = ' '+str
            text = text.replace(bstr, str)
    
    # 符号右侧多余的空格
    if text.count(' ') > 0:
        for str in punc_arr_left:
            bstr = str + ' '
            text = text.replace(bstr, str)
            
    return text
      
# 将多个空格变为一个空格
def rm_blank_sp(text):
    text = text.replace('\t', ' ')
    text = re.subn('\s{2,}', ' ', text)[0]
    return text.strip()


# 删除英文中的常见的错误空白字符
def en_detok(sent): 
    sent = sent.replace(" 's", "'s").replace(" 've", "'ve").replace(" 'm", "'m").replace(" 't", "'t")  
    sent = rm_blank_punc(sent) 
    sent = rm_blank_sp(sent) 
    return sent

def zh_detok(text):

    text = text.strip()
    # 去掉中文前后的空格
    index = 0
    while 1:
        index = text.find(' ', index)
        # print('\n', index )
        if index == -1:break

        l_char = text[index - 1]
        # print('l_char : ', l_char)
        if re.match(pat_zh, l_char) != None:
            text = remove_char(text, index)
            continue

        if index + 1 <= len(text):
            r_char = text[index + 1]
            # print('r_char : ', r_char)
            if re.match(pat_zh, r_char) != None:
                text = remove_char(text, index)
                continue
          
        index += 1   

    if len(re.findall(pat_en, text) )> 1:text = en_detok(text)
    # print(text)
    text = rm_blank_punc(text) 
    text = rm_blank_sp(text)
    return text 

if __name__ == '__main__':
    
    text = '你好 , 哈哈 吃了吗 ? '
    print(zh_detok(text)) # 你好,哈哈吃了吗?

伊织 2022-11-09(三)

你可能感兴趣的:(NLP,nlp,detokenize,中文,分词)