中文文本预处理流程(带你分析每一步)

标签:中文文本预处理

作者:炼己者

---

欢迎大家访问我的简书以及我的博客,大家如果感觉格式看着不舒服,也可以去看我的简书,里面也会有发布

本博客所有内容以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢!


摘要

  • 机器学习我的理解就是把各种原始的东西变成机器可以理解的东西,然后再用各种机器学习算法来做操作。机器可以理解的东西是什么呢?——向量 。所以不管是图片还是文字,要用机器学习算法对它们进行处理,就要把它们转为向量。
  • 网上大部分都是处理英文文本的资料,本文就以中文文本为例,将原始的文本经过预处理得到文本向量

目录

  • 去除指定无用的符号
  • 让文本只保留汉字
  • 对文本进行jieba分词
  • 去除停用词
  • 将文本转为tfidf向量并输入到算法中

操作流程

1.去除指定无用的符号

我们拿到的文本有时候很有很多空格,或者你不想要的符号,那么你就可以用这个方法去掉所有你不想要的符号。在这里我以空格为例

content = [‘  欢迎来到  炼己者的博客‘,‘炼己者     带你入门NLP  ‘]
# 去掉文本中的空格
def process(our_data):
    m1 = map(lambda s: s.replace(‘ ‘, ‘‘), our_data)
    return list(m1)
print(process(content))

传入的参数our_data是个列表,此函数可以把文本中的所有空格全部去掉。看一下输出的结果。可以发现,所有的空格都被删掉了

[‘欢迎来到炼己者的博客‘, ‘炼己者带你入门NLP‘]

2.让文本只保留汉字

这个操作我最喜欢,他可以去掉所有的符号,包括数字、标点、字母等等

content = [‘如果这篇文章对你有所帮助,那就点个赞呗!!!‘,‘如果想联系炼己者的话,那就打电话:110!!!‘,‘想学习NLP,那就来关注呀!^-^‘]
# 让文本只保留汉字
def is_chinese(uchar):
    if uchar >= u‘\u4e00‘ and uchar <= u‘\u9fa5‘:
        return True
    else:
        return False

def format_str(content):
    content_str = ‘‘
    for i in content:
        if is_chinese(i):
            content_str = content_str + i
    return content_str

# 参函数传入的是每一句话
chinese_list = []
for line in content:
    chinese_list.append(format_str(line))
print(chinese_list)

然后我们来看一下输出的内容,你会发现只剩下中文了。这个操作实在太骚了

[‘如果这篇文章对你有所帮助那就点个赞呗‘, ‘如果想联系炼己者的话那就打电话‘, ‘想学习那就来关注呀‘]

3. 对文本进行jieba分词

首先你得下载jieba这个库,直接pip install jieba即可。

我们就以上面处理好的那句话作为例子来操作

chinese_list = [‘如果这篇文章对你有所帮助那就点个赞呗‘, ‘如果想联系炼己者的话那就打电话‘, ‘想学习那就来关注呀‘]

# 对文本进行jieba分词
import jieba
def fenci(datas):
    cut_words = map(lambda s: list(jieba.cut(s)), datas)
    return list(cut_words)

print(fenci(chinese_list))

然后你就可以得到分词的结果了

[[‘如果‘, ‘这‘, ‘篇文章‘, ‘对‘, ‘你‘, ‘有所‘, ‘帮助‘, ‘那‘, ‘就‘, ‘点个‘, ‘赞‘, ‘呗‘],
 [‘如果‘, ‘想‘, ‘联系‘, ‘炼己‘, ‘者‘, ‘的话‘, ‘那‘, ‘就‘, ‘打电话‘],
 [‘想‘, ‘学习‘, ‘那‘, ‘就‘, ‘来‘, ‘关注‘, ‘呀‘]]

4.去除停用词

首先你得上网下载一个停用词表,也可以关注我的微信公众号

ZhangyhPico,回复停用词表,就可以拿到了。然后把这份停用词转换为列表

为了方便大家理解,在这里我就假设一个停用词表了,我们以上面分好词的数据为例

# 分好词的数据
fenci_list = [[‘如果‘, ‘这‘, ‘篇文章‘, ‘对‘, ‘你‘, ‘有所‘, ‘帮助‘, ‘那‘, ‘就‘, ‘点个‘, ‘赞‘, ‘呗‘],
 [‘如果‘, ‘想‘, ‘联系‘, ‘炼己‘, ‘者‘, ‘的话‘, ‘那‘, ‘就‘, ‘打电话‘],
 [‘想‘, ‘学习‘, ‘那‘, ‘就‘, ‘来‘, ‘关注‘, ‘呀‘]]

# 停用词表
stopwords = [‘的‘,‘呀‘,‘这‘,‘那‘,‘就‘,‘的话‘,‘如果‘]

# 去掉文本中的停用词
def drop_stopwords(contents, stopwords):
    contents_clean = []
    for line in contents:
        line_clean = []
        for word in line:
            if word in stopwords:
                continue
            line_clean.append(word)
        contents_clean.append(line_clean)
    return contents_clean

print(drop_stopwords(fenci_list,stopwords))

我们来一下结果,对比发现少了一些停用词

[[‘篇文章‘, ‘对‘, ‘你‘, ‘有所‘, ‘帮助‘, ‘点个‘, ‘赞‘, ‘呗‘],
 [‘想‘, ‘联系‘, ‘炼己‘, ‘者‘, ‘打电话‘],
 [‘想‘, ‘学习‘, ‘来‘, ‘关注‘]]

我觉得上面的操作也可应用在去除一些你不想要的符号上面,你可以把没有用的符号添加到停用词表里,那么它也会被去掉

5.将文本转为tfidf向量并输入到算法中

最后这一步你可以参照这篇文章操作,使用不同的方法计算TF-IDF值

不过为了完整起见,我在这里给大家再演示一遍操作流程。咱们就以上面去掉停用词的数据为例

word_list = [[‘篇文章‘, ‘对‘, ‘你‘, ‘有所‘, ‘帮助‘, ‘点个‘, ‘赞‘, ‘呗‘],
 [‘想‘, ‘联系‘, ‘炼己‘, ‘者‘, ‘打电话‘],
 [‘想‘, ‘学习‘, ‘来‘, ‘关注‘]]

from gensim import corpora,models
dictionary = corpora.Dictionary(word_list)
new_corpus = [dictionary.doc2bow(text) for text in word_list]
tfidf = models.TfidfModel(new_corpus)

tfidf_vec = []
for i in range(len(words)):
    string = words[i]
    string_bow = dictionary.doc2bow(string.split())
    string_tfidf = tfidf[string_bow]
    tfidf_vec.append(string_tfidf)
print(tfidf_vec)

在这里我们就可以得到tfidf向量,这里调用的是gensim库计算的tfidf向量,你也可以直接调用sklearn库来计算tfidf向量,怎么操作看上面的那篇文章,里面都有介绍。我们来看一下得到的tfidf向量长什么样子

[[(0, 0.35355339059327373),
  (1, 0.35355339059327373),
  (2, 0.35355339059327373),
  (3, 0.35355339059327373),
  (4, 0.35355339059327373),
  (5, 0.35355339059327373),
  (6, 0.35355339059327373),
  (7, 0.35355339059327373)],
 [(8, 0.18147115159841573),
  (9, 0.49169813431045906),
  (10, 0.49169813431045906),
  (11, 0.49169813431045906),
  (12, 0.49169813431045906)],
 [(8, 0.2084041054460164),
  (13, 0.5646732768699807),
  (14, 0.5646732768699807),
  (15, 0.5646732768699807)]]

很明显,句子的长度不一样,所以得到的tfidf向量的维度也不一样。那么我们该怎么操作呢?——可以用lsi向量来保证向量的维度一致

# num_topics参数可以用来指定维度
lsi_model = models.LsiModel(corpus = tfidf_vec,id2word = dictionary,num_topics=2)

lsi_vec = []
for i in range(len(words)):
    string = words[i]
    string_bow = dictionary.doc2bow(string.split())
    string_lsi = lsi_model[string_bow]
    lsi_vec.append(string_lsi)
print(lsi_vec)

看一下结果

[[(1, 2.8284271247461907)],
 [(0, 1.6357709481422218)],
 [(0, 1.4464385059387106)]]

sklearn库的机器学习算法很齐全,你可以调用这些算法包来进行操作。但是sklearn里的算法要求数据的格式必须是array格式,所以我们得想办法把gensim计算的tfidf向量格式转化为array格式。按照下面操作即可

from scipy.sparse import csr_matrix
data = []
rows = []
cols = []
line_count = 0
for line in lsi_vec:
    for elem in line:
        rows.append(line_count)
        cols.append(elem[0])
        data.append(elem[1])
    line_count += 1
lsi_sparse_matrix = csr_matrix((data,(rows,cols))) # 稀疏向量
lsi_matrix = lsi_sparse_matrix.toarray() # 密集向量
print(lsi_matrix)

结果长这样

array([[0.        , 2.82842712],
       [1.63577095, 0.        ],
       [1.44643851, 0.        ]])

我们的目的已经达到。肯定有人会问,你为啥不直接调用sklearn里计算tfidf向量的方法,那多方便,多直接。何必这样转换来转换去的。

这是有原因的,假设你的数据量很大,几百万条,那么用sklearn计算的tfidf向量维度会非常大,最后调用机器学习算法包的时候就会报错。如果你调用gensim来计算tfidf向量,然后再采用上述的方法,就可以对向量进行降维了,而且你还可以指定维度。在lsi向量那一步进行操作,num_topics参数可以用来指定维度

总结

以上便是整个中文文本的预处理了,这个流程可以应付大多数的文本处理任务。你把文本转换为向量之后,后面的操作就很容易了,调用sklearn算法包,或者自己写一个机器学习的算法,这些都是有章法可循的。

希望可以帮助到大家,如果你觉得这篇文章对你有一定的帮助,那就点个赞支持一下吧!如果有什么问题的话也可以在文章下面评论,我们一起交流解决问题!

原文地址:https://www.cnblogs.com/lookfor404/p/9784630.html

时间: 2024-08-10 14:57:54

中文文本预处理流程(带你分析每一步)的相关文章

中文文本分类

本文介绍文本挖掘与文本分类的一些基本概念和流程,为后续学习分类算法做好铺垫. 一. 文本挖掘的概念 文本挖掘(Text Mining)是从非结构化文本信息中获取用户感兴趣或者有用的模式 的过程.其中被普遍认可的文本挖掘定义如下:文本挖掘是指从大量文本数据中抽取事先未知的.可理解的.最终可用的知识的过程,同时运用这些知识更好地组织信息以便将来参考. 简言之,文本挖掘就是从非结构化的文本中寻找知识的过程. 文本挖掘的七个主要领域: (1)搜索和信息检索(IR):存储和文本文档的检索,包括搜索引擎和关

2.中文文本分类

这这一篇博客中,将系统介绍中文文本分类的流程和相关算法.先从文本挖掘的大背景开始,以文本分类算法为中心,介绍中文文本分类项目的流程以及相关知识,知识点设计中文分词,向量空间模型,TF-IDF方法,几个典型的文本分类算法和评价指标等. 本篇主要有: 朴素的贝叶斯算法 KNN最近邻算法. 2.1 文本挖掘与文本分类的概念 简单来说,文本挖掘就是从已知的大量文本数据中提取一些未知的最终可能用过的知识的过程,也就是从非结构化的文本中寻找知识的过程.文本挖掘主要领域有: 搜索和信息检索:存储和文本文档的检

SnowNLP:一个处理中文文本的 Python 类库[转]

SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典.注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode. from snownlp import SnowNLP s = SnowNLP(u'这个东西真心很赞') s.wor

中文文本分类1

文本挖掘(Text Mining)是从非结构化文本信息中获取用户感兴趣或者有用的模式的过程. 文本挖掘是指从大量文本数据中抽取事先未知的.可理解的.最终可用的知识的过程,同时运用这些知识更好地组织信息以便将来参考. 文本预处理 文本处理的核心任务是把非结构化和半结构化的文本转换为结构化的形式,即向量空间模型. 具体步骤: 1. 选择处理的文本范围 选择恰当的范围取决于文本挖掘任务的目标: 对于分类或聚类的任务,往往把整个文档作为处理单位: 对于情感分析.文档自动摘要或信息检索,段落或章节可能更合

中文文本分类大概的步骤

文本分类问题:给定文档p(可能含有标题t),将文档分类为n个类别中的一个或多个 文本分类应用:常见的有垃圾邮件识别,情感分析 文本分类方向:主要有二分类,多分类,多标签分类 文本分类方法:传统机器学习方法(贝叶斯,svm等),深度学习方法(fastText,TextCNN等) 文本分类的处理大致分为文本预处理.文本特征提取.分类模型构建等.和英文文本处理分类相比,中文文本的预处理是关键技术. 一.中文分词:针对中文文本分类时,很关键的一个技术就是中文分词.特征粒度为词粒度远远好于字粒度,其大部分

从n-gram中文文本纠错到中文语法纠错以及同义词聚类

前记 本文简单地讲解如何使用n-gram模型结合汉字拼音来作中文错别字纠错,然后介绍最短编辑距离在中文搜索纠错方面的应用:最后从依赖树入手讲解如何作文本长距离纠错(语法纠错),并从该方法中得到一种启示,利用依赖树的特点结合ESA算法来做同义词的聚类. n-gram模型 在中文错别字查错情景中,我们判断一个句子是否合法可以通过计算它的概率来得到,假设一个句子S = {w1, w2, ..., wn},则问题可以转换成如下形式: P(S)被称为语言模型,即用来计算一个句子合法概率的模型. 但是使用上

在Ceph中创建虚拟机流程改进之分析

作为个人学习笔记分享,有任何问题欢迎交流! 最近在Gerrit中看到一个change:https://review.openstack.org/#/c/94295/ , 它主要是对当前在Ceph中创建虚拟机的流程的改进.如果glance的backend是ceph, 则nova创建虚拟机到RBD的流程是这样的: 通过glance从ceph中下载image --> 本地 --> 复制image到rbd 这个change的目的就是:不需要下载到本地,直接在rbd中复制image,以提高虚拟机创建的速

word2vec词向量训练及中文文本相似度计算

本文是讲述如何使用word2vec的基础教程,文章比较基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python下载地址:http://radimrehurek.com/gensim/models/word2vec.html 1.简单介绍 参考:<Word2vec的核心架构及其应用 · 熊富林,邓怡豪,唐晓晟 · 北邮2015年> <Word2vec的工作原理及应用探究 · 周练 · 西安电子科技大学

Developing DataBase Applications Using MySQL Connector/C++ 中文文本

Developing DataBase Applications Using MySQL Connector/C++ 中文文本 ? by grayondream 翻译自mysql Connector C++帮助文档[http://download.csdn.net/detail/midle110/4931166] ? 本教程将利用从MySQL数据库中链接,插入和检索数据的简单示例向您展示构建和安装MySQL Connector / C ++驱动程序的基本步骤.因为本文的重点是使用C++ Conn