自然语言处理-中文语料预处理

摘要:
自然语言处理-中文文本预处理最近,当我自学自然语言处理时,我发现第一次接触NLP非常困难。此外,我没有强大的编程基础,所以学习起来有点困难。然而,经过两周的学习,我已经掌握了一些简单的中英文语料库预处理操作。
自然语言处理——中文文本预处理

近期,在自学自然语言处理,初次接触NLP觉得十分的难,各种概念和算法,而且也没有很强的编程基础,学着稍微有点吃力。不过经过两个星期的学习,已经掌握了一些简单的中文、英文语料的预处理操作。写点笔记,记录一下学习的过程。

1、中文语料的特点

  第一点:中文语料中词与词之间是紧密相连的,这一点不同与英文或者其它语种的语料,因此在分词的时候不能像英文使用空格分词,可以jieba库进行分词。第二点:编码问题,中文语料的编码格式是unicode,而不是utf-8编码格式。这里介绍utf-8编码和unicode编码读取的区别,unicode 一个中文字符占2个字节,而UTF-8一个中文字符占3个字节,因此如果不注意编码问题,在处理过程中肯定会出错的。

2、中文语料预处理

  本次我做的中文语料预处理包含了以下操作:数据导入、数据清洗、中文分词、去停用词、特征处理(TF-IDF权重计算)。下面我将模块介绍我的处理过程。

2.1 数据导入

  首先,先准备好本次要使用的数据集,一段摘自腾讯体育新闻中新闻报道,文本保存格式设置为utf-8。然后倒入进python,使用到open函数读取文件,读取格式选择‘r'表示读取文件,编码encoding = ’utf-8',查看文件中的内容用read函数。具体编码如下:

#文件读取
def read_txt (filepath):
    file = open(filepath,'r',encoding='utf-8')
    txt = file.read()
    return txt

  读取结果展示:

自然语言处理-中文语料预处理第1张

 (注意:返回的txt是str类型的,即字符串类型,不需要decode。str与bytes表示的是两种数据类型,str为字符串型,bytes为字节型。对str编码encode得到bytes,对bytes解码decode得到str)

2.2 数据清洗

  新闻文本数据中不仅包括了中文字符,还包括了数字、英文字符、标点等非常规字符,这些都是无意义,并且需要处理的数据。清洗的方法使用的是正则表达式,匹配规则为:[u4e00-u9fa5],un匹配n,其中n是一个用四个十六进制数字表示的Unicode字符,而4e00-9fa5之间的Unicode编码表示的是20000多个中文字符。具体编码如下:

#匹配[^u4e00-u9fa5]
def find_chinese (file):
    pattern = re.compile(r'[^u4e00-u9fa5]')
    chinese_txt = re.sub(pattern,'',file)
    return chinese_txt

  解释:[u4e00-u9fa5]表示匹配汉字,[^u4e00-u9fa5]表示匹配除汉字以外的所有字符。

  数据展示:自然语言处理-中文语料预处理第2张

 2.3 中文分词

  分词是中文文本分析的重要内容,正确的分词可以帮助我们更好的构建模型、运用算法分析。中文分词一般使用jieba库中的cut方法,cut方法分词有两种模式,一种为全模式,另一种为精准模式,相较于全模式,精准模式分词更加精准可靠,因此选用精准模式对文本分词。注:精准模式和全模式的区别在于是否cut_all,精准模式选择cut_all= False;全模式选择cut_all= True。Jieba库的安装十分简单,只需要在命令框中输入:pip install jieba 即可安装。

import jieba

txt = '''
腾讯体育3月6日讯 史蒂芬-库里时隔127天后复出,勇士113-121不敌猛龙。猛龙本场比赛过后,取得44胜18负战绩,锁定季后赛,成为本赛季联盟第2支锁定季后赛的球队,第1支是雄鹿。
比赛开始后,库里持球组织进攻,明显改变了猛龙的防守,给克里斯和维金斯创造了轻松得分的机会。但在第一节还剩6分11秒下场时,库里没有得分,2次三分出手全部偏出。
但在第二节比赛重新登场后,我们看到了那个熟悉的库里。他接球投三分命中,迎着防守人超远压哨三分命中,第三节还迎着洛瑞完成3+1。那个三分之王和2次常规赛MVP风采依旧。
勇士将士就像打不死的小强,从第一节开始就非常顽强,紧紧的咬住比分,甚至伺机反扑。'''

#全模式
jieba_list = jieba.cut(txt,cut_all=True)
jieba_txt1 = ' '.join(jieba_list)
print('全模式分词:',jieba_txt1)

#精准模式
jieba_list = jieba.cut(txt, cut_all=False)
jieba_txt2 = ' ' .join(jieba_list)
print('精准模式分词:',jieba_txt2)

 通过这段代码我们可以体会一下全模式分词和精准模式分词的区别。

自然语言处理-中文语料预处理第3张

需要注意的一点是jieba分词后返回的数据类型是generator类型,是一个迭代器,需要使用for循环才能读取其中的内容。

  处理的算法:

#中文分词
def cut_word(text):
    # 精准模式
    jieba_list = jieba.cut(text, cut_all=False)
    return jieba_txt

 分词结果:自然语言处理-中文语料预处理第4张

2.4 停用词去除

  无论是中文中,还是英文中,都有用来起连接作用的连词、虚词、语气词等无意义的词,这些词没有具体的含义,只是起着衔接句子的作用。这些词对文本分析没有任何帮助,因此我们还需要对分词后的数据做停用词处理。进行停用词处理需要停用词表,本文中选用的停用词表为哈工大的停用词表,因为在国内研究自然语言处理他们属于翘楚。

停用词表在我的博客中有分享,有需要的可以自行下载。具体代码如下:

#去除停用词
def seg_sentence(list_txt):
    #读取停用词表
    stopwords = stopwords = read_txt('哈工大停用词表.txt')
    seg_txt = [ w for w in list_txt if w not in stopwords]
    return seg_txt

去停用词结果:

自然语言处理-中文语料预处理第5张

2.5 词频统计

   统计分词后文本的词频,目的是找出对文本影响最重要的词汇,统计这些词的频率可以帮助我们了解文章重点强调了什么,以及方便后续构建模型。词频统计中使用了python自带的collections库中的counter接口,它可以帮助统计词频率。Collection安装方法:pip install collections。具体代码:

#词频统计
def counter(txt):
    seg_list = txt
    c = Counter()
    for w in seg_list:
        if w is not ' ':
            c[w] += 1
    return c

  统计结果如下所示:

自然语言处理-中文语料预处理第6张

 2.6 特征选择—TF-IDF权重计算

  TF-IDF权重是很可靠的权重表征方式,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。代码:

#TF_IDF计算
def tf_idf(txt):
    corpus_txt = [' '.join(txt)]
    stopword_list = read_txt(r'哈工大停用词表.txt').splitlines()
    vector = TfidfVectorizer(stop_words=stopword_list)
    tfidf = vector.fit_transform(corpus_txt)
    print(tfidf)
    # 获取词袋模型中的所有词
    wordlist = vector.get_feature_names()  
    # tf-idf矩阵 元素a[i][j]表示j词在i类文本中的tf-idf权重
    weightlist = tfidf.toarray()
    # 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
    for i in range(len(weightlist)):
        print("-------第", i, "段文本的词语tf-idf权重------")
        for j in range(len(wordlist)):
            print(wordlist[j], weightlist[i][j]  )

运行结果:

自然语言处理-中文语料预处理第7张

 2.7 总结

  到此中文文本的预处理就结束了。暂时这两个星期学到的预处理就这么多,如有不当之处,还忘大佬能不吝指导。最后附上全部代码:

import nltk
import jieba
import re
from collections import Counter
from sklearn.feature_extraction.text import TfidfVectorizer

#创建去除非中文字符的函数
#数据清洗,去除标点符号,数字,等其它非中文字符
#匹配[^u4e00-u9fa5]
def find_chinese (file):
    pattern = re.compile(r'[^u4e00-u9fa5]')
    chinese_txt = re.sub(pattern,'',file)
    return chinese_txt

#文件读取
def read_txt (filepath):
    file = open(filepath,'r',encoding='utf-8')
    txt = file.read()
    return txt

#中文分词
def cut_word(text):
    # 精准模式
    jieba_list = jieba.cut(text, cut_all=False)
    return jieba_list

#去除停用词
def seg_sentence(list_txt):
    #读取停用词表
    stopwords = stopwords = read_txt('哈工大停用词表.txt')
    seg_txt = [ w for w in list_txt if w not in stopwords]
    return seg_txt

#词频统计
def counter(txt):
    seg_list = txt
    c = Counter()
    for w in seg_list:
        if w is not ' ':
            c[w] += 1
    return c
#TF_IDF计算
def tf_idf(txt):
    corpus_txt = [' '.join(txt)]
    stopword_list = read_txt(r'哈工大停用词表.txt').splitlines()
    vector = TfidfVectorizer(stop_words=stopword_list)
    tfidf = vector.fit_transform(corpus_txt)
    print(tfidf)
    # 获取词袋模型中的所有词
    wordlist = vector.get_feature_names()
    # tf-idf矩阵 元素a[i][j]表示j词在i类文本中的tf-idf权重
    weightlist = tfidf.toarray()
    # 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
    for i in range(len(weightlist)):
        print("-------第", i, "段文本的词语tf-idf权重------")
        for j in range(len(wordlist)):
            print(wordlist[j], weightlist[i][j]  )

#主函数
if __name__ == "__main__":
    #读取文本信息
    news = read_txt('新闻(中文).txt')
    print("原文:",news)
    #清洗数据,去除无关标点
    chinese_news = find_chinese(news)
    print("原文文本:",news)
    print("纯中文文本:",chinese_news)
    #结巴分词
    chinese_cut = cut_word(chinese_news)
    print(chinese_cut)
    # 停用词去除
    chinese_sentence = seg_sentence(chinese_cut)
    print(chinese_sentence)
    #词频统计
    lists = counter(chinese_sentence)
    print(lists)
    for list in lists.most_common(20):
        print(list)
    #TF-IDF权重计算
    tf_idf(chinese_sentence)

免责声明:文章转载自《自然语言处理-中文语料预处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇webstorm像idea调试java一样调试npm的js项目exec和临时表下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

中文词频统计与词云生成

本次作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2822 中文词频统计 1. 下载一长篇中文小说。 《追风筝的人》.txt 2. 从文件读取待分析文本。 3. 安装并使用jieba进行中文分词。 pip install jieba import jieba jieba.lcut...

word2vec 独热编码One-Hot

独热编码 独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。举个例子,假设我们有四个样本(行),每个样本有三个特征(列),如图: 我们的feature_1有两种可能的取值,比如是男/女,这里男用1表示,女用2表示。feature_2 和f...

在ubuntu上安装全文搜索中文分词Coreseek/sphinx及和Rails集成

Sphinx(狮身人面像) 想必大家都比较了解,就不作介绍了,不了解的童鞋可以自己Google。 原生的Sphinx只支持中文, 所以这里重点介绍支持中文分词的 Coreseek。 注意:Coreseek 3.2 后,只有安装 Coreseek 就可以了,它对LibMMSeg和sphinx做了整合,不用再安装原生Sphinx。(3.2前是要安装原生Sph...

常用文本压缩算法及实现(To be finshed!)

当前仅仅完成了一小部分, 程序上仅仅实现了普通的基于字符的huffman压缩与解压缩. 程序管理上尝试了使用cmake构建,还是很方便的. 测试实验了采用 google test 1.4,也是很好用的. 文档编辑尝试使用latex+cjk, latex2html,相当好用:) 恩,下一步先尝试 python嵌入c++,利用pygraphviz从而可以打印生...

网页设计中透明效果的使用技巧

在网页设计中使用透明效果是件既美观又冒险的事儿。透明效果的使用是把色块,文本或图像“变薄”或者降低饱和度,使颜色变浅透明,这样下个图层的内 容就能穿透显示出来。这种方法如果用好了,效果将会特别棒——能突出显示文本或者在图像的特定区域形成焦点。但设计者在运用透明效果时要特别小心,因为这 么做可能会影响页面的可读性。要是框和文本的透明度不对,更可能会影响到整体...

使用Unity3D的50个技巧:Unity3D最佳实践

转自:http://www.tuicool.com/articles/buMz63I 刚开始学习unity3d时间不长,在看各种资料。除了官方的手册以外,其他人的经验也是非常有益的。偶尔看到老外这篇文章,觉得还不错,于是翻译过来和大家共享。原文地址:http://devmag.org.za/2012/07/12/50-tips-for-working-wi...