购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5 stringr字符处理工具

与Hadley出品的其他tidy系列包一样,stringr也具有同样清晰的逻辑结构和参数设置。在stringr包中,函数的参数很少有超过三个的情况,各个常用的函数都只需要指定两到三个参数,这极大地简化了参数设置的过程。加之参数在结构和名称上的一致性,用户很容易就能做到融会贯通。stringr包总体来讲是将stringi总结并优化而来的一个包。简单的字符处理能力,可以极大地提高数据清理的效率。使用stringr包用户能够快速上手使用正则表达式,从而快速处理数据,同时对表达式的基本概念也能有一定的理解,为以后更复杂的任务做好铺垫。

2.5.1 baseR vs stringr

baseR中已存在一些使用正则表达式处理字符串的函数,例如,以grep为母函数的一众函数,包括最常用的gsub,等等。熟悉Linux系统的读者可能会觉得grep看起来很眼熟,这是因为R语言与其他编程语言一样,都借鉴了各种计算机语言的精华部分。表2-25列出了baseR中与字符串有关的函数及其与stringr包中相应函数的对比及小结。该表的意义在于,可以通过学习stringr包中的主要函数来帮助了解baseR包中的对应函数。因为stringr虽然简单易上手,但是在实际处理应用数据时,其在速度上会比baseR又略逊一筹,读者可以通过stringr包中的函数来练习字符处理的能力,在实际工作中使用baseR中的函数来执行具体任务。

表2-25 baseR和stringr包中字符串处理函数对比

下面的代码简略演示了str_replace和str_replace_all的区别以及参数设置。首先加载stringr包,然后创建一个练习用的字符串向量example_txt。对练习对象执行str_replace函数,参数pattern被设置为“a”——意为查询“a”第一次出现的位置,参数replaceement设置为符号“@”——意为使用“@”来替代字母“a”。结果可以看到只有第一个“a”被替换,而字符串中其他的“a”仍被保留。但是str_replace_all会将所有符合要求的部分全部替换掉。BaseR中的sub和gsub函数逻辑与str_replace和str_replace_all相同,只是包含了格外的参数设置来满足更复杂的任务需求。感兴趣的读者可以自行尝试。示例代码具体如下:


> library(stringr)
> example_txt <- "sub and gsub perform replacement of the first and all matches respectively."
> str_replace(string = example_txt,pattern = "a",replacement = "@")
## [1] "sub @nd gsub perform replacement of the first and all matches respectively."
> str_replace_all(string = example_txt,pattern = "a",replacement = "@")
## [1] "sub @nd gsub perform repl@cement of the first @nd @ll m@tches respectively."

2.5.2 正则表达式基础

Regular expression(正则表达式)在目前主流的统计语言上都有应用。使用符号型字符串大规模查找和替换数据,不仅可以提高工作效率,同时还能保证规则的一致性。R中正则表正则表达式的符号意义,请参看表2-26。表2-26中列出了最常见的正则表达式基础单位,读者可以将这些符号想象成儿时乐高积木的小构件,由简到繁地慢慢组合搭配这些构件,以实现不同的数据处理目标。简单构建正则表达式请参见2.5.3节。

表2-26 正则表达式符号及解释

2.5.3 简易正则表达式创建

数据集df是笔者从网络上获取的一组英文期刊作者名和年份(具体见表2-27),以此为例,简单演示正则表达式的组合过程。示例代码如下:

表2-27 练习数据集df内容展示

函数str_view/_all可以很直观地反应出数据内部匹配的项目。“.+”组合的意思是匹配除换行符“\n”以外的所有字符,字符至少出现一次,所以全部的字符都被匹配出来。若只希望匹配“.”,则需要使用反斜杠来告知函数,这是因为独立存在的“.”会被解析为任何除换行符以外的字符、字母和数字(见表2-26)。所以第二行代码就的意思是匹配第一个出现的英文句号:


> str_view(df$authors,pattern = ".+")
  D.F. Guinto pp.121-132
  W.T. Bussell and C.M. Triggs pp.23-27
  A.W. Holmes and G. Jiang pp.37-45
> str_view(df$authors,pattern = "\\.")
  D.F. Guinto pp.121-132
  W.T. Bussell and C.M.Triggs pp. 23-27
  A.W. Holmes and G.Jiang pp. 37-45
> str_view_all(df$authors,pattern = "\\.")
  D.F. Guinto pp.121-132
  W.T. Bussell and C.M.Triggs pp. 23-27
  A.W. Holmes and G.Jiang pp. 37-45

匹配所有字母和数字,代码如下:


> str_view_all(df$authors,pattern = "[:alnum:]+")
  D.F. Guinto pp.121-132
  W.T. Bussell and C.M. Triggs pp.23-27
  A.W. Holmes and G. Jiang pp.37-45

小提示

str_view/_all的返回结果会显示在Rstuido的viwer中,而不会显示在console中。

当处理数据较多时,str_view/_all的速度可能会很慢,可以使用str_detect来检测所使用的表达式在数据中是否有匹配。该函数只返回逻辑判断,代码如下:


> str_detect(df$authors,pattern = "\\.")
## [1] TRUE TRUE TRUE

在df中,页码可以被归类为无用信息,所以需要清理掉。下面的代码使用了str_replace来将页码的部分完全替换掉。匹配模式为"pp\\..+[:digit:]{2,3}\\-[:digit:]{2,3}"。分解这个正则表达式:“pp”匹配“pp”;“\\.”匹配“.”;“.+”代表“pp.”后面的任何字符串;“[:digit:]{2,3}”代表2到3位数字;“\\-”匹配“-”;最后的[:digit:]{2,3}表示数字出现2到3位。


> df$authors <- str_replace(df$authors,pattern = "pp\\..+[:digit:]{2,3}\\-[:digit:]{2,3}",replacement = "")
> df1

处理后的结果显示在表2-28中。

表2-28 去除页码后的演示数据集

更复杂的正则表达式可以参看Garrett Grolemund和Hadley Wickham合著的《R for Data Science》的第14章,或者全面介绍正则表达式的《Mastering Regular Expressions》,Jeffrey E.F.Friedl著。

2.5.4 文本挖掘浅析

文本(包括但不仅限于书刊)挖掘,或者更通俗地讲——自然语言处理(Nature Language Processing),是人工智能领域必不可少的一项技术。每一秒钟,世界范围内都有不计其数的新文本在以各种形式记录或保存起来。但这些以人类语言书写或录制下来的“数据”,并不像二进制的表格式数据那样容易被电脑接受并处理。如何分析人类历史中这些以文本形式保存的数据,就是文本挖掘需要解决的问题。看过《星际迷航》的读者应该会很熟悉舰长们经常说的一句台词“电脑,给我与某某事,某某东西相关的资料”。现实中,苹果的siri已经算是这方面很成功的商业应用模型。也有很多编程数据分析前辈,结合机器学习和自然语言处理来进行音乐创作、文献写作,等等。有关文本挖掘的详细内容已超出本书的讨论范围,所以在此仅简略地介绍文本挖掘的一般流程及可用R包,借此为感兴趣的读者提供一些继续学习的线索。在第3章中讨论完dplyr包中的一些实用函数之后,3.3节会句读者介绍一般的英文科技文献挖掘流程。

图2-4列出了文本挖掘的一般流程,大致可以总结为三个主要部分,具体如下。

图2-4 文本挖掘的一般流程

1)文本数据的获取。

2)文本数据的准备。

3)数据分析。

数据获取的方法多种多样,可以使用网络爬虫抓取网络文本,使用pdftools包读取PDF格式的电子文档,jsonlite包读取JSON格式的文本数据,或者是安装janeaustenr包来获取简奥斯汀的6本著名小说来进行文本挖掘的练习。

文本数据的准备包括清理标点符号、页码等多余信息,以及分词标记和简单的初步统计。通常需要使用正则表达式,其主要目的是将文章中的句子打散以获取单个的词语或词组,并去掉某些无语义贡献的词汇,例如,介词或是助词,再进行一定程度的词频统计等操作。建议有一定英语基础的读者按照《Text Mining with R》这本书开始练习,书的作者就是最易上手的文本挖掘R包tidytext的开发者。希望分析中文的读者可以从quanteda包开始,因为这个包配有中文词库和简单的中文示意。

文本数据的分析根据目的的不同在难度上会有天壤之别。对于初学者来说,预先设置一些已知的规则来对文本数据进行查询式的分析(比如,在简奥斯汀的书中,哪一个角色的名字出现次数最多)这样的词频统计分析可视化,可有助于提高对数据的理解程度和使用各个函数的信心。监督和无监督机器学习需要依靠tm、quanteda、topicmodels等不同的R包的交互使用才可能实现复杂的分析目标。详细内容请感兴趣的读者参阅各个包的主页,这里不再过多讨论。 DH2uhLYEaFjpm/aPNapDuCLsbZiE/vYonW3dAmpa7lyTaZMz4RpGpGENS06kSaYc

点击中间区域
呼出菜单
上一章
目录
下一章
×