前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自然语言处理(4)之中文文本挖掘流程详解(小白入门必读)

自然语言处理(4)之中文文本挖掘流程详解(小白入门必读)

作者头像
昱良
发布于 2018-04-08 10:33:21
发布于 2018-04-08 10:33:21
3.2K00
代码可运行
举报
运行总次数:0
代码可运行

关键字全网搜索最新排名

机器学习算法】:排名第一

【机器学习】:排名第一

Python:排名第三

【算法】:排名第四

前言

在对文本做数据分析时,一大半的时间都会花在文本预处理上,而中文和英文的预处理流程稍有不同,本文对中文文本挖掘的预处理流程做一个总结。

中文文本挖掘预处理特点

首先看中文文本挖掘预处理与英文文本挖掘预处理的不同点。

首先,中文文本是没有像英文的单词空格那样隔开的,因此不能直接像英文一样可以直接用最简单的空格和标点符号完成分词。所以一般需要用分词算法来完成分词,在(干货 | 自然语言处理(1)之聊一聊分词原理)已经讲到了中文的分词原理。

第二,中文的编码不是utf8,而是unicode。这样会导致在分词时,需要处理编码的问题。

上述两点构成了中文分词相比英文分词的一些不同点,后面也会重点讲述这部分的处理。了解了中文预处理的一些特点后,通过实践总结下中文文本挖掘预处理流程。

1. 数据收集

在文本挖掘之前,需要得到文本数据,文本数据的获取方法一般有两种:使用别人做好的语料库和自己用爬虫去在网上去爬自己的语料数据。

对于第一种方法,常用的文本语料库在网上有很多,如果大家只是学习,则可以直接下载下来使用,但如果是某些特殊主题的语料库,比如“机器学习”相关的语料库,则这种方法行不通,需要我们自己用第二种方法去获取。

对于第二种使用爬虫的方法,开源工具有很多,通用的爬虫我一般使用beautifulsoup。但是我们需要某些特殊的语料数据,比如上面提到的“机器学习”相关的语料库,则需要用主题爬虫(也叫聚焦爬虫)来完成,一般使用ache。 ache允许我们用关键字或者一个分类算法来过滤出我们需要的主题语料,比较强大。

2. 除去数据中非中文部分

这一步主要是针对用爬虫收集的语料数据,由于爬下来的内容中有很多html的一些标签,需要去掉。少量的非文本内容的可以直接用Python的正则表达式(re)删除, 复杂的则可以用beautifulsoup来去除。去除掉这些非文本的内容后,就可以进行真正的文本预处理了。

3. 处理中文编码问题

由于Python2.x不支持unicode的处理,因此使用Python2.x做中文文本预处理时需要遵循的原则是,存储数据都用utf8,读出来进行中文相关处理时,使用GBK之类的中文编码,在下一节的分词再用例子说明这个问题。

4. 中文分词

常用的中文分词软件有很多,比较推荐结巴分词。安装也很简单,比如基于Python的,用"pip install jieba"就可以完成。下面我们就用例子来看看如何中文分词。

首先准备两段文本,内容分别如下:

nlp_test0.txt

沙瑞金赞叹易学习的胸怀,是金山的百姓有福,可是这件事对李达康的触动很大。易学习又回忆起他们三人分开的前一晚,大家一起喝酒话别,易学习被降职到道口县当县长,王大路下海经商,李达康连连赔礼道歉,觉得对不起大家,他最对不起的是王大路,就和易学习一起给王大路凑了5万块钱,王大路自己东挪西撮了5万块,开始下海经商。没想到后来王大路竟然做得风生水起。沙瑞金觉得他们三人,在困难时期还能以沫相助,很不容易。

nlp_test2.txt

沙瑞金向毛娅打听他们家在京州的别墅,毛娅笑着说,王大路事业有成之后,要给欧阳菁和她公司的股权,她们没有要,王大路就在京州帝豪园买了三套别墅,可是李达康和易学习都不要,这些房子都在王大路的名下,欧阳菁好像去住过,毛娅不想去,她觉得房子太大很浪费,自己家住得就很踏实。

首先将文本从第一个文件中读取进来,并使用中文GBK编码,再调用结巴分词,最后把分词结果用uft8格式存在另一个文本nlp_test1.txt中。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import jieba
with open('./nlp_test0.txt') as f:
    document = f.read()
    document_decode = document.decode('GBK')
    document_cut = jieba.cut(document_decode)
    result = ' '.join(document_cut)
    result = result.encode('utf-8')
    with open('./nlp_test1.txt', 'w') as f2:
        f2.write(result)
f.close()
f2.close()

输出的文本内容如下:

nlp_test1.txt

沙 瑞金 赞叹 易 学习 的 胸怀 , 是 金山 的 百姓 有福 , 可是 这件 事对 李达康 的 触动 很大 。 易 学习 又 回忆起 他们 三人 分开 的 前一晚 , 大家 一起 喝酒 话别 , 易 学习 被 降职 到 道口 县当 县长 , 王 大路 下海经商 , 李达康 连连 赔礼道歉 , 觉得 对不起 大家 , 他 最 对不起 的 是 王 大路 , 就 和 易 学习 一起 给 王 大路 凑 了 5 万块 钱 , 王 大路 自己 东挪西撮 了 5 万块 , 开始 下海经商 。 没想到 后来 王 大路 竟然 做 得 风生水 起 。 沙 瑞金 觉得 他们 三人 , 在 困难 时期 还 能 以沫 相助 , 很 不 容易 。

可以发现对于一些人名和地名,jieba处理不好,不过可以帮jieba加入词汇如下:

jieba.suggest_freq('沙瑞金', True) jieba.suggest_freq('易学习', True) jieba.suggest_freq('王大路', True) jieba.suggest_freq('京州', True)

现在再重新进行读文件,编码,分词,编码和写文件,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open('./nlp_test0.txt') as f:
    document = f.read()
    document_decode = document.decode('GBK')
    document_cut = jieba.cut(document_decode)
    result = ' '.join(document_cut)
    result = result.encode('utf-8')
    with open('./nlp_test1.txt', 'w') as f2:
        f2.write(result)
f.close()
f2.close()

输出的文本内容如下:

nlp_test1.txt

沙瑞金 赞叹 易学习 的 胸怀 , 是 金山 的 百姓 有福 , 可是 这件 事对 李达康 的 触动 很大 。 易学习 又 回忆起 他们 三人 分开 的 前一晚 , 大家 一起 喝酒 话别 , 易学习 被 降职 到 道口 县当 县长 , 王大路 下海经商 , 李达康 连连 赔礼道歉 , 觉得 对不起 大家 , 他 最 对不起 的 是 王大路 , 就 和 易学习 一起 给 王大路 凑 了 5 万块 钱 , 王大路 自己 东挪西撮 了 5 万块 , 开始 下海经商 。 没想到 后来 王大路 竟然 做 得 风生水 起 。 沙瑞金 觉得 他们 三人 , 在 困难 时期 还 能 以沫 相助 , 很 不 容易 。

以同样的方法对第二段文本nlp_test2.txt进行分词和写入文件nlp_test3.txt。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open('./nlp_test2.txt') as f:
    document2 = f.read()
    document2_decode = document2.decode('GBK')
    document2_cut = jieba.cut(document2_decode)
    #print  ' '.join(jieba_cut)
    result = ' '.join(document2_cut)
    result = result.encode('utf-8')
    with open('./nlp_test3.txt', 'w') as f2:
        f2.write(result)
f.close()
f2.close()

输出的文本内容如下:

nlp_test3.txt

沙瑞金 向 毛娅 打听 他们 家 在 京州 的 别墅 , 毛娅 笑 着 说 , 王大路 事业有成 之后 , 要 给 欧阳 菁 和 她 公司 的 股权 , 她们 没有 要 , 王大路 就 在 京州 帝豪园 买 了 三套 别墅 , 可是 李达康 和 易学习 都 不要 , 这些 房子 都 在 王大路 的 名下 , 欧阳 菁 好像 去 住 过 , 毛娅 不想 去 , 她 觉得 房子 太大 很 浪费 , 自己 家住 得 就 很 踏实 。

5. 引入停用词

上面解析的文本中有很多无效的词,比如“着”,“和”,还有一些标点符号,这些我们不想在文本分析时引入,因此需要去掉,这些词就是停用词常用的中文停用词表是1208个(下载地址:https://pan.baidu.com/s/1gfMXMl9)。

现在将停用词表从文件读出,并切分成一个数组备用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#从文件导入停用词表                                                  
stpwrdpath = "stop_words.txt"
stpwrd_dic = open(stpwrdpath, 'rb')
stpwrd_content = stpwrd_dic.read()
#将停用词表转换为list  
stpwrdlst = stpwrd_content.splitlines()
stpwrd_dic.close()

6. 特征处理

现在可以用scikit-learn来对文本特征进行处理,在()中讲到了两种特征处理的方法,向量化与Hash Trick而向量化是最常用的方法,因为它可以接着进行TF-IDF的特征处理。在()中也讲到了TF-IDF特征处理的方法,这里使用scikit-learn的TfidfVectorizer类来进行TF-IDF特征处理。

TfidfVectorizer类可以完成向量化,TF-IDF和标准化三步。当然,还可以处理停用词。现在把上面分词好的文本载入内存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open('./nlp_test1.txt') as f3:                                          
    res1 = f3.read()
print res1
with open('./nlp_test3.txt') as f4:
    res2 = f4.read()
print res2
现在可以进行向量化,TF-IDF和标准化三步处理(这里引入了上面的停用词表)。
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [res1,res2]
vector = TfidfVectorizer(stop_words=stpwrdlst)
tfidf = vector.fit_transform(corpus)
print tfidf

部分输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(0, 44)0.154467434933
  (0, 59)0.108549295069
  (0, 39)0.308934869866
  (0, 53)0.108549295069
  ....
  (1, 27)0.139891059658
  (1, 47)0.139891059658
  (1, 30)0.139891059658
  (1, 60)0.139891059658

看看每个词与TF-IDF的对应关系:

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]

部分输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-------0 段文本的词语tf-idf权重------
一起 0.217098590137
万块 0.217098590137
三人 0.217098590137
三套 0.0
下海经商 0.217098590137
.....
-------1 段文本的词语tf-idf权重------
.....
李达康 0.0995336411066
欧阳 0.279782119316
毛娅 0.419673178975
沙瑞金 0.0995336411066
没想到 0.0
没有 0.139891059658
浪费 0.139891059658
王大路 0.29860092332
.....

7. 建立分析模型

有了每段文本的TF-IDF的特征向量,就可以利用这些数据建立分类或者聚类模型了,或者进行主题模型的分析。此时的分类聚类模型和之前讲的非自然语言处理的数据分析没有什么两样。因此对应的算法都可以直接使用。

小结

本文对中文文本挖掘预处理的过程做了一个总结,希望可以帮助到大家。需要注意的是这个流程主要针对一些常用的文本挖掘,并使用了词袋模型,对于某一些自然语言处理的需求则流程需要修改。比如我们涉及到词上下文关系的一些需求,此时不能使用词袋模型。而有时候我们对于特征的处理有自己的特殊需求,因此这个流程仅供自然语言处理入门者参考。

欢迎分享给他人让更多的人受益

参考:

  1. 宗成庆《统计自然语言处理》 第2版
  2. 博客园 http://www.cnblogs.com/pinard/p/6744056.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习算法与Python学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
中文文本挖掘预处理流程总结
在对文本做数据分析时,我们一大半的时间都会花在文本预处理上,而中文和英文的预处理流程稍有不同,本文就对中文文本挖掘的预处理流程做一个总结。
刘建平Pinard
2018/08/07
2K0
用scikit-learn学习LDA主题模型
    在LDA模型原理篇我们总结了LDA主题模型的原理,这里我们就从应用的角度来使用scikit-learn来学习LDA主题模型。除了scikit-learn,  还有spark MLlib和gensim库也有LDA主题模型的类库,使用的原理基本类似,本文关注于scikit-learn中LDA主题模型的使用。
刘建平Pinard
2018/08/07
1.9K0
特征工程系列:空间特征构造以及文本特征构造
关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问、动手达人,期待与大家一起交流探讨机器学习相关内容~
木东居士
2019/12/10
1.4K1
特征工程系列:空间特征构造以及文本特征构造
用gensim学习word2vec
    在word2vec原理篇中,我们对word2vec的两种模型CBOW和Skip-Gram,以及两种解法Hierarchical Softmax和Negative Sampling做了总结。这里我们就从实践的角度,使用gensim来学习word2vec。
刘建平Pinard
2018/08/07
1.6K0
干货 | 自然语言处理(5)之英文文本挖掘预处理流程
前言 自然语言处理(4)之中文文本挖掘流程详解(小白入门必读) 干货 | 自然语言处理(3)之词频-逆文本词频(TF-IDF)详解 干货 | 自然语言处理(2)之浅谈向量化与Hash-Trick 干货 | 自然语言处理(1)之聊一聊分词原理 干货 | 自然语言处理入门资料推荐 原文链接:http://www.cnblogs.com/pinard/p/6756534.html 在中文文本挖掘预处理流程总结中,我们总结了中文文本挖掘的预处理流程,这里我们再对英文文本挖掘(English text mi
昱良
2018/04/18
3.7K0
文本挖掘(一)python jieba+wordcloud使用笔记+词云分析应用
  系列介绍:文本挖掘比较常见,系列思路:1-基本情况介绍(分词,词云展示);2-根据语料库的tf-idf值及创建自己的idf文件;3-基于snownlp语料情感分析;4-基于gensim进行lda主题挖掘分析;
forxtz
2021/03/11
1.8K0
文本挖掘(一)python jieba+wordcloud使用笔记+词云分析应用
Python数据挖掘-NLTK文本分析+jieba中文文本挖掘
NLTK的全称是natural language toolkit,是一套基于python的自然语言处理工具集。
用户7886150
2021/01/15
3.1K0
[Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。
Eastmount
2022/03/30
2.4K0
[Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解
英文文本挖掘预处理流程总结
    在中文文本挖掘预处理流程总结中,我们总结了中文文本挖掘的预处理流程,这里我们再对英文文本挖掘的预处理流程做一个总结。
刘建平Pinard
2018/08/07
1.1K0
【一文讲解深度学习】语言自然语言处理(NLP)第一篇
NLP(Nature Language Processing,自然语言处理)是计算机及人工智能领域的一个重要的子项目,它研究计算机如何处理、理解及应用人类语言。是人类在漫长的进化过程中形成的计算机语言复杂的符号等系统(类似C/Java的符号等系统)。以下是关于自然处理的常见定义:
苏州程序大白
2022/04/14
1.7K0
【一文讲解深度学习】语言自然语言处理(NLP)第一篇
【深度学习】自然语言处理
NLP(Nature Language Processing,自然语言处理)是计算机学科及人工智能领域一个重要的子学科,它主要研究计算机如何处理、理解及应用人类语言。所谓自然语言,指人说的话、人写的文章,是人类在长期进化过程中形成的一套复杂的符号系统(类似于C/Java等计算机语言则称为人造语言)。以下是关于自然语言处理常见的定义:
杨丝儿
2022/03/20
8100
【深度学习】自然语言处理
python 中文文本分类[通俗易懂]
即已经分好类的文本资料(例如:语料库里是一系列txt文章,这些文章按照主题归入到不同分类的目录中,如 .\art\21.txt) 推荐语料库:复旦中文文本分类语料库,下载链接:http://download.csdn.net/detail/github_36326955/9747927
全栈程序员站长
2022/07/01
1.3K0
python 中文文本分类[通俗易懂]
基于自然语言处理的垃圾短信识别系统
本项目旨在利用自然语言处理(NLP)技术,开发一个高效的垃圾短信识别系统。通过分词、停用词处理、情感分析和机器学习模型,实现对垃圾短信的自动分类和识别,提高短信过滤的准确性和效率。
LucianaiB
2025/01/25
2250
基于自然语言处理的垃圾短信识别系统
关于自然语言处理系列-关键词提取
自然语言处理包括中文分词、词性标注、关键词抽取、依存句法分析、文本分类接口情感分析、词义相似度计算、实体标识、文本摘要等等,慢慢来吧,看看一步步能到什么程度。本文实现的是关键词提取。
python与大数据分析
2022/03/11
5090
关于自然语言处理系列-关键词提取
[自然语言处理|NLP] 信息检索与文本挖掘
当涉及到自然语言处理(NLP)中的信息检索与文本挖掘时,我们进入了一个旨在从大量文本数据中发现有价值信息的领域。信息检索涉及从文本数据中检索相关信息,而文本挖掘则旨在自动发现文本中的模式、趋势和知识。
数字扫地僧
2023/11/09
1.2K0
干货 | 自然语言处理(3)之词频-逆文本词频(TF-IDF)详解
关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 前言 在()中讲到在文本挖掘预处理中,在向量化后一般都伴随着TF-IDF的处理。什么是TF-IDF,为什么一般需要加这一步预处理呢?这里就对TF-IDF的原理做一个总结。 文本向量化存在的不足 在将文本分词并向量化后,就可以得到词汇表中每个词在文本中形成的词向量,比如()这篇文章中,我们将下面4个短文本做了词频统计: corpus=["I come to China to travel
昱良
2018/04/08
2.7K0
干货 | 自然语言处理(3)之词频-逆文本词频(TF-IDF)详解
【2023】数据挖掘课程设计:基于TF-IDF的文本分类
PyCharm 2022.3.1 (Professional Edition)
Qomolangma
2024/07/29
1630
【2023】数据挖掘课程设计:基于TF-IDF的文本分类
文本挖掘预处理之TF-IDF
    在文本挖掘预处理之向量化与Hash Trick中我们讲到在文本挖掘的预处理中,向量化之后一般都伴随着TF-IDF的处理,那么什么是TF-IDF,为什么一般我们要加这一步预处理呢?这里就对TF-IDF的原理做一个总结。
刘建平Pinard
2018/08/07
7500
如何生成自定义的逆向文件频率(IDF)文本语料库
jieba分词中,关键词提取使用逆向文件频率文本语料库时,除了使用现有的语料库外,还可以自定义生成文本语料库。
数据STUDIO
2021/06/24
3.6K1
python停用词表整理_python停用词表
大家好,又见面了,我是你们的朋友全栈君。 stop_words:设置停用词表,这样的词我们就不会统计出来(多半是虚拟词,冠词等等),需要列表结构,所以代码中定义了一个函数来处理停用词表…前言前文给
全栈程序员站长
2022/07/02
2.3K0
python停用词表整理_python停用词表
推荐阅读
相关推荐
中文文本挖掘预处理流程总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验