传统的统计学教育几乎没有告诉过我们,如何进行文本的统计建模分析。然而,我们日常生活中接触到的大部分数据都是以文本的形式存在。文本分析与挖掘在业界中也有着非常广泛的应用。
由于文本数据大多属于非结构化的数据,要想对文本数据进行传统的统计模型分析,必须要经过层层的数据清洗与整理。
今天我们要介绍的『正则表达式及R字符串处理』就是用来干这一种脏活累活的。
与建立酷炫的模型比起来,数据的清洗与整理似乎是一种低档次的工作。如果把建立模型类比于高级厨师的工作,那么,数据清洗无疑是类似切菜洗碗打扫卫生的活儿。然而想要成为资深的『数据玩家』,这种看似低档次的工作是必不可少的,并且,这种工作极有可能将占据你整个建模流程的80%的时间。
如果我们能够掌握高效的数据清洗工具,那么我们将拥有更多的时间来进行模型选择和参数调整,使得我们的模型更加合理有效。
下面将要将要举例说明,一一介绍R中常用来处理此类工作的几个函数。
首先学习grep函数,是R语言中最基本的正则表达式函数
赋值:
txt<-c(“one more”,“Hello world”,“up up day”,“one the more”,“one two three”)
num<-c(“one”,“foru”)
regexpr函数
第一行:返回布尔值(1-匹配上,0-没匹配上)
第二行:返回匹配的长度,负值为没有匹配上
第三行:类型
第四行:是否有匹配上的结果(显示是否逐个字节进行匹配,默认为FALSE,即按字符而不是字节进行匹配)
attr(a,“index.type”)# 类型
attr(a,“match.length”) #返回匹配的长度,负值为没有匹配上
attr(a,“useBytes”) #查看是否有匹配上的结果
regexpr()函数只查询匹配第一个特定字符,要想多次匹配需要使用gregexpr()函数
Sub函数, 返回替换字符串后的具体内容
sub(ignore.case,extended,perl,fixed,useBytes,pattern,replacement,x)
参数:
ignore.case = FALSE,表示大小写敏感
extended = TRUE,表示使用egrep规则
perl = FALSE,表示不使用Perl规则
fixed = FALSE,表示不使用精确匹配
useBytes = FALSE,表示按字符匹配
pattern为字符串表示正则表达式
replacement也是字符串表示替换的内容
x为字符型向量表示被替换的字符向量
该函数会根据pattern的规则对x中各元素进行搜索,遇到符合条件的第一个子字符串的位置(gsub是替换所有符合条件的),用replacement替换该子字符串,返回替换后的结果,和x的结构相同
我们对replacement统一赋值为“”,在c(“abcd”,“dcba”)里面查找"a",替换为空。
该例中的"a"只是一个字符,并不是正则表达式,真正的正则表达式依靠元字符进行灵活的匹配。
表示将开头为a的字符串中的a替换成空,在返回值中可以发现后面出现的a并没有被替换。如果要将开头的一个字符串替换,简单地写成“^ab”就行。
表示将以a结尾的字符串中的a替换成空。
由于sub只替换搜寻到的第一个,因此这个例子中用gsub效果更好。
以上是最基础的正则表达式元字符,在一些正则表达式的书籍和资料中有非常详细的介绍。最后需要提一下的是“贪婪”和“懒惰”的匹配规则。默认情况下是匹配尽可能多的字符,是为贪婪匹配,默认匹配最长的a开头b结尾的字串,也就是整个字符串。
如果要进行懒惰匹配,也就是匹配最短的字串,只需要在后面加个“?”#就会匹配最开始找到的最短的a开头b结尾的字串。