数据清洗:

对占中新闻进行数据清洗



王成军

[email protected]

计算传播网 http://computational-communication.com

In [70]:
# 使用with open读取每一行数据
with open("/Users/chengjun/github/cjc2016/data/occupycentral/zz-hk-2014-10.rtf") as f:
   news = f.readlines()
In [71]:
# 查看总共有多少行
len(news)
Out[71]:
16541
In [73]:
# 注意:标题和版面之间存在一个空行!所以title是block的第4个元素。
for i in range(1, 8):
    print news[i].decode('gb18030')[:500]
~~~~~~~~~~~~~~~~~~~~~~~~~~  #1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ \par

am730 | 2014-10-31 \par

A16| NEWS| C观点| By 施永青 \par 



法治有整合社会功能 \par

\par

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \par

In [74]:
# 需要对中文编码的对象使用中文的方式进行解码
print news[17].decode('gb18030')[:500]
\par\par 前文已介绍过塔尔科特·帕森斯的AGIL理论中的Adaptation(适应)与Goal Attainment(达标)的社会功能,今天续谈Integration(整合)的功能。人类社会是一个复杂系统,大系统内还有很多次系统,这些系统既独立,又牵连;既矛盾,又互适;有时互相促进,有时互相制约。正如一个人,既是社会的成员,又是公司的雇员;既是别人的儿子,又是朋辈中的「大哥」;其言行会同时受所处的不同系统所影响。\par\par 这些错综复杂的系统之间不可能没有冲突,为了避免社会因纠纷得不到恰当的处理而分崩离析,社会必须发展出一套整合矛盾的方式,这就需要有司法制度。\par\par 按帕森斯的说法,法治的基础是先要界定产权。这样才能避免因争夺资源而产生无休止的冲突。再者,交易亦需要在产权获得界定后才能进行。有交易才有市场,才能透过市场机制进行公平竞争,推动经济发展。\par\par 另一方面,社会亦需要为人权下定义,这样,政府才能在有认受性的情况下组成,才能有效地去处理公众事务。此外,社会还需要有一套合乎公义的会议程序,以决定如何汇聚众人的意愿。\par\par 有了这些基础之
In [75]:
# 定义一个函数:实现解码、编码、清洗效果
def stringclean(s):
    s = s.decode('gb18030').encode('utf8')
    s = s.replace(r'\loch\af0\hich\af0\dbch\f15 \b\cf6 ', '')
    s = s.replace(r'\loch\af0\hich\af0\dbch\f15 \b0\cf0 ', '')
    s = s.replace('\par', '').replace('\n', '')
    return s
In [87]:
'aabbccdd ee'.strip('a')
Out[87]:
'bbccdd ee'
In [94]:
'aabbccdd ee'.strip('ab')
Out[94]:
u'ccdd ee'
In [103]:
'aabbccdd ee'.replace('ab', '')
Out[103]:
'abccdd ee'
In [76]:
# 调用stringclean函数
print stringclean(news[17])
 前文已介绍过塔尔科特·帕森斯的AGIL理论中的Adaptation(适应)与Goal Attainment(达标)的社会功能,今天续谈Integration(整合)的功能。人类社会是一个复杂系统,大系统内还有很多次系统,这些系统既独立,又牵连;既矛盾,又互适;有时互相促进,有时互相制约。正如一个人,既是社会的成员,又是公司的雇员;既是别人的儿子,又是朋辈中的「大哥」;其言行会同时受所处的不同系统所影响。 这些错综复杂的系统之间不可能没有冲突,为了避免社会因纠纷得不到恰当的处理而分崩离析,社会必须发展出一套整合矛盾的方式,这就需要有司法制度。 按帕森斯的说法,法治的基础是先要界定产权。这样才能避免因争夺资源而产生无休止的冲突。再者,交易亦需要在产权获得界定后才能进行。有交易才有市场,才能透过市场机制进行公平竞争,推动经济发展。 另一方面,社会亦需要为人权下定义,这样,政府才能在有认受性的情况下组成,才能有效地去处理公众事务。此外,社会还需要有一套合乎公义的会议程序,以决定如何汇聚众人的意愿。 有了这些基础之后,社会就可以发展出一整套司法制度,让成员知所行止,令社会的矛盾不会恶化。 英国人为香港留下的,可不只是一套可以依据的律例,而是一整套法治的理念与司法程序。香港的回归能进行得相对平稳,与特区政府基本上原封不动地承继了原有的司法系统有莫大的关系。 回归后,虽有人危言耸听,说香港的法治已死,但世人仍公认香港的法治达国际一流水准,而港人亦可以如常在香港生活与做生意,不觉有失去法治的实质威胁。直到占中运动的出现,香港人才真正感受到失去法治的害处。 占中运动挑战的可不只是个别「恶法」,而是侵犯了整个法治的根基——产权、人权与政府的执法权。 占领区的物业,地契上列明有Right of way,但现在占领者却不容停车场的车辆出入。这分明损害了这些物业的产权。现在政府却无法加以维护;法庭出了禁制令,占中者却一样藐视。这样发展下去,谁敢在香港置业? 其实,损害产权等同损害人权,因为人权的一项重要内容,就是个人的财产应获保障。此外,人人都应有追求幸福的权利,但现在占领区生意难做,怎会不妨碍别人追求幸福? 占中者把自己的行为说成是公民抗命,但公民抗命只是个人行为在道德上的解释,用来拒绝遵守某些个人不认同的法令还讲得通,但绝不可以借此损害他人的产权与人权。 再者,占中者现时在争取的是宪政改革,本应获社会上绝大多数人赞同才有条件实施,不宜用占领交通要津的方式去逼其他人就范。如果祭起公民抗命的旗帜就可以欲所欲为,只会天下大乱,令法治失去协调与整合作用。 
In [77]:
# 列表内的for循环
news_clean = [stringclean(n) for n in news]
len(news_clean)
Out[77]:
16541
In [85]:
print news_clean[17][:120]
 前文已介绍过塔尔科特·帕森斯的AGIL理论中的Adaptation(适应)与Goal Attainment(达标)的社会功能
In [79]:
# 定义两个函数

def deletetab(s):
    return s.replace('\t', '')


import sys
def flushPrint(s):
    sys.stdout.write('\r')
    sys.stdout.write('%s' % s)
    sys.stdout.flush() # 清洗掉 
In [102]:
help(sys.stdout)
Help on OutStream in module ipykernel.iostream object:

class OutStream(__builtin__.object)
 |  A file like object that publishes the stream to a 0MQ PUB socket.
 |  
 |  Output is handed off to an IO Thread
 |  
 |  Methods defined here:
 |  
 |  __init__(self, session, pub_thread, name, pipe=None)
 |  
 |  __next__(self)
 |  
 |  close(self)
 |  
 |  fileno(self)
 |  
 |  flush(self)
 |      trigger actual zmq send
 |      
 |      send will happen in the background thread
 |  
 |  isatty(self)
 |  
 |  next = __next__(self)
 |  
 |  read(self, size=-1)
 |  
 |  readline(self, size=-1)
 |  
 |  set_parent(self, parent)
 |  
 |  write(self, string)
 |  
 |  writelines(self, sequence)
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)
 |  
 |  closed
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  flush_interval = 0.2
 |  
 |  topic = None

In [95]:
# 调用deletetab
deletetab('\ta')
Out[95]:
'a'
In [97]:
# 演示:flushPrint
import time, random
for i in range(10):
    time.sleep(random.random())
    flushPrint(i) 
9
In [80]:
from collections import defaultdict

def readblocks(data):
    copy = False
    n = 0
    block = []
    chunk = defaultdict(lambda:[])
    for i in data:
        try:
            if "~~~~~~~~~~~~~~~~~~~~~~~~~~  #" in i:
                copy = True
            elif "文章编号:" in i:
                id = i.replace('文章编号: ', '')
                source = block[0].split('|')[0]
                info = block[1]
                title = deletetab(block[3]) # 
                body = [j for j in block[6:] if j != '\n']
                body = ' '.join(body)
                body = deletetab(body)
                body = '"' + body  + '"'
                line = '\t'.join([id, source, info, title, body])
                chunk[id] = line
                block = []
                n += 1
                if n%10 == 0:
                    flushPrint(n)
                copy = False
            elif copy:
                block.append(i)
        except Exception, e:
            print i, e
            pass
    return chunk
In [73]:
# 注意:标题和版面之间存在一个空行!所以title是block的第4个元素。
for i in range(1, 8):
    print news[i].decode('gb18030')[:500]
~~~~~~~~~~~~~~~~~~~~~~~~~~  #1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ \par

am730 | 2014-10-31 \par

A16| NEWS| C观点| By 施永青 \par 



法治有整合社会功能 \par

\par

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \par

In [81]:
# 按block清洗新闻报道
news_result = readblocks(news_clean)
710
In [82]:
# 新闻的数量
len(news_result)
Out[82]:
719
In [83]:
# 查看字典的keys
news_result.keys()[:5]
Out[83]:
['201410230290186 ',
 '201410080010030 ',
 '201410229900052 ',
 '201410060340162 ',
 '201410115313102 ']
In [84]:
# 查看字典的values
print news_result.values()[10]
201410095304453 	大公报 	B01| 大公经济  	马鞍山地皮招标估值16.7亿 	"          地皮密密推,马鞍山沙路地皮安排10月24日招标,12月5日截标,市场估值约15.5亿至16.7亿元,每呎4000至4300元。该地皮位于沙田市地段第601号,地盘面积约25.3万方呎,指定作私人住宅用途,可建总楼面38.75方呎。 中原测量师行执行董事张竞达表示,马鞍山耀沙街地皮属临海地段,尽揽海景,发展潜力优厚,将来可发展成豪宅出售,但与港铁站距离略远,此类型海景住宅供应于新界区属罕有,加上近日邻近之迎海.星湾御录理想销售成绩,将来亦会为区内提供商场等配套,预计发展商入标反应佳。惟近日新界区地皮均以较贴近市场下限价钱批出,加上市场对后市未感太乐观,加上近日「占中」事件持续等因素影响,预计多数发展商出价会相对保守,预期楼面呎价约4000元,总值约15.5亿元。美联测量师行董事林子彬表示,地皮虽则与马铁站距离较远,但料部分单位可坐拥海景,若以楼面呎价4300元计算,估值约16.7亿元。    "
In [39]:
# 保存数据:将数据写入硬盘
with open('/Users/chengjun/github/cjc2016/data/zz-hk-2014-9-clean.txt','a') as p:
     for record in news_result.values():
         p.write(record+"\n")
In [58]:
# 使用pandas读取数据,并查看。
import pandas as pd
file_path = '/Users/chengjun/github/cjc2016/data/zz-hk-2014-9-clean.txt'
df = pd.read_csv(file_path, sep = "\t", header=None)
df[:10]
Out[58]:
0 1 2 3 4
0 201409015325665 南华早报 EDT13| EDT Pain of stasis 没有文字档。
1 201409055305251 大公报 A20| 专版 坚决支持和拥护 全国人大常委会对香港政改的决定 一、本会坚决支持全国人大常委会关于香港特别行政区行政长官普选问题和201...
2 201409165304250 大公报 B02| 经济.航运 粤投1.8亿入股中超 【大公报记者毛丽娟深圳十五日电】中国水业(01129)与粤海投资(002...
3 201409300050105 文汇报 B04| 地产新闻 提早开标 信置高价夺粉岭地 中标价7.3亿 呎价区内新高 香港文汇报讯 (记者 颜伦乐) 地政总署昨日突然提早开标,较平日三个工作...
4 201409290320076 东方日报 B12| 产经 星湾御累收逾2200票 多家发展商表示,新盘部署暂未受到「占中」影响,恒地(00012)马鞍山迎...
5 201409300010113 香港商报 A10| 投资分析| 股海追踪| By 蔺常念 炒壳股秘诀 九月份环球利率上升,内地经济数据转弱,加上9月28日开始占中,令港股寻底...
6 201409160040016 明报 A22| 教育| By 刘锦辉 时事通识教材 文:通识科教师刘锦辉漫画创作:梁浩铨 时事焦点:黑布游行涉及单元:今日香...
7 201409305305767 am730 A62| 娱乐 王敏德担心香港会暴乱 王敏德(Michael)与女儿王曼喜,昨日坐直升机现身东莞出席高尔夫球赛...
8 201409264480062 英文虎报 P08| Top News| By Imogene Wong Occupy fears trim benchmark Hong Kong shares skidded to their l...
9 201409135304499 大公报 A08| 要闻 谭耀宗鼓励港人发声撑普选 【大公报讯】记者张媞报道:全国政协委员、民建联主席谭耀宗昨日在「闽港合作...
In [59]:
# 使用os改变默认的工作路径
import os
os.chdir('/Users/chengjun/github/cjc2016/data/occupycentral/')
# 使用glob读取某一类文件的所有名称
import glob
filenames = glob.glob('*.rtf')
filenames
Out[59]:
['zz-hk-2014-10.rtf', 'zz-hk-2014-9.rtf']
In [60]:
for i in filenames:
    print i
    with open(i) as f:
        news = f.readlines()
        news = [stringclean(n) for n in news]
        news_result = readblocks(news)
        with open('/Users/chengjun/github/cjc2016/data/zz-hk-all-clean2.txt','a') as p:
            for record in news_result.values():
                p.write(record+"\n")
zz-hk-2014-10.rtf
710zz-hk-2014-9.rtf
410

This is the End.

Thank you for your attention.