用户
搜索
  • TA的每日心情
    开心
    2017-8-10 13:57
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    SRC部落

    Rank: 7Rank: 7Rank: 7

    39

    主题

    48

    帖子

    2103

    魔法币
    收听
    0
    粉丝
    1
    注册时间
    2016-8-31

    i春秋认证SRC部落

    发表于 2017-4-6 18:11:01 831621
    本帖最后由 唯品会SRC 于 2017-4-6 18:27 编辑

    e4a7587abab9b1887d63266cd008b1ca.jpg


    由于错误的标点符号,大小写字母的不一致,断行和拼写错误等问题,凌乱的数据是网络中的大问题,本次唯科普将介绍一些工具和技术,通过改变代码的编写方式,帮你从源头控制凌乱的数据,并且对已经进入数据库的数据进行清洗。





    编写代码清洗数据

    在语言学里面有一个模型叫n-gram,表示文字或者n 个连续的单词组成的序列。在进行自然语言分析的时候,使用n-gram 或者寻找常用词组,可以很容易的把一句话分解成若干个文字片段。本篇将重点介绍如何获取格式合理的n-gram 数据。


    使用下列代码将会返回wiki 词条Google_Ngram_Viewer 的2-gram 列表:

    04961b29081b8f58db573c4df26e1f2f.jpg

    Ngram 函数把一个待处理的字符串分成单词序列(假设所有单词按照空格分开),然后增加到n-gram 模型中(本例中是2-gram 模型)再形成以每个单词开始的二元数组。


    这段程序会从文字中返回一些2-gram 序列:
    [uabbreviations, uwill], [uwill, uallow], [uallow, ua], [ua, uform], [uform, uof], [uof,umatching,], [umatching,, usuch], [usuch, uas], [uas, uusing]
    不过,同时也有凌乱的数据:
    [ush96008834\nGND:,u4434275-5\nSUDOC:],[u4434275-5\nSUDOC:, u051626225\nBNF:],[u051626225\nBNF:, ucb13560465c],[ucb13560465c,u(data)\n\n\n\n\n\n\n\n\n\n]]
    另外,因为每个单词(除了最后一个单词)都需要创建一个2-gram 序列,所以这个词条里共有8414 个2-gram 序列,这并不是一个非常便于管理的数据集。
    这时候就可以先用正则表达式来过滤掉一些我们并不希望出现的数据。

    首先把内容中的换行符(或多个换行符)替换成空格,再将多个空格替换为单个空格,以确保所有单词之间只有一个空格。

    29a85c8d730422fa71122d80e0d2e364.jpg


    此时已经可以大大改善输出效果了:
    [[u, uPython], [uPython, uParadigm], [uParadigm, umulti-paradigm:], [umulti-paradigm:,uobject-oriented,], [uobject-oriented,, uimperative,]
    但是还是会有小问题,因此需要增加一些规则来处理数据:
    • 剔除单字符的单词,除非这个字符是i 或者u
    • 剔除引用字符
    • 剔除标点符号
    现在清洗任务列表变得越来越长了!
    没关系,让我们把规则都移出来,单独建立一个函数,取名为cleanInput~
    451b99d07148866e7ad49bc665715d6b.jpg

    e74dc18f411f12de03891afb1c117941.jpg




    可以看到,我们使用了import string 和string.punctuation 来获取Python 所有的标点符号,你也可以在Python 命令行里面查看这些标点符号有哪些:
    import string
    print string.punctuation
    !#$%&()*+,-./:;?@[\]^_`{|}~
    在循环体中用item.punctuation 对内容中的所有单词进行清洗,单词两端的任何标点符号都会被去掉,但带连字符的单词(连字符在单词内部)仍然会有保留。这样输出的2-gram 结果就更加干净了:
    [[uPython,uParadigm], [uParadigm, umulti-paradigm], [umulti-paradigm, uobject-oriented],[uobject-oriented, uimperative], [uimperative, ufunctional], [ufunctional, uprocedural],[uprocedural,…..

    数据标准化
    相信每个人都会遇到一些设计不够人性化的网页吧!比如“请输入你的电话号码”,号码格式必须是xx-xx-xxx 等,但是作为一名有职业素养的程序员,可能会问“为什么不自动的在输入的信息对信息进行清洗?去掉非数字内容,然后自动的把数据加上分隔符呢?”

    数据标准化过程要确保清洗后的数据在语言学或逻辑上是等价的,比如电话号码虽然显示成(555)123-4567 和555.123.4567 两种形式,但是实际号码是一样的。还用之前的n-gram 示例,让我们在上面增加一些数据标准化特征。但是原先的示例中有明显的问题,那就是先把每个n-gram 序列都加入了列表,没有统计过序列的频率。掌握2-gram 序列的频率,而不只是知道某个序列是否存在,这不仅很有意思,而且有助于对比不同的数据清洗和数据标准化算法的效果。如果数据标准化成功了,那么唯一的n-gram序列数量就会减少,而n-gram 序列的总数(任何一个n-gram 序列和与之重复的序列被看成一个n-gram 序列)不变。也就是说,同样数量的n-gram 序列,经过去重之后“容量bucket”会减少。
    不过Python 的字典是无序的,不能像数组一样直接对n-gram 序列频率进行排序。字典内部元素的位置不是固定的,排序之后再次使用时还是会变化,除非你把排序过的字典里的值复制到其他类型中进行排序。
    好在Python 的collections 库里面有一个OrderedDict 可以很好的解决这个问题:

    e50fc7578d9963f8948179c6610b56da.jpg


    d7c3db973e578a370e1666061caa2534.jpg

    结果输出如下:
    OrderedDict([(of Python, 41), (Software Foundation, 36), (Python Software, 36), (of the, 33),(Foundation Retrieved, 32), (in the, 22), (in Python, 21), (van Rossum, 20), (Retrieved February, 19), (such as, 18), (is a, 18), (org Retrieved, 17), (python org, 16), (Python is, 15),(Python Enhancement, 15), (from the, 15), (to the, 15), (the Python, 14), (Python has, 14),(Enhancement Proposals, 14), (Proposals Python, 14), (Python and, 13), (Python Python, 12),(by the, 12), (as a, 12), (Retrieved March, 12), (Rossum Guido, 12), (can be, 11), (for Python,11), (Retrieved January, 11), (be used, 11)…….
    可以看到相应词语出现的具体次数及频率,这里使用了Python 的排序函数
    https://docs.python.org/3/howto/sorting.html 把序列频率转换成了OrderDict 对象,并按照频率值排序。


    数据存储后再清洗
    对于编写代码清洗数据,你能做或能想的事情只有这些。除此之外,你可能还需要处理一些别人创建的数据库,或者要对一个之前没有接触过的数据库进行清洗,此时可以使用一些第三方的库,像OpenRefine,不仅可以快速简单地清洗数据,还可以让非编程人员轻松地看见和使用你的数据。
    OpenRefine
    OpenRefine(http://openrefine.org/)是Metaweb 公司2009 年发布的一个开源软件,Google在2010 年收购了Metaweb,把这个项目的名称从Freebase Gridworks 改成了Google Refine。2012 年,Google 放弃了对Refine 的支持,让它重新成为开源软件,名字改成了OpenRefine,现在每个人都可以为这个项目做贡献。


    1、 安装
    OpenRefine 的独特之处在于他的界面是一个浏览器,但实际上是一个桌面应用,必须下载并安装(http://openrefine.org/download.html)。你可以从他的下载页面下载对应的Linux、Windows 和MAX OS 系统的版本。官网这个地址在Windows 的安装包资源若无法下载,也可以直接下载ZIP 包:
    https://github.com/OpenRefine/OpenRefine/releases/download/2.5/google-refine-2.5-r2407.zip
    将次解压到Windows 某个目录之后,运行google-refine 即可
    2、使用OpenRefine
    在下面的例子中,我们将使用维基百科的文本编辑对比表格里的内容,
    https://en.wikipedia.org/wiki/Comparison_of_text_editors
    如图“显示在OpenRefine 身屏幕上的维基百科的文本编辑器对比表格”,虽然这个表的样式比较规范,但里面包含了多次编辑的痕迹,所以还是有一些样式不一致的地方。另外,因为这个数据是写给用户阅读的,而非机器,所以原来使用的一些样式(比如用Free 而不是“$0.00”)不太合适作为OpenRefine 程序的输入数据。
    86f519597c9f21d6bffb45aaef9b60fe.jpg


    图“显示在OpenRefine 身屏幕上的维基百科的文本编辑器对比表格”



    筛选:数据筛选可以通过两种方法实现:过滤器Filter 和切片器facet,过滤器可以用正则表达式筛选数据:
    a9635cf1f112949fa1777f54d4dfbde4.jpg

    过滤器可以通过右边的操作框轻松的组合、编辑和增加数据,还可以和切片器配合使用。
    OpenRefine 还有很多关于单元格编辑和GERL 数据变化的方式,详情介绍可点击OpenRefine的Github 首页查看
    https://github.com/OpenRefine/OpenRefine/wiki/General-Refine-Expression-Language
    youtube 上也照理还是有很多不错的入门简介,相信大家一定可以玩的很愉快。
    https://www.youtube.com/watch?v=yNccGtn3Wb0



    下期预告
    在下期的唯科普8 中,我们将使用2-gram 和3-gram 来做文本摘要提取和语法分析。
    欢迎关注唯品会安全应急响应中心微信公众号,第一时间获悉唯科普最新资讯,相信从今天开始,大家一定能发现更多不一样的唯科普!让我们下期见吧~
    本期参考资料:
    http://openrefine.org/
    https://en.wikipedia.org/wiki/N-gram
    VSRC | 唯科普
    唯科普是VSRC一个面向大众的科普专栏,唯科普旨在分享各种有趣的干货文章,且会由浅入深,推出各种专题连载。
    此次的《小白终结者系列之“基于Python的数据采集》,暂定有14篇,该系列将会从底层网络通信开始,讲解数据包的传递,正则表达式的书写,基于API的数据采集,数据存储,文件读取,数据清洗,自然语言处理等。
    希望唯科普,能受到大家的喜欢。大家若有任何想法,欢迎随时与我们交流。


    精彩原创文章投稿有惊喜!

    580d9bd882d57e4c305d473cecea6d51.jpg 欢迎投稿!

    VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送(至少为500元唯品卡)我们为您准备的丰富奖品包括但不仅限于:MacbookAir、VSRC定制雨伞,VSRC定制水杯以及VSRC精美靠枕!(活动最终解释权归VSRC所有)





    点击原文阅读 VSRC唯科普 |(第6/14篇)

    49d0e12b8f42d156c0e91b895dda93c9.jpg
    f7e9a3601f3e926f05a43b09d0cd24f8.jpg
    052fec901124b744eac97fb200df45a5.jpg
    3b8f4cf13b69dbac09b67cd5acc6d001.jpg
    粉红色的代码,也是很骚气
    使用道具 举报 回复
    。。。。这不就是网络数据采集里面的内容么
    使用道具 举报 回复
    骚粉好厉害
    使用道具 举报 回复
    Ttttt_ i春秋-脚本小子 网络安全高级脚本小子
    4#
    发表于 2017-4-8 12:00:32
    代码辣眼睛啊辣眼睛
    La vraie vie est absente.
                  Nous ne sommes pas au monde.
    使用道具 举报 回复
    发表于 2017-4-9 11:46:42
    看的不是很懂
    使用道具 举报 回复
    发表于 2017-4-9 19:31:28
    v看的不是很懂
    使用道具 举报 回复
    发表于 2017-4-10 10:46:14

    VSRC的V?
    i春秋“培育信息时代的安全感”!
    使用道具 举报 回复
    发表于 2017-4-10 18:19:34
    前排瞻仰
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册