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

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

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

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

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

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

2数据介绍

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

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

3数据读入

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

看到这,我的内心是崩溃的。这些评论文本里中英文混杂姑且不说,各种标点符号尚且不管,竟然还有“\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”已经被删除,评论内容由此变得精简不少。

(2)字符统计函数:nchar

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

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

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

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

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

strsplit(x,split=...)

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

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

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

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

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

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

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

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

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

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

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

str_match(x,pattern...)

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

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

写在最后:

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

责任编辑:

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

  1. 千寻的计算机字符,R语千寻 | 非结构化数据--文本数据的读入

    原标题:R语千寻 | 非结构化数据--文本数据的读入 " 上一期(),我们介绍了普通数据读入的方法,一般来说,如果你的数据够规矩,够整齐,按照我们上期介绍的方法,注意注意路径.分隔符等常见问 ...

  2. Python爬虫实战:分析《战狼2》豆瓣影评

    一.介绍: 环境:win10 ,jupyter notebook, python3.6,,re, bs4,requests 爬取豆瓣电影<战狼2> 主页: https://movie.do ...

  3. “战狼”无人直升机完成高原靶试

    2019独角兽企业重金招聘Python工程师标准>>> 小编从中国航空工业直升机所获悉,该所自主研制的"战狼"察打一体无人直升机(AV500W),在海拔4300米 ...

  4. 《战狼2》中人脸识别无人机表现不俗,军、警用果真如此高能?

    "非洲某国战乱,战火蔓至海外华人,雇佣兵辣手残杀普通平民,在此危急时刻,前解放军特种兵冷锋挺身而出单刀赴会,中国海军舰队临危上线奔袭掩护-.."前不久上映的军事动作电影<战狼 ...

  5. 《战狼2》电影观后感

    昨晚看了吴京主演的<战狼2>电影,内心受到强烈的震撼.我是一个胆小的女生,看到那种接近战争的场面时,我会很害怕,看到满屏的鲜血时,我还会想要呕吐.全程几乎都不怎么敢睁眼,就这样" ...

  6. 流浪地球与战狼2所反映的文化心态

    这是我在某乎看到并总结的观点,也深为认可. 亨廷顿谈后发国家现代化,有个两步走的概念,第一步是全盘西化,被西方打击的彻底崩溃以至于丧失信心,鄙视本民族的一切成就而严格以西方话语规训自己.第二步则是以我 ...

  7. datetimepicker不可以选择当天之前_专访吴京:网上《战狼3》的消息我都不知道,大家可以选择不信...

    搜狐娱乐讯 (哈麦/文)在2017爆火的<战狼2>之后,吴京演了<祖宗十九代><流浪地球><老师·好><银河补习班><攀登者>& ...

  8. 鸿蒙一号指纹锁,【诉说实情】火车头战狼一号家用防盗门指纹锁怎么样?新手必看内情...

    [诉说实情]火车头战狼一号家用防盗门指纹锁怎么样?新手必看内情有猫眼屏幕 顺丰包邮 包安装 我打算入手,选了很久才看中的,不知道质量怎么样,好不好用,所以来这里请教下大家,希望买过的网友分享一下,客观 ...

  9. 电影《战狼2》的可视化分析

    <战狼2>真心堪称中国的好莱坞大片,不管是打斗场景的展现,还是在特效的细节处理.吴京的那句"我只会花钱在武器上,花在取景上,永远不会花在小鲜肉上!",也是近年来,观众对 ...

  10. 实战:战狼2票房数据分析——(3)数据读取及分析

    前言 前面我们已经成功的把数据从网站上抓取下来并存入了csv文件当中,那么本章就演练将数据从csv中读取出来,并作相应的分析 数据读取 可以使用pandas的函数read_csv来读取数据,默认情况下 ...

最新文章

  1. 求几亿个数中不重复元素的个数
  2. 用终端访问路由器设置端口开发_Serial for Mac(全功能串行终端管理软件)
  3. Linux系统proc详解
  4. Java中集合(二)Vector
  5. 工作章 - 小程序web-view分享 流泪爬坑记
  6. NCMMSC2021喊你开赛!汉语长短视频直播语音关键词竞赛正式启动!
  7. 5s突然一直信号无服务器,手机突然没信号了怎么回事?
  8. linux添加计划任务(转载)
  9. python datetime需要安装_【python从入门到入土】之第一行代码
  10. 全网首发:org.xml.sax.SAXNotRecognizedException: unrecognized features nonvalidating/load-external-dtd
  11. javacv 人脸追踪_JavaCV开发详解之5:基于 JavaCV 的人脸识别
  12. 【转】Java线程池实现原理及其在美团业务中的实践
  13. 解决:视频中有噪声(电流声)怎么办的问题(简单实用高效的视频降噪方法)
  14. 获取json格式中属性—sql
  15. U盘安装win7 启动一键u盘安装Ghost Win7系统教程
  16. c语言对数函数log的使用
  17. 第十四届蓝桥杯模拟赛第一期试题【Java解析】
  18. android网购功能,网购Android App购物车点击动画实现详解
  19. Jackson配置大全
  20. python打包为可执行文件的扩展名,Python脚本文件(.py)打包为可执行文件(.exe)即避免命令行中包含Python解释器...

热门文章

  1. 装linux双系统有什么好处,科学网—Windows和Linux双系统安装教程 - 戴劭勍的博文...
  2. 水花兄弟又凑齐了(20220111 Week2-1)
  3. 深度理解相机中的各个参数(对比度、饱和度、亮度、曝光度、锐度)
  4. 关于萨蒂亚·纳德拉安全演讲你所要知道的
  5. 计算机是好是坏英语作文,电脑游戏是好还是坏英语作文
  6. 小程序怎么接入机器人客服系统
  7. postgresql安装问题error running
  8. 把unc0ver.ipa重签名后安装到手机上实现越狱
  9. 谷歌 AI 团队用 GAN 模型合成异形生物体
  10. python学习-获取时光网电影TOP100电影信息