第6章 实战之聊天语料处理

代码学习:

extract_conv.py文件:

函数1: 

def make_split(line):
    if re.match(r'.*([,…?!\.,!?])$', ''.join(line)):
        return []
    return [', ']

首先,定义函数 make_split():其主要实现功能是匹配开头为.*([,…?!\.,!?])$的字符串,若有这些字符串,将其用空格 表示。用空格 代替来连接line中的字符串。

re.match(r‘ ’)中,r的含义是精确匹配,防止转义(eg:\t表示空格,等)。

#注:.join()函数:

str = "-"
seq = ("a", "b", "c") # 字符串序列
print(str.join( seq )) #输出 a-b-c

. 匹配除换行符以外的任意字符

\w 匹配字母或数字或下划线或汉字 等价于 '[^A-Za-z0-9_]'。

\s 匹配任意的空白符

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束

\w能不能匹配汉字要视你的操作系统和你的应用环境而定

元字符(*),匹配0个或多个

元字符(?),匹配一个或者0个

元字符(+), 匹配一个或者多个

元字符(|), 表示"或",如A|B,其中A,B为正则表达式,表示匹配A或者B

元字符({})

正则表达式相关学习链接可看:正则表达式特殊符号及用法

                                                  正则表达式详解

eg:input:你好?我是韩梅梅...

     output:你好我是韩梅梅

—————————————————————————华丽分割线——————————————————————————

函数2:

def good_line(line):
    if len(re.findall(r'[a-zA-Z0-9]', ''.join(line)))>2:
        return False
    return True

在输入中找到是否含有a-z、A-Z或0-9这样的大小写英文字母和0-9数字。长度大于两个字符则返回Flase,否则返回True。

eg:

import re


def good_line(line):
    if len(re.findall(r'[a-zA-Z0-9]', ''.join(line)))>2:
        return False
    return True


#line = "今天天气不错,出去打球吗?一起来吧."
line = "今天天气不99错,出5去打球吗?一起3来吧."

new_line = good_line(line)
print(new_line)
print(len(re.findall(r'[a-zA-Z0-9]', ''.join(line))))

#输出:False
       4

—————————————————————————华丽分割线——————————————————————————

函数3:

def regular(sen):
    sen = re.sub(r'\.{3,100}', '…', sen) #将输入中重复三次以上的.转换为…。注转义符\:因为.表示匹配除了换行符外的任何字符,加上\之后仅仅表示 .这个具体符号
    sen = re.sub(r'…{2,100}', '…', sen) #将输入中重复两次次以上的…转换为…
    sen = re.sub(r'[,]{1,100}', ',', sen) #将输入中重复一次以上的"英文,"转换为“汉语的,”
    sen = re.sub(r'[\.]{1,100}', '。', sen) #将输入中出现一次以上的.转换成。,个人理解如果.重复三次以上,则与sen = re.sub(r'\.{3,100}', '…', sen)同义,否则出现一次或两次转换成。
    sen = re.sub(r'[\?]{1,100}', '?', sen) #将输入中出现一次以上的"英文?"转换成“中文?”个人理解/没有意义,因为?不需要转移,/没有意义。
    sen = re.sub(r'[!]{1,100}', '!', sen) #将输入中出现一次以上的"英文!"转换成“中文!”

    return sen

eg:

import re


def regular(sen):
    sen = re.sub(r'\.{3,100}', '…', sen) #将输入中重复三次以上的.转换为…。注转义符\:因为.表示匹配除了换行符外的任何字符,加上\之后仅仅表示 .这个具体符号
    sen = re.sub(r'…{2,100}', '…', sen) #将输入中重复两次次以上的…转换为…
    sen = re.sub(r'[,]{1,100}', ',', sen) #将输入中重复一次以上的"英文,"转换为“汉语的,”
    sen = re.sub(r'[\.]{1,100}', '。', sen) #将输入中出现一次以上的.转换成。,个人理解如果.重复三次以上,则与sen = re.sub(r'\.{3,100}', '…', sen)同义,否则出现一次或两次转换成。\可删除因为在[]内,特殊符号无其特殊意义。详情见https://www.cnblogs.com/LoveFishC/p/4218366.html
    sen = re.sub(r'[\?]{1,100}', '?', sen) #将输入中出现一次以上的"英文?"转换成“中文?”个人理解/没有意义,因为?不需要转移,/没有意义。自己认为可删除,而且因为在[]内,特殊符号无其特殊意义。
    sen = re.sub(r'[!]{1,100}', '!', sen) #将输入中出现一次以上的"英文!"转换成“中文!”

    return sen


#line = "今天天气不错,出去打球吗?一起来吧."
line = "今天天气不错.出去打球吗?一起来吧..."

new_line = regular(line)
print(line)
print(new_line)

#输出:今天天气不错.出去打球吗?一起来吧...
      #今天天气不错。出去打球吗?一起来吧…

 

      #两句话的意义相同,因为在[]中,特殊符号失去其特有意义
      sen = re.sub(r'[.]{3,100}', '…', sen)
      sen = re.sub(r'\.{3,100}', '…', sen)

—————————————————————————华丽分割线——————————————————————————

以上句子的清洗过程就大体结束了。

 

你可能感兴趣的:(python)