【R语言】结巴分词与词性提取(以“提取知乎问题标题的频繁词前100个形容词”实战为例)(3月25日学习笔记)
来源: 陈子扬/
华侨大学
3207
0
0
2020-03-26

本篇笔记在本人CSDN博客浏览效果更佳,点此链接跳转,欢迎批评指正

这一次的作业是基于本人3月24日内容的进一步处理,老师布置的题目为

题目

这一次问题的难点在于词性分类,本文将以此题为例,介绍如何使用结巴分词对中文词语词性进行分类。


0.包的选取

中文分词必不可少的包:jieba


library(jiebaR)

library(jiebaRD)#用于分词


作图包我们选择


library(ggplot2)#用于作图


读取数据可以不额外导入包,使用基础的read.csv函数,但是这样读取效果很慢,建议采用read_csv函数,这一点在我的上一篇笔记中提到过


这个函数时读csv文件时能够把所有character型的变量读成factor型,读取大数据的时候效率更高


类似的函数还有data.table包的fread()函数,这两个函数的异同可以在dingdingxia前辈的博文中阅读


说回read_csv函数,这个函数需要


library(readr)#用于读取数据


此外还需要


library(tidyverse)#enframe函数需要用到

library(dplyr)#用于使用过滤函数filter()


这两个包的使用将在下文提及


1.数据读入

# 工作路径

setwd("D://1Study//R//CH05")

getwd()


# 读入数据

data_titles = read_csv("train_data.csv",col_names = T)

#col_names = T也就是.csv方法中的header=T

data_titles


#另存数据

question_titles = data.frame(data_titles[,2])#另存为数据,只保留标题一栏,使不破坏原数据


当然,col_names默认赋值就是T,不写也可以


2.中文分词与词性标注

seg <- worker('tag')#构筑词性标注环境


seg_question = segment(question_titles$question_title,seg) # 对所有的标题进行中文分词。


seg_question#显示标题中所有的词语及其词性,这一过程需要耗时15秒


str(seg_question)#查看数据类型


title_table <- enframe(seg_question)


title_table

要提取词性,(1)需要构筑词性标注环境

前一篇笔记中提到过engine = worker(stop_word = "stopwordsC.txt")可以在构筑环境的时候使用停用词,这里的seg <- worker('tag')原理也差不多,就是构筑词性标注环境,并且这里不需要去除停用词,因为形容词不是停用词

(2)需要用segment函数套用前面定义的环境对标题进行分词


seg_question = segment(question_titles$question_title,seg) # 对所有的标题进行中文分词。


如果用seg_question = tagging(question_titles$question_title,seg)也是可以的


无论是哪种格式,这里得到的seg_question实质上是一个带属性的向量,这样其实不是特别好用。

因此要把它变成数据框的格式,方便以后利用

这里使用enframe()


title_table <- enframe(seg_question)


这是tidyverse包下的一个函数,作用是将数据存储为tibble数据框,转换为具有名称和值的数据框


如果用前一节课的questionFreq = as.data.frame(table(seg_question))普通的数据框只能生成频数表,得不到词性

这一方法借鉴了黄天元前辈的博文R语言自然语言处理:词性标注与命名实体识别


3.筛选形容词,过滤所有非形容词

#write.csv(title_table,file = "title_table.csv",row.names = TRUE)

#另存为表格,这一过程在我的电脑上需要耗时10秒

adj_question <- filter(.data=title_table,name == "a")

adj_question


filter函数隶属于dplyr包,关于这一函数的使用方法可以参考LEEBELOVED前辈的博文R语言dplyr包:高效数据处理函数(filter、group_by、mutate、summarise)


4.构筑频数表

后续步骤与前一篇笔记的步骤较为类似,在此不再进行详细记录理解。


adj = data.frame(adj_question[,2])#把所有形容词另存为数据,使不破坏原数据

adj

adjFreq = as.data.frame(table(adj))#生成频数表


#过滤出现次数过少的形容词,这一步骤可以省略

adjFreq = adjFreq[-which(nchar(as.character(adjFreq[,2]))<2),]


adjFreq = adjFreq[order(-adjFreq$Freq),]#排序


data = adjFreq[1:100,]#提取问题标题的频繁词前100个形容词


5.绘图

依据前一步得到的频数表绘图


# 对柱子的顺序进行重新排列

data$adj = factor(data$adj,levels = data$adj)


ggplot(data,aes(x=adj,y=Freq))+

  geom_bar(stat="identity")+

  theme(axis.text.x = element_text(angle = 60,hjust = 1))+

  xlab("形容词")+

  ylab("频数")+

  labs(title = '问题标题的频繁词前100个形容词')

最后附上完整代码及结果柱状图

在这里插入图片描述

######

#根据知乎问题标签预测数据训练集(train_data.csv)

#提取问题标题的频繁词前100个形容词

library(jiebaR)

library(jiebaRD)#用于分词

library(ggplot2)#用于作图

library(readr)#用于读取数据

#install.packages("tidyverse")

library(tidyverse)#enframe函数需要用到

library(dplyr)#用于使用过滤函数filter()

#####

#1.数据导入

#####


# 工作路径

setwd("D://1Study//R//CH05")

getwd()


# 读入数据

data_titles = read_csv("train_data.csv") #read_csv读取大数据的时候效率更高

data_titles


#另存数据

question_titles = data.frame(data_titles[,2])#另存为数据,只保留标题一栏,使不破坏原数据


#####

#2.中文分词与词性标注

#####

seg <- worker('tag')#构筑词性标注环境

#这里不需要去除停用词,因为形容词不是停用词

seg_question = segment(question_titles$question_title,seg) # 对所有的标题进行中文分词。


seg_question#显示标题中所有的词语及其词性,这一过程需要耗时15秒


str(seg_question)#查看数据类型

#这里得到的seg_question实质上是一个带属性的向量,这样其实不是特别好用。

#因此我要把它变成数据框的格式,方便以后利用。


title_table <- enframe(seg_question)

#将上述数据存储为tibble数据框,转换为具有名称和值的数据框

#如果用前一节课的questionFreq = as.data.frame(table(seg_question))普通的数据框只能生成频数表,得不到词性


title_table


#####

#3.筛选形容词,过滤所有非形容词

######

#write.csv(title_table,file = "title_table.csv",row.names = TRUE)#另存为表格,这一过程需要耗时10秒

adj_question <- filter(.data=title_table,name == "a")

adj_question


#4.构筑频数表

######

adj = data.frame(adj_question[,2])#把所有形容词另存为数据,使不破坏原数据

adj

adjFreq = as.data.frame(table(adj))#生成频数表


#过滤出现次数过少的形容词,这一步骤可以省略

adjFreq = adjFreq[-which(nchar(as.character(adjFreq[,2]))<2),]


adjFreq = adjFreq[order(-adjFreq$Freq),]#排序


data = adjFreq[1:100,]#提取问题标题的频繁词前100个形容词


#####

#5.绘图

######

# 对柱子的顺序进行重新排列

data$adj = factor(data$adj,levels = data$adj)


ggplot(data,aes(x=adj,y=Freq))+

  geom_bar(stat="identity")+

  theme(axis.text.x = element_text(angle = 60,hjust = 1))+

  xlab("形容词")+

  ylab("频数")+

  labs(title = '问题标题的频繁词前100个形容词')


以上内容为我对R语言结巴分词与词性提取的理解以及“提取知乎问题标题的频繁词前100个形容词”的实战,若理解有误,欢迎批评指正。

————————————————

版权声明:本文为CSDN博主「纸羊同学」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_46124302/article/details/105092765



登录用户可以查看和发表评论, 请前往  登录 或  注册
SCHOLAT.com 学者网
免责声明 | 关于我们 | 联系我们
联系我们: