中文自然语言预处理总结

目录

中文文本预处理总结

1、文本数据准备

2、全角与半角的转化

3、文本中大写数字转化为小写数字

4、文本中大写字母转化为小写字母

5、文本中的表情符号去除(只保留中英文和数字)

6、去除文本中所有的字符(只保留中文)

7、中文文本分词

8、中文文本停用词过滤

9、将清洗后的数据写入CSV文件


中文文本预处理总结

1、文本数据准备

(1)使用已有的语料库

(2)网络爬虫获取自己的语料库(可以使用beautifulsoup等爬虫工具


#读取文件列表数据,返回文本数据的内容列表和标签列表
def filelist_contents_labels(filelist):
    contents=[]
    labels = []
    for file in filelist:
        with open(file, "r", encoding="utf-8") as f:
            for row in f.read().splitlines():
                sentence=row.split('\t')
                contents.append(sentence[-1])
                if sentence[0]=='other' :
                    labels.append(0)
                else:
                    labels.append(1)
    return contents,labels

2、全角与半角的转化

在自然语言处理过程中,全角、半角的的不一致会导致信息抽取不一致,因此需要统一。中文文字永远是全角,只有英文字母、数字键、符号键才有全角半角的概念,一个字母或数字占一个汉字的位置叫全角,占半个汉字的位置叫半角。标点符号在中英文状态下、全半角的状态下是不同的。

有规律(不含空格):全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E);半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)

特例:空格比较特殊,全角为 12288(0x3000),半角为 32(0x20)

#全角转半角
def full_to_half(sentence):      #输入为一个句子
    change_sentence=""
    for word in sentence:
        inside_code=ord(word)
        if inside_code==12288:    #全角空格直接转换
            inside_code=32
        elif inside_code>=65281 and inside_code<=65374:  #全角字符(除空格)根据关系转化
            inside_code-=65248
        change_sentence+=chr(inside_code)
    return change_sentence

ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。

#半角转全角
def hulf_to_full(sentence):      #输入为一个句子
    change_sentence=""
    for word in sentence:
        inside_code=ord(word)
        if inside_code==32:    #半角空格直接转换
            inside_code=12288
        elif inside_code>=32 and inside_code<=126:  #半角字符(除空格)根据关系转化
            inside_code+=65248
        change_sentence+=chr(inside_code)
    return change_sentence

3、文本中大写数字转化为小写数字

#大写数字转换为小写数字
def big2small_num(sentence):
    numlist = {"一":"1","二":"2","三":"3","四":"4","五":"5","六":"6","七":"7","八":"8","九":"9","零":"0"}
    for item in numlist:
        sentence = sentence.replace(item, numlist[item])
    return sentence

4、文本中大写字母转化为小写字母

#大写字母转为小写字母
def upper2lower(sentence):
    new_sentence=sentence.lower()
    return new_sentence

5、文本中的表情符号去除(只保留中英文和数字)

使用正则表达式

#去除文本中的表情字符(只保留中英文和数字)
def clear_character(sentence):
    pattern1= '\[.*?\]'     
    pattern2 = re.compile('[^\u4e00-\u9fa5^a-z^A-Z^0-9]')   
    line1=re.sub(pattern1,'',sentence)
    line2=re.sub(pattern2,'',line1)   
    new_sentence=''.join(line2.split()) #去除空白
    return new_sentence

6、去除文本中所有的字符(只保留中文)

#去除字母数字表情和其它字符
def clear_character(sentence):
    pattern1='[a-zA-Z0-9]'
    pattern2 = '\[.*?\]'
    pattern3 = re.compile(u'[^\s1234567890::' + '\u4e00-\u9fa5]+')
    pattern4='[’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]+'
    line1=re.sub(pattern1,'',sentence)   #去除英文字母和数字
    line2=re.sub(pattern2,'',line1)   #去除表情
    line3=re.sub(pattern3,'',line2)   #去除其它字符
    line4=re.sub(pattern4, '', line3) #去掉残留的冒号及其它符号
    new_sentence=''.join(line4.split()) #去除空白
    return new_sentence

7、中文文本分词

本文使用的是jieba分词。

8、中文文本停用词过滤

#去除停用词,返回去除停用词后的文本列表
def clean_stopwords(contents):
    contents_list=[]
    stopwords = {}.fromkeys([line.rstrip() for line in open('data/stopwords.txt', encoding="utf-8")]) #读取停用词表
    stopwords_list = set(stopwords)
    for row in contents:      #循环去除停用词
        words_list = jieba.lcut(row)
        words = [w for w in words_list if w not in stopwords_list]
        sentence=''.join(words)   #去除停用词后组成新的句子
        contents_list.append(sentence)
    return contents_list

9、将清洗后的数据写入CSV文件

# 将清洗后的文本和标签写入.csv文件中
def after_clean2csv(contents, labels): #输入为文本列表和标签列表
    columns = ['contents', 'labels']
    save_file = pd.DataFrame(columns=columns, data=list(zip(contents, labels)))
    save_file.to_csv('data/clean_data.csv', index=False, encoding="utf-8")

 

全部评论

相关推荐

最近又搬回宿舍了,在工位坐不住,写一写秋招起伏不断的心态变化,也算对自己心态的一些思考表演式学习从开始为实习准备的时候就特别焦虑,楼主一开始选择的是cpp后端,但是24届这个方向已经炸了,同时自己又因为本科非92且非科班,所以感到机会更加迷茫。在某天晚上用java写出hello&nbsp;world并失眠一整晚后选择老本行干嵌入式。理想是美好的,现实情况是每天忙但又没有实质性进展,总是在配环境,调工具,顺带还要推科研。而这时候才发现自己一直在表演式学习,徘徊在设想如何展开工作的循环里,导致没有实质性进展。现在看来当时如果把精力专注在动手写而不是两只手端着看教程,基本功或许不会那么差。实习的焦虑5月,楼主...
耶比:哲学上有一个问题,玛丽的房间:玛丽知道眼睛识别色彩的原理知道各种颜色,但是她生活在黑白的房间里,直到有一天玛丽的房门打开了她亲眼看到了颜色,才知道什么是色彩。我现在最大可能的减少对非工作事情的思考,如果有一件事困扰了我, 能解决的我就直接做(去哪里或者和谁吵架等等……),解决不了的我就不想了,每一天都是最年轻的一天,珍惜今天吧
投递比亚迪等公司10个岗位 > 秋招被确诊为…… 牛客创作赏金赛
点赞 评论 收藏
分享
头像
11-27 14:28
长沙理工大学
刷算法真的是提升代码能力最快的方法吗?&nbsp;刷算法真的是提升代码能力最快的方法吗?
牛牛不会牛泪:看你想提升什么,代码能力太宽泛了,是想提升算法能力还是工程能力? 工程能力做项目找实习,算法也分数据结构算法题和深度学习之类算法
点赞 评论 收藏
分享
jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
头像
10-22 19:18
上海大学 后端
jopajhhdjwnqk:水印都叠杀人书了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务