千寻的计算机字符,透过《战狼2》影评,细看简单字符处理 | R语千寻

原标题:透过《战狼2》影评,细看简单字符处理 | R语千寻

ced37702ae22fd9bc2d99cea50308276.png

“上一期的内容介绍了如何在复杂长文本中进行信息的有效提取。我们以旅游产品的标题文本和《倚天屠龙记》的小说文本为例,借用R中自带的字符处理函数,实现了提取关键词生成衍生变量的目的。

然而现实中,文本里包含的内容往往复杂多样,各国语言可以百花齐放,各种从来没见多的符号更会让你万分感慨语言学的博大精深,只有想不到,没有见不到o(╥﹏╥)o 这些都会大大增加文本处理的难度。与此同时,文本中有效信息的提炼方法也会因具体研究目标的不同而不同。比如你可能会好奇,差评是不是经常比好评的内容更长?标题中加入标点符号是否会更加吸引眼球?为了应对各式各样的文本,解决各种各样的问题,我们只能十八般武艺样样精通。

本期内容中,我们就以《战狼2》的影评文本为例,对R中常用的字符处理函数进行细致的梳理,希望帮大家打下良好的基础,在未来的文本分析中做到游刃有余。”1背景介绍

好了,既然咱们这一期的主题还是“怼”文本,就得先找一份有趣又好怼的文本材料。恰逢笔者接下这口大锅之时,还裹在被窝里温习着去年因为不想随大流,而放弃前往影院观看的《战狼2》,很自然地便将这锅儿与《战狼2》绑定了起来。

相信大家都还记得《战狼2》创下的惊人票房记录,上映短短一个多月时间,吴京执导的这部爱国主义电影就风卷残云般席卷了56.8亿票房,牢牢坐稳了国内历史第一的宝座。于是乎,作为一个完(tiao)美(ci)主义者,笔者很顺(bie)其(you)自(yong)然(xin)地就跑到了某网站并且把有关《战狼2》的观后评价爬了下来,以此文本来探究这部高票房电影的观后风评究竟几何。

65372b71b42342c3d30456e075f85f14.png

2数据介绍

我们从某电影点评网站上爬取了《战狼2》的所有电影影评共3677条。每条影评包括:用户名,用户推荐程度,评论时间和评论内容四个变量。下图展示了一些影评的示例。

2936c5be4c113ab12c2cbe69ad587ff2.png

其中,用户推荐程度用星级表示,满分为五星,一星到五星分别代表很差、较差、还行、推荐、力荐。下图展示了所有影评中用户推荐程度的分布情况。可以看出,绝大多数观众对该电影的评价都是推荐和力荐,不过也有少部分观众对该电影不甚满意,给出了很差和较差的评价。是什么原因导致大家对同一部电影的评价如此两极分化呢?大家喜欢或不喜欢背后的原因是什么呢?下面让我们从评论内容中来寻找答案。

dadac45c542483a221ea2dc13de67564.png

3数据读入

首先,我们将《战狼2》影评数据集“影评.csv”读入,然后观察其前6行的情况,如下:

292514c6b7953a7198dfbfe3e6e53f4c.png

2fc35f3ccfe16fa67a4a137ae77460c4.png

看到这,我的内心是崩溃的。这些评论文本里中英文混杂姑且不说,各种标点符号尚且不管,竟然还有“\n”这种换行符!这要怎么从中找到有用的信息呢?接下来,就让我们看看如何借助R中的字符处理函数从这些文本中大浪淘金。

4字符处理函数

(1)字符替换函数:gsub/sub

我们注意到在上面用head()函数展示出的文本内容有很多没有意义的空格和换行符“\n”。因此为了使我们后面的文本分析进行得更顺利,我们需要将这些杂乱的符号去掉,这时候就需要使用到sub/gsub函数来进行替换了。这两个函数的使用规则为:

gsub(pattern, replacement, x...)

sub(pattern, replacement, x...)

上述参数中的pattern指在文本中想要被替换的内容,replacement指添加到文本中的替换内容,x指执行替换操作的文本。

同时需要注意的是gsub与sub也有很大的区别。gsub函数会“贪婪”地寻找字符串中符合pattern的地方并替换掉,而sub函数则只会遇到第一个符合pattern的地方并将其替换掉,并不会对后续的地方进行替换。举个例子,在“ 熊大是老大”这句话中,如果用gsub函数将“大”替换为“二”,就变成“熊二是老二”;而如果用sub函数进行替换,就只会得到“熊二是老大”。

下面请看该函数在《战狼2》影评内容中的运用,我们使用gsub函数将文本内容中的空格和“\n”替换为空。在pattern部分," +|(\n)" 是正则表达式。其中,“+”其实就是表示{1,}匹配之前一个或者多个空格,在此处不加“+”执行出来的也是相同结果,原因是我们使用的是gsub函数,若是使用sub函数一定要相当小心,另外类似符号“+”的还有符号“?”表示{0,1}以及符号“*”表示{ 0, };另外符号“|”为取“或”,也就是匹配空格或者“\n”。所以整个patten部分的含义是:匹配文本中出现的多处空格或“\n”。我们展示了匹配后的第三条文本的内容,可以看到,这条评论中的空格以及换行符“\n”已经被删除,评论内容由此变得精简不少。

a98eeec45987a7292fa83b11c5b7db02.png

(2)字符统计函数:nchar

在替换掉杂乱的东西之后,我们就需要更深入的去了解各条评论的特点了。毫无疑问,每条评论的篇幅直接决定了观者对于评论的第一印象。更长篇幅的影评往往包含更丰富的信息,说服力也更强。决定篇幅大小的首要指标就是字符数了。R中统计字符数的函数是nchar,它的使用方法十分简单,示例如下:

需要注意的是,nchar统计的是字符数,而不是字数,也就是说空格,标点符号什么的都会被计入其中。下面我们来看一看用nchar统计之后,所有用户评论的直方图分布,以及不同评级下用户评论的字符数情况。

882fad1afd69c4593b84458bb05aa745.png

从上方的直方图可以看出来,该网站的用户评论字符数两极分化比较明显,我们大致可以把在该网站上评论的用户分为两类,要么就是“评论水经验”型,要么就是“长篇大论话痨”型。“评论水经验”型用户的大部分评论都在20~30个字符数左右,也就是大概两句话完事儿,而“话痨”型用户的大部分评论字符数在140左右。此外,我们计算了不同用户评级下评论字符数的平均值,见下方的柱状图。可以看出,“很差”“较差”以及“力荐”的平均字符数较高,“还行”和“推荐”的平均字符数较低,这表明当用户很推荐或者很不推荐这部电影时,都会用很多篇幅来阐述理由。

(3)字符串分割函数:strsplit

除了字符数,我们有时还会关注文本中的句子数。一个句子通常表达了一个较为完整的语义,因此句子越多同样代表内容越丰富。那如何统计评论中的句子数呢?我们首先将常用标点符号作为分隔符,使用strsplit函数将评论分开。strsplit函数用法同样不难,它的使用规则为:

strsplit(x,split=...)

其中,第一个参数x表示待分割的字符串,第二个参数split表示分割符。举个例子,strsplit(“123456789”, split = “5”),输出的结果会是两个字符串“1234”与“6789”,尤其需要注意的是作为分隔符的“5”被去掉了。

在对《战狼2》的影评文本进行分句时,我们将中英文形式的逗号、句号、问号都作为分隔符,各个分隔符之间取“或”的关系,这样句子就会以这些分隔符为界限将一条评论拆分成几句话。具体程序如下:

f27e784105a466d9a023fb368fd2761f.png

由于dataset$comments是一个由文本内容构成的向量,strsplit函数会对该向量中的每一条文本进行分割,每条文本的分割结果以向量的形式保存,所有文本的分割结果以列表的形式保存,我们将其命名为sentence。

接下来,我们使用apply函数族对列表sentence中的每一个元素进行长度统计。分割后向量的长度数即为分句数。这里我们想要把长度数的结果保存为向量,因此使用了sapply函数,如果想要保持sentence原有的列表结构,可以使用lapply函数。

43e2f73d530c8708b8d55a4b85eb20e1.png

下图展示了所有用户评论分句数的分布情况。与字符数的分布情况类似,分句数也呈现较为明显的两极分化,大部分的用户评论都在3句左右完事儿。当然“话痨”型网友就真是各显神通了,评论大于3句左右的用户数量近似正态分布。

843408ca82474d46c9a930e35dca3cd2.png

(4)字符查找函数:grep/grepl

对评论内容有了篇幅上的理解之后,我们需要对评论的具体内容进行研究。我们经常会在文本中搜索某个特定的关键词,然后将包含该关键词的评论内容提取出来。比如,我们想看看提到了“精彩”二字的评论都有哪些,这可以帮助我们粗略判断各条评论的主要思想和内容。对此,我们可以使用字符查找函数grep/grepl来进行处理,示例如下。

6f859a3dbd452602371f0ea90c06e52c.png

该函数的用法也很简单,第一个参数是查找的关键词,第二个参数是待查找的文本内容,第三个函数value表明返回值情况,value = T时直接返回找到的内容,否则返回序号。

grepl函数与grep函数用法相似,区别在于grepl函数返回的是逻辑值,表明每条文本中包含或者不包含该关键词。例如,下面的结果表示前6条评论中都没有出现“精彩”二字:

276837fc0da52197c7e0c0f6caf8cc5c.png

(5)字符提取函数:stringr::str_match

细心的读者可能已经注意到了,每条评论后面总有一些“多少有用,多少没用”的文本,这其实是其他用户对该条评论的评价,即有多少用户认为该条评论对于他们了解这部电影或决定是否去看这部电影是有帮助的,有多少评论是没有帮助的。一条评论获得的有用数越多,无用数越少,表明这条评论的影响力越大。为了提取这部分信息,我们可以使用stringr这个程序包中的str_match函数。这个函数的用法很简单,它的使用规则如下:

str_match(x,pattern...)

其中,第一个参数x表示想要处理的字符串,第二个参数pattern表示想要匹配的字符串,同样经常用到正则表达式的形式。这里,为了提取文本中的有用数和无用数,具体的程序如下:

69ddea1ebb101b9b7b19bf5112781a3a.png

在上述语句中,我们同样使用了正则化的pattern形式,即匹配“任意数字+有用”或者“任意数字+无用”的格式。该函数与之前介绍的grep函数不同的是,其只会返回我们想要查找的字符串,而不是包含这个字符串的整条文本,这正是我们所需要的。

写在最后:

本期内容中,我们系统介绍了几种常用的字符处理函数,它们能帮助我们将纷杂混乱的文本整理成较为规范的形式,是在R中处理文本数据必不可少的工具。当然,R中还有很多其他的字符处理函数,像paste和paste0,用来进行字符串拼接,像str_count(),用来统计特定字符串出现的次数,等等不一而足,感兴趣的读者可以自行学习下。不过,仅有这些工具还是远远不够的,对于中文文本来说,我们的分析单位不是一个个字符,而应该是一个个“词”。所以,对文本内容进行分词,并且把词分好,就变得非常重要。如何在R中进行中文分词呢?我们下期内容见。返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值