数据分析之文本挖掘——中文分词

Posted 数据分析与数据挖掘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析之文本挖掘——中文分词相关的知识,希望对你有一定的参考价值。

在数据分析之文本挖掘(一)文中,我写了关于爬取数据的过程和心得,接下来,本文将聊聊关于中文分词的知识。

中文分词 (Chinese WordSegmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。然而分词的效果将直接影响分类模型的建立以及最后文本分类的质量。针对中文与英文的分词有很大的不同,对于英文文本,由于其写作时每个单词之间都己经由空格分隔,己经自然的完成了分词工作。而对于中文文本来说,书写时字与字之间没有空格分隔,必须通过分词步骤才能继续下一步处理。中文文本分词可以分为字、词以及短语,具体切分到何种程度主要取决于分词的用途和系统的运行效率。但是中文单个的字代表的意义太少,也不符合中国人的思维习惯,而短语表示的含义丰富,但是操作难度太大,也不太适合作为分词的粒度,因此采用基于词的分词粒度较为合适。

1分词算法分类

现有的分词算法可分为三大类:基于词典的分词方法、基于理解的分词方法和基于统计的分词方法。按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。

1.1基于词典的分词方法

该方法是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;这中方法分词算法较为简单,精度较高,被普遍使用。

1.2基于统计方法

统计文本中相邻两个字出现的共同频数,若共同出现的频数越高,那么它们就可能来自于同一个词,就将它们当作一个词进行切分。但是这种分词方法需要一个很大的样本空间才能保证分词结果的准确性。

1.3基于理解的分词方法

这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。

2 中文分词难点

有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让计算机理解中文语言更是困难。在中文分词过程中还存在一些难题一直没有完全突破。

2.1歧义识别

歧义是指同样的一句话,可能有两种或者更多的切分方法。包括交集型歧义 、组合型歧义、真歧义。例如:“乒乓球拍卖完了”,可以切分成“乒乓、 球拍、 卖 、完 、了”、也可切分成“乒乓球 、拍卖、 完 、了”,如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词;比如在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。这些词计算机又如何去识别?2.2新词识别

新词,专业术语称为未登录词。也就是那些在字典中都没有收录过,但又 确实能称为词的那些词。 如人名、地名、机构名、专业术语等,这类词语若采用基于词典的分词方法,则很可能不会被分解成词语,而是分解成其他单字。

针对上面的知识点,接下来我就结合实际例子来讲一下如何进行中文分词,这里我们采用最大正向匹配法则来进行分词;分词过程见下面流程图:



2-1 最大正向匹配分词流程图

例如我们要分词这样一段话:微信公众平台素材板块新增了链接的功能。我们将这句话输入,通常我们取5个字作为一个最大长度,因为实际生活中也很少有5个字以上的词语,那么这儿我们首选截取出来的是“微信公众平,将这个字符串和停用词频繁词字典进行比对,看是否在其中,(停用词频繁词字典是指,例如:的,得、我等文中经常出现但实际意义不大的字词为频繁词,例如哦、呀、标点符号及一些需要停止使用的词等为停用词)比对成功则删除该字符并进行下一轮循环,如果不成功则看是否在分词字典中,如果在则输出该词然后进入下一轮循环,如果不在,则看这个词是不是一个单字,不是则减少一位,截取成微信公众”,然后比对,依次循环下去,直到这个字符串没有字符后重新向后取5位字符串;这就是最简单的分词方法。

然而对于中文分词,我们并不需要写很多的程序来完成分词工作,在网上有很多现成的程序供我们调用,尽管如此,我们依然不仅要知其然,还要知其所以然。

本文的分词是基于词典的最大正向匹配法则和基于统计相结合的方法进行分词的,利用R的Rwordseg分词包,Rwordseg 是一个R环境下的中文分词工具,使用rJava调用Java分词工具Ansj。Ansj 也是一个开源的 Java 中文分词工具,基于中科院的 ictclas 中文分词算法,采用隐马尔科夫模型(Hidden Markov Model, HMM)。作者孙健重写了一个Java版本,并且全部开源,使得 Ansi 可用于人名识别、地名识别、组织机构名识别、多级词性标注、关键词提取、指纹提取等领域,支持行业词典、 用户自定义词典。R中类似的工具包有数万计,可以很轻松的帮我们完成很多工作,这正是R的魅力所在。

本文利用R软件对停用词、频繁词、标点符号与数字的进行剔除处理,例如“的”、“今天”等频繁用到的词语其实对我们进行文本挖掘毫无意义,它的存在只会增加噪音,干扰我们对关键信息的爬取,所以本文先将这部分词语进行剔除,减少了后续的处理。

通过编程运算最终得到如下图(4-2)稀疏矩阵


图4-2分词结果-稀疏矩阵截图(部分)

以下是R分词的程序:

library(rJava)

library(Rwordseg)

library(tm)


加入词典

installDict("E:\\毕业资料\\论文\\词库\\财经金融词汇大全【官方推荐】.scel", dictname = "ciku",dicttype = c("text", "scel"),load = TRUE)

installDict("E:\\毕业资料\\论文\\词库\\股票名称词库.txt", dictname = "ciku",dicttype = c("text", "scel"),load = TRUE)


读数据、生成语料库

> mydata<-read.csv(file.choose(),header=F) #如果有列名 header=T,反之header=F

txt<-Corpus(VectorSource(mydata$V1))


语料库处理


txt<-tm_map(txt,stripWhitespace)#去除多余空格

txt<-tm_map(txt,PlainTextDocument)#去掉空文件


进行分词、并生成语料库

txt<-segmentCN(as.character(txt))

txt<-Corpus(VectorSource(txt))


txt<-tm_map(txt,removeNumbers)#去除数字

txt<-tm_map(txt,removePunctuation)#去除标点符号

txt<-tm_map(txt,removeWords, c(stopwords("english")))

注释:后面“years”...都是自己添加的,目前还没有找到添加文件形式


##########中文停用词表的导入和使用###########

data_stw=read.table(file.choose(),colClasses="character")

stopwords_CN=c(NULL)

for(i in 1:dim(data_stw)[1]){

stopwords_CN=c(stopwords_CN,data_stw[i,1])

}


txt=tm_map(txt,removeWords,stopwords_CN) # 删除停用词


生成词频矩阵

dtm<-DocumentTermMatrix(txt,control=list(removePunctuation = TRUE,stopwords=TRUE, wordLengths = c(2, 10)))

txt<-Corpus(VectorSource(txt))

> dtm2 = removeSparseTerms(dtm, sparse=0.995)

说明:parse值越少,最后保留的term数量就越少,0.9是指如果某一词出现在文档的概率少于(1-0.9)则不再保留到词频矩阵。即删除权重少的元素。


>dtm #可以查看处理后的文档数和词条数


词频矩阵转换为数据框格式

>df_dtm2<-as.data.frame(inspect(dtm2))

df_dtm2<-as.data.frame(inspect(dtm))


write.table(df_dtm2,file="E:/毕业资料/论文/data/newdata2/dtm.txt",quote=F,sep="\t")

G:/毕业设计/数据这个文件夹下就有保存处理的 dtm.txt


今天的分享就到此为止,下一次我将分享关于文本挖掘的相关知识和技术。若你觉得写的好,欢迎转载分享及收藏。

BY 心似枯木,转载请注明出处


点击文章顶部 数据分析与数据挖掘 或者扫描下方二维码即可关注我


以上是关于数据分析之文本挖掘——中文分词的主要内容,如果未能解决你的问题,请参考以下文章

自然语言处理之中文文本挖掘流程详解

R专题区|中文分词入门之—jiebaR

R语言文本挖掘—文本分词

文本挖掘之词频分析“结巴”分词

文本挖掘:中文分词

如何快速入门中文分词及文本挖掘