NLP文本聚类分析R实现,以及几个简单实用的小工具

注意,文末有踩蛋,对代码不感冒的童鞋可以直接下拉到文末哈~

文本聚类是我最近在做受访者调研分析时所用到的方法。一份调研问卷中难免会有开放题,尤其是像我们这次主题是“吐槽产品”的问卷,所以在做开放题分析的时候,一定会用到以下几种文本分析:

1.词频统计-词云图

2.语义分析-情感词

3.聚类分析-组合词

词云图我之前已经讲过了分析思路和全部R代码,情感词语义分析我下次有机会再分享代码(也可以参考本文文末的小工具来实现),聚类分析是本次主讲内容。

聚类分析主要是拆解用户答案(文本)、清洗文本、文本聚类。在不同的用户答案中,找到最常一起出现的、且有意义的词语组合。

词频统计,在文本海量的情况下,当然还是得借助R或者Python。笔者最近被新产品研发和上线所累,Python基本荒废了,还是拿R代码来做演练吧。

首先安装必要的程序包~基础

library(rJava)

library(Rwordseg)

library(tm)

1. 分词

segmentCN(file.choose(),returnType="tm") #原始文本分词,用户一条吐槽一行#

分词完之后,一定要打开segment.txt看一下,分词结果是否符合自己预期。如果有些分词被拆开,则可以导入自己行业专属的词典,使得分词更为准确。比如有些行业话术:潮牌、心水等,需要提前输入字典,不赘述。

2. 创建语料库

mydoc

mydoc

mydoc.vec

mydoc.corpus

3. 文本清洗

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

stopwords_CN=c(NULL)

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

mydoc.corpus

mydoc.corpus

至此,把每位用户的答案进行了词语分割,去除了停用词,以向量形式存储。

4. 生成词项-文档矩阵(Term Document Matrix,TDM)

TDM是一个矩阵[i,j],列j是语料库中的文档(不同用户),行i是所有文档中出现的词项(分割词)。如果我有十篇新闻稿,所有文稿中出现的词项(注意,不是某一篇文档)才是i。该矩阵中,一个[i,j]位置的元素代表词项i在文档j中出现的次数。

Sys.setlocale(locale="English")

control=list(removePunctuation=T,minDocFreq=1,wordLengths = c(0, Inf),weighting = weightTfIdf) #控制,控制抽取条件,如最低词频为1,单词长度为0到无穷大,使用TfIdf作为词频权重#

mydoc.tdm=TermDocumentMatrix(mydoc.corpus,control) #生成TDM#

我们看一下TDM的内容,给出了terms和doc.的个数,还给出稀疏度(Sparsity)。稀疏度的意思是在这个矩阵中为0的个数远远超过了不为0的个数,而且不为0的单元格分布不均。多数文本分析中稀疏度都较高,尤其是对于头条新闻类的文本进行聚类时,矩阵通常都是高度稀疏。如在inspect() 之后截图所示。

mydoc.tdm

TermDocumentMatrix (terms: 530, documents: 215)>> # 有215个文档,530个词项#

Non-/sparse entries: 1307/112643

Sparsity : 99% #稀疏度高达99%#

Maximal term length: 4 #最长的词项长度是4#

Weighting : term frequency - inverse document frequency (normalized) (tf-idf)

Inspect(mydoc.tdm)

矩阵是530个词项(i)在215(j)个文档中出现的权重[i,j]

我们可以通过控制Sparsity,提高稀疏比例,甩掉一些TF-IDF值低的词汇,达到理想中想要的词频数量,如此适用于词项量特别大、长尾TF-IDF低值的案例。

tdm_removed

length(tdm_removed$dimnames$Terms) #查看有效值词个数#

5. 文本聚类

mydata.scale

d

fit

plot(fit) #画出聚类图#

re=rect.hclust(fit,k=5) #标记聚类类别#

如果最后的聚类类别严重不均,那有可能是样本太少、词汇太集中。比如我的,很明显分了三类,第一类特别大一块,第二类是没什么可吐槽的,第三类是吐槽积分签到的。

最后一点知识送给大家,TF-IDF是一个特别有用的权重值,在文本分类、聚类都有很大的用处,另外,根据我去年一个案例的经验来看,TF-IDF还可以用来识别用户A与用户B之间的关系度,我一个合伙人说所有的建模、挖掘都离不开关联分析,那关联分析也离不开TF-IDF这个权重值。欲知TF-IDF这俩值怎么计算的,可以参与吴军老师的《数学之美》。

下面是彩蛋

既然文本分析的词频统计有简单实用的小工具,比如wordcloud,tagxedo,tagul等,那文本聚类、情感分析等有没有小工具呢?答案是“当然有啦”~ 下面分享三个小工具:

以最近异样翻红的我们儿时的偶像“小虎队”中的陈志朋为例(我还是发儿时的印象的他吧,)

2. NLPIR,http://ictclas.nlpir.org/nlpir/,免费获得词性标注、统计、聚类、情感分析等,可以支持自定义文本分析,但仅能支持3000字以内的文本。

希望大家看完这篇之后,是上手实践,而不是去搜“陈志朋 辣眼睛”~

霞光里团队祝亲爱的大家小年小确幸~

————感谢支持霞光里的每一位朋友————

霞光里18号里住着7位热心的用研咪&数据汪

平均4年的乙方专业咨询经验,当前潜伏在各大互联网公司

关注公众号,你提出问题,我们倾囊相助

(虽然我们擅长用户研究,但是你问啥都行)

每周不定天,相约霞光里18号

等你来

“霞光里18号”感谢您的关注

内容版权均归霞光里18号所有

如需转载、合作请公众号留言

本文由咸鱼编辑

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180208G0I6FG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券