目录

1. 中文文本挖掘预处理特点

2.  中文文本挖掘预处理

2.1 预处理一:数据收集

2.2  预处理二:除去数据中非文本部分

2.3 预处理三:处理中文编码问题

2.4 预处理四:中文分词

2.5 预处理五:引入停用词

2.6 预处理六:特征处理

2.7 预处理七:建立分析模型

3. 中文文本挖掘预处理总结


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

文本挖掘预处理基本步骤:

分词——向量化(词袋模型)——Hash Trick(特征的降维,若词汇量极大,内存不够时)——TF-TDF(特征的权重修正)——使用各个文本的词特征向量作为文本的特征,进行分类或者聚类分析。

注:TF-IDF是常用的文本挖掘预处理基本步骤,但是如果预处理中使用了Hash Trick,则一般就无法使用TF-IDF了

1. 中文文本挖掘预处理特点

  首先我们看看中文文本挖掘预处理和英文文本挖掘预处理相比的一些特殊点。

     (1)第一,中文文本是没有像英文的单词空格那样隔开的,因此不能直接像英文一样可以直接用最简单的空格和标点符号完成分词。所以一般我们需要用分词算法来完成分词,在文本挖掘的分词原理中,讲到了中文的分词原理,这里就不多说。

  (2)第二,中文的编码不是utf-8,而是unicode。这样会导致在分词的时候,和英文相比,我们要处理编码的问题

  这两点构成了中文分词相比英文分词的一些不同点,当然,英文分词也有自己的烦恼。了解了中文预处理的一些特点后,我们就言归正传,通过实践总结下中文文本挖掘预处理流程。

2.  中文文本挖掘预处理

2.1 预处理一:数据收集

  在文本挖掘之前,我们需要得到文本数据,文本数据的获取方法一般有两种:

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

NLTK包含了许多语料库:

(1)古滕堡语料库 
                (2)网络和聊天文本
                (3)布朗语料库
                (4)路透社语料库
                (5)就职演讲语料库
                (6)标注文本语料库

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

2.2  预处理二:除去数据中非文本部分

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

2.3 预处理三:处理中文编码问题

  由于Python2不支持unicode的处理,因此使用Python2做中文文本预处理时需要遵循的原则是:

(1)存储数据都用utf-8;

(2)读出来进行中文相关处理时,使用GBK之类的中文编码。

下面一节的分词,用例子说明这个问题。

2.4 预处理四:中文分词

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

  完整代码参见:github: https://github.com/ljpzzz/machinelearning/blob/master/natural-language-processing/chinese_digging.ipynb

  首先,准备了两段文本,这两段文本在两个文件中。两段文本的内容分别是nlp_test0.txt和nlp_test1.txt:

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

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

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

import jiebawith open('./input/nlp_test0.txt',encoding='GBK') as f:    # 读入文件时用GBK解码document = f.read()document_cut = jieba.cut(document)# print  ' '.join(jieba_cut)  //如果打印结果,则分词效果消失,后面的result无法显示result = ' '.join(document_cut)          with open('./input/nlp_test2.txt', 'w', encoding='utf-8') as f2:   # 存储时用utf-8编码f2.write(result)

输出的文本内容如下:

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

可以发现对于一些人名和地名,jieba处理的不好,不过我们可以帮jieba加入词汇如下:suggest_freq(segment, tune=True)

import jiebawith open('./input/nlp_test0.txt',encoding='GBK') as f:    # 读入文件时用GBK解码document = f.read()document_cut = jieba.cut(document)# 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其(或不能)被分出来jieba.suggest_freq('沙瑞金', True)jieba.suggest_freq('易学习', True)jieba.suggest_freq('王大路', True)jieba.suggest_freq('京州', True)# print  ' '.join(jieba_cut)  //如果打印结果,则分词效果消失,后面的result无法显示result = ' '.join(document_cut)with open('./input/nlp_test2.txt', 'w', encoding='utf-8') as f2:   # 存储时用utf-8编码f2.write(result)

输出的文本内容如下:

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

基本已经可以满足要求。同样的方法我们对第二段文本nlp_test1.txt进行分词和写入文件nlp_test3.txt。 输出的文本内容如下:

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

2.5 预处理五:引入停用词

  在上面我们解析的文本中有很多无效的词,比如“着”,“和”,还有一些标点符号,这些我们不想在文本分析的时候引入,因此需要去掉,这些词就是停用词。常用的中文停用词表是1208个,下载地址。当然也有其他版本的停用词表,不过这个1208词版是我常用的。

    在我们用scikit-learn做特征处理的时候,可以通过参数stop_words来引入一个数组作为停用词表。

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

    # 从文件导入停用词表stpwrdpath = "./input/stop_words.txt"with open(stpwrdpath, 'rb') as f:stpwrd_content = f.read()# 将停用词表转换为liststpwrdlst = stpwrd_content.splitlines()

stpwrdlst的结果为:

[b',', b'?', b'\xa1\xa2', b'\xa1\xa3', b'\xa1\xb0', b'\xa1\xb1', b'\xa1\xb6', b'\xa1\xb7', b'\xa3\xa1', b'\xa3\xac', b'\xa3\xba', b'\xa3\xbb', b'\xa3\xbf', b'\xc8\xcb\xc3\xf1', b'\xc4\xa9##\xc4\xa9', b'\xb0\xa1', b'\xb0\xa2', b'\xb0\xa5', b'\xb0\xa5\xd1\xbd', b'\xb0\xa5\xd3\xb4',...]

NLTK的语料库中有一个停用词,用户必须从切词列表中把停用词去掉,请参考。

2.6 预处理六:特征处理

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

  TfidfVectorizer类可以帮助完成向量化、TF-IDF和标准化三步。当然,还可以帮我们处理停用词。(相当于word2vec)

  现在我们把上面分词好的文本载入内存:

with open('./input/nlp_test2.txt','rb') as f3:res1 = f3.read()
with open('./input/nlp_test3.txt','rb') as f4:res2 = f4.read()

这里的输出还是我们上面分完词的文本。现在我们可以进行向量化、TF-IDF和标准化三步处理了。注意,这里引入了上面的停用词表。

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [res1, res2]
vector = TfidfVectorizer(stop_words=stpwrdlst)
tfidf = vector.fit_transform(corpus)
print(tfidf)

部分输出如下:

(0, 44)    0.15446743493280246
  (0, 59)    0.10854929506851102
  (0, 39)    0.3089348698656049
  (0, 53)    0.10854929506851102
  (0, 65)    0.10854929506851102
  (0, 49)    0.10854929506851102

......

(1, 29)    0.13989105965823861
  (1, 5)    0.13989105965823861
  (1, 27)    0.13989105965823861
  (1, 47)    0.13989105965823861
  (1, 30)    0.13989105965823861
  (1, 60)    0.13989105965823861

再来看看每个词和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])'''
wordlist:['一起','万块','三人','三套','下海经商','不想','不要','东挪西撮',...]weightlist:array([[0.21709859, 0.21709859, 0.21709859, 0.        , 0.21709859,0.        , 0.        , 0.1085493 , 0.        , 0.        ,...][0.        , 0.        , 0.        , 0.13989106, 0.        ,0.13989106, 0.13989106, 0.        , 0.13989106, 0.13989106,]]
'''

部分输出如下:

-------第 0 段文本的词语tf-idf权重------
一起 0.21709859013702204
万块 0.21709859013702204
三人 0.21709859013702204
三套 0.0
下海经商 0.21709859013702204
不想 0.0

...

-------第 1 段文本的词语tf-idf权重------
一起 0.0
万块 0.0
三人 0.0
三套 0.13989105965823861
下海经商 0.0
不想 0.13989105965823861
不要 0.13989105965823861
...

2.7 预处理七:建立分析模型

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

3. 中文文本挖掘预处理总结

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

文本挖掘预处理流程总结(1)— 中文相关推荐

  1. 中文文本挖掘预处理流程总结

    在对文本做数据分析时,我们一大半的时间都会花在文本预处理上,而中文和英文的预处理流程稍有不同,本文就对中文文本挖掘的预处理流程做一个总结. 1. 中文文本挖掘预处理特点 首先我们看看中文文本挖掘预处理 ...

  2. 中文 lda数据预处理_英文文本挖掘预处理流程总结

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 整理:AI算法之心 作者:刘建平Pinard   博客地址:https://www.c ...

  3. NLP-文本处理:中文文本挖掘预处理流程

    参考资料: 中文文本挖掘预处理流程总结

  4. 文本挖掘预处理流程总结(2)— 英文

    目录 1.  英文文本挖掘预处理特点 2.  英文文本挖掘预处理 2.1 预处理一:数据收集 2.2  预处理二:除去数据中非文本部分 2.3  预处理三:拼写检查更正 2.4  预处理四:词干提取( ...

  5. python英文文本分析和提取_英文文本挖掘预处理流程总结

    在中文文本挖掘预处理流程总结中,我们总结了中文文本挖掘的预处理流程,这里我们再对英文文本挖掘的预处理流程做一个总结. 1. 英文文本挖掘预处理特点 英文文本的预处理方法和中文的有部分区别.首先,英文文 ...

  6. 英文文本预处理流程总结

    1.英文文本预处理的特点以及与中文文本与处理的区别 1.1与中文文本预处理的区别 首先中文文本预处理一般不需要做分词处理(特殊需求除外,例如推特上文本数据,部分用户编写的内容存在连词的情况,如onli ...

  7. 文本挖掘预处理之TF-IDF

    1. 文本向量化特征的不足 在将文本分词并向量化后,我们可以得到词汇表中每个词在各个文本中形成的词向量,比如在文本挖掘预处理之向量化与Hash Trick这篇文章中,我们将下面4个短文本做了词频统计: ...

  8. 第059篇:高分二号遥感影像预处理流程(ENVI5.3.1平台+ENVI App Store中最新的中国国产卫星支持工具)

    今天被袁老的新闻刷屏,湖南衡水县水稻基地传出好消息:                                             袁隆平团队第三代杂交水稻测产,测得晚稻平均亩产为911.7 ...

  9. DPABI详细使用教材——数据准备、预处理流程、数据分析流程

    dpabi必看内容 1.DPABI(用于脑成像的数据处理和分析的工具箱)的下载和安装步骤 2.DPABI详细使用教材--数据准备.预处理流程.数据分析流程 3.DPABISurf的安装及使用(wind ...

最新文章

  1. Select函数实现原理分析
  2. OpenCv Java Mat的基本使用-行列式计算(6)
  3. 这里有一张中国的数字化地图,请查收
  4. We7 从这里开始---安装we7
  5. Mac下布置appium环境
  6. 【机器学习】从电影数据集到推荐系统
  7. MySQL优化group by和distinct
  8. 专业计算机能力考试 技巧,全国专业技术人员计算机应用能力考试应试技巧
  9. C\C++不经意间留下的知识空白------const使用
  10. C++|Java混合实验-java搭建get方法靶场,Qt发送请求获取数据
  11. 实例讲解如何利用jQuery设置图片居中放大或者缩小
  12. Flutter进度条Flutter圆形进度条Flutter条形进度条Flutter Progress进度条LinearProgressIndicator
  13. python环境搭建-pycharm2016软件注册码
  14. LINUX 查看系统信息的命令
  15. 极域电子教室中计算机图标对齐,极域电子教室使用手册整理,新手必备
  16. python使用UDP协议进行远程桌面共享
  17. Astalavista被蹂躏过程(转载自baoz.net)
  18. 社工心理学:如何让LOL找你约架的社会人给你道歉
  19. 生动的SDN基础内容介绍(六)--SDN应用平面和网络测量
  20. 我想把生活折腾成自己想要的样子

热门文章

  1. Etcd 架构与实现解析
  2. spring boot应用启动原理分析
  3. 第十一届青少年蓝桥杯国赛真题精选 - 编程题
  4. 青少年蓝桥杯_2020_steam考试_初级组_第二题
  5. Android --- 怎么样在布局中显示服务器的图片,或者是后台项目中的图片+connect failed: ECONNREFUSED (Connection refused)问题的解决(文章最后)
  6. 安川g7接线端子图_常用变频器接线端子集锦及接线示意图
  7. harmonyos 2.0怎么升级,HarmonyOS 2.0正式发布 分布式能力获得全面升级
  8. php 主观题判分,司法考试改革后多少分通过,客观题主观题分数怎么算?
  9. php图书信息浏览器,使PHP即时输出结果到浏览器
  10. 2020年全球十大数据中心趋势