(转载)中文文本挖掘预处理流程总结

原地址

前言

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

中文文本挖掘预处理特点

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

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

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

中文文本挖掘预处理一:数据收集

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

  • 使用别人做好的语料库
  • 自己用爬虫去在网上去爬自己的语料数据。

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

对于第二种使用爬虫的方法,开源工具有很多,

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

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

这一步主要是针对我们用爬虫收集的语料数据,由于爬下来的内容中有很多html的一些标签,需要去掉

  • 少量的非文本内容的可以直接用Python的正则表达式(re)删除,
  • 复杂的则可以用beautifulsoup来去除。

去除掉这些非文本的内容后,我们就可以进行真正的文本预处理了。

中文文本挖掘预处理三:中文分词

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

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

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


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

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

# -*- coding: utf-8 -*-

import jieba

with open('./nlp_test0.txt',encoding='utf-8') as f:
    document = f.read()
    document_cut = jieba.cut(document)
    print(document_cut)
    result = ' '.join(document_cut)
    print('结巴分词结果:\n',result)
    with open('./nlp_test1.txt', 'w',encoding='utf-8') as f2:
        f2.write(result)

输出如下:
image

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

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

现在我们再来进行读文件,分词和写文件,输出如下:
image

基本已经可以满足要求。同样的方法我们对第二段文本nlp_test2.txt进行分词和写入文件nlp_test3.txt。

with open('./nlp_test2.txt',encoding='utf-8') as f:
    document = f.read()
    document_cut = jieba.cut(document)
    print(document_cut)
    result = ' '.join(document_cut)
    print('结巴分词结果:\n',result)
    with open('./nlp_test3.txt', 'w',encoding='utf-8') as f2:
        f2.write(result)

输出的文本内容如下:
image

可见分词效果还不错。

中文文本挖掘预处理四:引入停用词

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

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

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

#从文件导入停用词表
stpwrdpath = "stop_words.txt"
stpwrd_dic = open(stpwrdpath, encoding='utf-8')
stpwrd_content = stpwrd_dic.read()
#将停用词表转换为list
stpwrdlst = stpwrd_content.splitlines()
stpwrd_dic.close()

中文文本挖掘预处理五:特征处理

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

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

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

with open('./nlp_test1.txt',encoding='utf-8') as f3:
    res1 = f3.read()
print(res1)
print("==="*30)
with open('./nlp_test3.txt',encoding='utf-8') as f4:
    res2 = f4.read()
print(res2)

image

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

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

输出结果:
image

我们再来看看每次词和TF-IDF的对应关系:

wordlist = vector.get_feature_names()#获取词袋模型中的所有词  
# tf-idf矩阵 元素weightlist[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])
    print("\n")

输出如下:

-------第 0 段文本的词语tf-idf权重------
一起 0.2327613272487515
万块 0.2327613272487515
三人 0.2327613272487515
三套 0.0
下海经商 0.2327613272487515
不想 0.0
东挪西撮 0.11638066362437575
之后 0.0
事业有成 0.0
事对 0.11638066362437575
京州 0.0
以沫 0.11638066362437575
公司 0.0
分开 0.11638066362437575
别墅 0.0
前一晚 0.11638066362437575
县当 0.11638066362437575
县长 0.11638066362437575
名下 0.0
喝酒 0.11638066362437575
回忆起 0.11638066362437575
困难 0.11638066362437575
太大 0.0
好像 0.0
家住 0.0
容易 0.11638066362437575
对不起 0.2327613272487515
帝豪园 0.0
很大 0.11638066362437575
房子 0.0
打听 0.0
时期 0.11638066362437575
易学习 0.3312232027759998
有福 0.11638066362437575
李达康 0.1656116013879999
欧阳 0.0
毛娅 0.0
沙瑞金 0.1656116013879999
没想到 0.11638066362437575
浪费 0.0
王大路 0.41402900346999977
百姓 0.11638066362437575
相助 0.11638066362437575
股权 0.0
胸怀 0.11638066362437575
觉得 0.1656116013879999
触动 0.11638066362437575
话别 0.11638066362437575
赔礼道歉 0.11638066362437575
赞叹 0.11638066362437575
踏实 0.0
这件 0.11638066362437575
道口 0.11638066362437575
金山 0.11638066362437575
降职 0.11638066362437575
风生水 0.11638066362437575


-------第 1 段文本的词语tf-idf权重------
一起 0.0
万块 0.0
三人 0.0
三套 0.14811780175932845
下海经商 0.0
不想 0.14811780175932845
东挪西撮 0.0
之后 0.14811780175932845
事业有成 0.14811780175932845
事对 0.0
京州 0.2962356035186569
以沫 0.0
公司 0.14811780175932845
分开 0.0
别墅 0.2962356035186569
前一晚 0.0
县当 0.0
县长 0.0
名下 0.14811780175932845
喝酒 0.0
回忆起 0.0
困难 0.0
太大 0.14811780175932845
好像 0.14811780175932845
家住 0.14811780175932845
容易 0.0
对不起 0.0
帝豪园 0.14811780175932845
很大 0.0
房子 0.2962356035186569
打听 0.14811780175932845
时期 0.0
易学习 0.10538703586793656
有福 0.0
李达康 0.10538703586793656
欧阳 0.2962356035186569
毛娅 0.44435340527798534
沙瑞金 0.10538703586793656
没想到 0.0
浪费 0.14811780175932845
王大路 0.31616110760380967
百姓 0.0
相助 0.0
股权 0.14811780175932845
胸怀 0.0
觉得 0.10538703586793656
触动 0.0
话别 0.0
赔礼道歉 0.0
赞叹 0.0
踏实 0.14811780175932845
这件 0.0
道口 0.0
金山 0.0
降职 0.0
风生水 0.0

中文文本挖掘预处理六:建立分析模型

有了每段文本的TF-IDF的特征向量,我们就可以利用这些数据建立分类模型,或者聚类模型了,或者进行主题模型的分析。比如我们上面的两段文本,就可以是两个训练样本了。

中文文本挖掘预处理总结

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

posted on 2022-07-09 22:14  朴素贝叶斯  阅读(479)  评论(0编辑  收藏  举报

导航