前段时间参加了Kaggle上的Mercari Price Suggestion Challenge比赛,收获良多,过些时候准备进行一些全面的总结,本篇文章先谈一个比赛中用到的小技巧。

这个比赛数据中有一个特征叫做 "item_description",大致是一些商品描述,比如什么时候买的、新旧程度如何、什么牌子的等等。因为大部分都是Mercari这个网站(这个类似于国内的二手商品交易网站)上的用户自己填的商品描述,所以是极尽杂乱之能事,会出现很多夸张的符号,比如这样:

另外的一大问题是用语规范不统一,比如 $1.100$1.1 其实是一个意思,然而在对文本进行特征提取时就会被当成两个特征,这会使特征变得过于稀疏,对模型的效果也会产生影响。所幸Pandas中提供了str.replace()这个方法,可以高效处理此类问题。

str.replace()的作用基本与re.sub()等同,区别在于re.sub()一次只能处理一个字符串,而str.replace()可以一次处理一整个Series,因而效率要高很多。str.replace()的正式形式为 Series.str.replace(pat, repl) ,其中pat为想要寻找的模式,一般为正则表达式,repl为要替换进去的字符串或函数。

下面是几个简单的例子,X代表一个Series,repl皆为字符串:

X.str.replace(r"iphone\s+7", "iphone7")  #为了将iphone7视为一个词,把iphone 7转换为iphone7,去除空格。
X.str.replace(r"16gbiphone", "16gb iphone") #将16gbiphone转换无16gb iphone,增加空格。
X.str.replace(r"fl\s?\.?\s?oz", "floz") #将fl.oz或fl . oz转换为floz

如果是一些比较复杂的情况,则需要将repl自定义为函数:

1) 将1.101000变为1.101,即将后面的"0"去掉。

remove0 = lambda m:m.group(0).rstrip("0")
X.str.replace(r"\d\.\d*[1-9]+0+", remove0)

上例中将repl定义为一个匿名函数,m.group(0)为匹配到的所有字符串,注意其不会匹配到1.000的情况,因为pat中存在[1-9]。

2) 将1.000kg变为1kg,这里因为要去除的.0两个字符位于中间,所以无法用上面的rstrip()

table1 = str.maketrans("","","0.")
remove1 = lambda m:m.group(0).translate(table1)
X.str.replace(r"\.0+[a-z]+", remove1)

上例中使用str.maketrans()方法指定想要删除的字符,再用translate()删除。这是python 3的写法,python 2中可直接使用translate()

# python 2
remove1 = lambda m:m.group(0).translate(None,"0.")
X.str.replace(r"\.0+[a-z]+", remove1)

3) 将0.0300kg转换为0.03kg。这里由于0.03本身存在0,所以不能用str.maketrans()了,因为会将所有0都删除。所以这里用两个正则表达式分别找到0.03和kg,再拼接起来:

def remove2(data):
al1 = re.findall(r"\d+\.\d*[1-9]+0+",data.group(0))
al2 = re.findall(r"[a-z]+",data.group(0))
return al1[0].rstrip("0") + al2[0] X.str.replace(r"\d+\.\d*[1-9]+0+[a-z]+", remove2)

4) 将1.100%转换为1 100%, 这么做的目的是1.100%可能会被转换为一个词,而实际想要提取的肯定只有100%:

def remove3(data):
al1 = re.findall(r"\d+(?=\.)", data.group(0)) # 这里使用了零宽断言(?=),是为了去除”.“
al2 = re.findall(r"100%", data.group(0))
return al1[0]+" "+al2[0] X.str.replace(r"\d+\.100%", remove3)

5) 商品中有很多衣服鞋子之类的,一般都标有尺码,比如3",15”等。这里要把后面的尺码符号‘ ” ’提取出来并用“colon”表示,让模型识别出前面的数字3和15是代表尺码大小。

def findcolon(data):
al1 = re.findall(r'\d{1,2}\.\d{1,3}|\d{1,2}|1\d{2}', data.group(0))
return al1[0]+" colon " X.str.replace(r'(?:\d{1,2}\.\d{1,3}|\d{1,2}|1\d{2})(?:\s?\")', findcolon) # 匹配2.3“, 55", 132"等,转换为2.3 colon

由此,本文结合比赛中的例子介绍了几种清洗文本的方法,另外Pandas中还提供了其他很多有用的处理文本的方法,详见文档 Working with Text Data

/

使用Pandas: str.replace() 进行文本清洗的更多相关文章

  1. Pandas: 使用str.replace() 进行文本清洗

    str.replace()可以一次处理一整个Series.str.replace()的正式形式为 Series.str.replace(pat, repl) ,其中pat为想要寻找的模式,一般为正则表 ...

  2. str.replace()和re.sub()/calendar.month_abbr/re.subn()/upper和lower和capitalize/贪婪匹配和费贪婪匹配/re.S和re.DOTALL 笔记

    str.replace()可以进行简单的替换 >>> a = 'one.txt, index.py, index.php, index.html, index.js' >> ...

  3. Uncaught TypeError: str.replace is not a function

    在做审核页面时,点击审核通过按钮不执行 后来F12控制台查看发现有报错 是因为flisnullandxyzero未执行 然后找出这个方法,此方法为公共方法,将这个方法复制出来 然后使用console. ...

  4. str.replace替换变量名的字符串

    网易云课堂该课程链接地址 https://study.163.com/course/courseMain.htm?share=2&shareId=400000000398149&cou ...

  5. replace限制文本框只能输入数字,数字和字母等的正则表达式

    1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafte ...

  6. SQL用replace替换文本部分内容

    替换文本内容 update tk_question set stem=replace(cast(stem as varchar(max)) ,'被替换文本','替换文本') 查询字段内容长度 sele ...

  7. Excel常见文本清洗函数

    1.=LEFT(text,[num_chars]) ​ 函数RIGHT具有相似功能 例如选出K列中,从左数前一个字符:= LEFT(k2,1) 2.=FIND(find_text,within_tex ...

  8. sql server REPLACE 替换文本中的回车和换行符

    --替换回车符 REPLACE(exp, CHAR(13), '')   --替换换行符 REPLACE(exp, CHAR(10), '')   --水平制表符 REPLACE(exp, CHAR( ...

  9. js实现千位分隔符——str.replace()用法

    /*js*/function commafy(num){ return num && num.toString().replace(/(\d{1,3})(?=(\d{3})+(?:$| ...

随机推荐

  1. [Axiom 3D]2.Axiom 基本概念

    1.Root Root 对象是一个 Ogre 应用程序的主入口点.因为它是整个 Ogre 引擎的外观(Façade )类(请参考设计模式中的外观模式),所以在这里作为第一个被列出来的类,它提供了方便的 ...

  2. Spark Streaming带状态更新

    带状态的更新是使用的updateStateByKey方法,里面传入一个函数,函数要自己写,注意需要设置checkpoint import org.apache.spark.streaming.kafk ...

  3. samba文件共享服务配置一(共2节)

    一.samba服务简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上 ...

  4. Struct2小结:

    Action小结: 实现一个Action的最常用的方式:从ActionSupport继承: DMI动态方法调用,减少配置内容: 通配符 *_* ({1},{2})的使用更方便: 接收参数的方法(一般用 ...

  5. oracle 死锁查询及处理

    SELECT    bs.username "Blocking User", bs.username "DB User",          ws.userna ...

  6. hdu5102 枚举每条边的长度

    题意 给了 一颗 有 100000 个节点的树, 他们构成的边有 n*(n-1)/2 种. 每条边有一个长度,长度排序后 取前K条的 和, 枚举每条长度为1 的边 放进队列,然后通过成都为1 的表去 ...

  7. aTool在线工具

    在线HTTP POST/GET接口测试工具 - aTool在线工具 地址:http://www.atool.org/httptest.php在线接口测试工具接口测试是测试系统组件间接口的一种测试.接口 ...

  8. 20145319 《网络渗透》MSF基础应用

    20145319 <网络渗透>MSF基础应用 一 实验链接 渗透实验一:MS08_067渗透实验 渗透实验二:MS11_050渗透实验 渗透实验三:Adobe阅读器渗透实验 渗透实验四:M ...

  9. IC行业

    定位IC行业,其实很简单. 我不是IC数据统计的专家,但是可以看出IC行业的发展: 在20年前,毛利是1000%,行业增长在每年20%以上 在10年前,毛利是200%,行业增长在每年10%以上 在现在 ...

  10. CentOS7.2 安装Tomcat

    Centos默认安装JDK 现在要删除旧版本的jdk,安装新版本jdk 查看现有jdk: [root@localhost 桌面]# rpm -qa | grep jdk java-1.8.0-open ...