数据清洗:

对占中新闻进行数据清洗



王成军

wangchengjun@nju.edu.cn

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

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

am730 | 2014-10-31 \par

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



法治有整合社会功能 \par

\par

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



















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

 \par



文章编号: 201410315301186 \par

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

本内容之版权由相关传媒机构 / 版权持有人拥有。除非获得明确授权,否则严禁复制、改编、分发或发布本内容。版权持有人保留一切权利。 本内容经慧科的电子服务提供。

\page

~~~~~~~~~~~~~~~~~~~~~~~~~~  #2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ \par

大公报 | 2014-10-31 \par

A08| 要闻 \par 



扛工仔料加薪4.5% 建筑金融好景 \par

\par

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



















\par\par 【大公报讯】记者彩雯报道:上班族明年加薪预测调查结果陆续揭盅,香港人力资源管理学会昨日公布调查预计,明年平均加薪4.5%,高过今年的4.3%加幅,也高过雇主联会建议的4%平均加薪幅度,年尾花红金额平均相当于一至两个月薪金,预料建筑业及金融服务业雇员明年「最好景」,预测加薪幅度最高。不过, 「\loch\af0\hich\af0\dbch\f15 \b\cf6 占中\loch\af0\hich\af0\dbch\f15 \b0\cf0 」持续逾一个月以及沪港通押后的影响,尚未反映在今次调查结果,有待今年底的跟进调查才能确定。\par\par 人力资源管理学会向101间公司调查,涉及聘用雇员总数达13.7万人。当中84间公司于今年有整体加薪,两间冻薪,今年平均加薪4.3%。展望明年,80间公司打算明年一至四月将调整基本薪金,其中52间更已落实明年预算调整幅度,当中,50间公司预期会整体加薪,两间公司冻薪,没公司打算减薪,预计明年整体加薪4.5%。调整薪酬主要考虑公司业绩、个人工作表现及通胀等因素。\par\par 至于年底花红,设有固定花红制度的47间公司,近40%雇员符合发放固定花红的资格,平均金额为1.01个月基本薪金。设有非固定花红的71间公司中,68%雇员获发非固定花红,平均金额为1.62个月薪金,去年有超过70%雇员获发非固定花红,平均金额为1.58个月。\par\par 各行业当中,金融服务业雇员可望「最好景」,调查预测今年底的非固定花红金额相当于6.3个月薪金,明年可望加薪5.9%。建筑业雇员明年加薪也可望达5.9%,但预测今年底非固定花红金额只有大约1.4个月薪金。零售业今年底非固定花红金额可望达4.72个月薪金,但明年加薪幅度预测只有4.2%,低过整体4.5%的加幅。\par\par 学会:调查未计\loch\af0\hich\af0\dbch\f15 \b\cf6 占中\loch\af0\hich\af0\dbch\f15 \b0\cf0 \par\par 人力资源管理学会前任会长莫家麟表示,受访公司只计算今年一至九月份的薪金调整,当时未发生「\loch\af0\hich\af0\dbch\f15 \b\cf6 占中\loch\af0\hich\af0\dbch\f15 \b0\cf0 」行动, 「\loch\af0\hich\af0\dbch\f15 \b\cf6 占中\loch\af0\hich\af0\dbch\f15 \b0\cf0 」行动已踏入第二个月,影响情况陆续浮现,但未知行动何时结束,难以预计影响的深度,他亦不便揣测。他指,沪港通会对香港带来好处,但现时通车无期,可能会将好处延后,而香港未来亦受很多不明朗因素影响。\par\par 香港人才管理协会与浸会大学工商管理学院早前公布薪酬调查显示,过去一年香港地区的薪酬加幅为4.2%至4.5%,由于经济情况未明朗,明年加薪幅度或放缓为4%至4.5%。雇主联会近日向逾500家企业发出加薪指引,建议明年平均加薪4%,其中建筑、医疗保健行业加幅较高。 \par

 \par



文章编号: 201410315308873 \par

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

本内容之版权由相关传媒机构 / 版权持有人拥有。除非获得明确授权,否则严禁复制、改编、分发或发布本内容。版权持有人保留一切权利。 本内容经慧科的电子服务提供。

\page

~~~~~~~~~~~~~~~~~~~~~~~~~~  #3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ \par

头条日报 | 2014-10-31 \par

P60| 港闻| 「虎」学英语| By 汤锦标 \par 



「大嘴巴」英揆闯祸记 \par

\par

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



















\par\par 本栏写过苏格兰公投,结果有惊无险,大英帝国完好无缺,英国首相卡梅伦肯定饮得杯落,原来连女皇殿下亦喜上眉梢,甚至喜极而泣。\par\par   苏公投独立失败,女皇喜极而泣,听落几夸张,我不是女皇肚里条虫,我讲你可以不信,但如泄密者是卡梅伦,情况自然不同。\par\par   话说「大嘴巴」卡梅伦在一次公众场合,同来访的前纽约市长彭博(Michael Bloomberg)咬耳仔,怎料搞出个大头佛,对话被麦克风收录,卡向彭披露女皇得悉公投结果后的一刻,直情开心到喊──Microphones picked up him saying that the Queen 'purred' a noise of contentment and had even wept for joy when Cameron called her with the news.\par\par   就这段公投小插曲,《英文虎报》写了一篇八卦新闻,题为 Cameron sorry for letting cat out of the bag,讲到卡梅伦「不小心」泄了女皇机密,公投一事,女皇人前扮中立,人后却喊住想保留威士忌国,卡因此要向女皇道歉──the revelation was a breach of protocol which saw a red-faced Cameron apologizing to the monarch for his big mouth.\par\par   To let the cat out of the bag (让猫走了出袋子) 是成语,不小心泄漏别人秘密的意思,一般指无恶意,属无心之失──the idiom means to reveal a secret, usually unwittingly, and suggests thoughtlessness rather than malice.\par\par   除卡梅伦失礼事件外,亦可举一例。有一大班人正准备为朋友举办惊喜派对(surprise party),当事人不知情正在回家途中,给巧遇的友人抛出一句──「我会准时到你的派对」──惊喜派对马上玩完。当英国工党人士知道卡犯错后,即作出批评──It's disrespectful to let the cat out of the bag. 这句话仍有多一层意思,就是指卡不应将一些内幕消息向外界披露,亦是对女皇的不尊重。\par\par   英语世界中,同猫咪相关的惯用语多如牛毛,简单如raining cats and dogs, fighting like cats and dogs, when the cat's away, the mice will play 等,或者复杂少少如 a catty remark (不饶人的骂人语,多指出自女人) 、put the cat among the pigeons (刻意做出事情引起骚动)、Has the cat got your tongue?(指被人追问时保持沉默)等。\par\par   另一英文流行语──open a can of worms,或比 let the cat out of the bag更加广泛使用。打开罐子发现满罐都是虫子,比喻做了某件事把问题更加复杂化,举一例子(\loch\af0\hich\af0\dbch\f15 \b\cf6 占中\loch\af0\hich\af0\dbch\f15 \b0\cf0 运动支持者可能不爱听)──当\loch\af0\hich\af0\dbch\f15 \b\cf6 占中\loch\af0\hich\af0\dbch\f15 \b0\cf0 三子宣布启动\loch\af0\hich\af0\dbch\f15 \b\cf6 占中\loch\af0\hich\af0\dbch\f15 \b0\cf0 行动那刻钟,a can of worms has been opened,并引致一个困难并且失控的局面。\par\par   欲回看《虎报》相关文章,请用以下连结。http︰//goo.gl/ul3OLJ\par\par 汤锦标\par\par 《英文虎报》The Standard总编辑逢周五见报 \par

 \par



文章编号: 201410315308918 \par

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

本内容之版权由相关传媒机构 / 版权持有人拥有。除非获得明确授权,否则严禁复制、改编、分发或发布本内容。版权持有人保留一切权利。 本内容经慧科的电子服务提供。

\page

~~~~~~~~~~~~~~~~~~~~~~~~~~  #4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ \par

都市日报 | 2014-10-31 \par

P50| 娱乐 \par 



《华尔街日报》指周润发击败成龙 \par

\par

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







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

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 [12]:
help(sys.stdout)
Help on OutStream in module ipykernel.iostream object:

class OutStream(io.TextIOBase)
 |  A file like object that publishes the stream to a 0MQ PUB socket.
 |  
 |  Output is handed off to an IO Thread
 |  
 |  Method resolution order:
 |      OutStream
 |      io.TextIOBase
 |      _io._TextIOBase
 |      io.IOBase
 |      _io._IOBase
 |      builtins.object
 |  
 |  Methods defined here:
 |  
 |  __init__(self, session, pub_thread, name, pipe=None)
 |      Initialize self.  See help(type(self)) for accurate signature.
 |  
 |  close(self)
 |      Flush and close the IO object.
 |      
 |      This method has no effect if the file is already closed.
 |  
 |  flush(self)
 |      trigger actual zmq send
 |      
 |      send will happen in the background thread
 |  
 |  set_parent(self, parent)
 |  
 |  write(self, string)
 |      Write string to stream.
 |      Returns the number of characters written (which is always equal to
 |      the length of the string).
 |  
 |  writelines(self, sequence)
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  closed
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __abstractmethods__ = frozenset()
 |  
 |  encoding = 'UTF-8'
 |  
 |  flush_interval = 0.2
 |  
 |  flush_timeout = 10
 |  
 |  topic = None
 |  
 |  ----------------------------------------------------------------------
 |  Methods inherited from _io._TextIOBase:
 |  
 |  detach(...)
 |      Separate the underlying buffer from the TextIOBase and return it.
 |      
 |      After the underlying buffer has been detached, the TextIO is in an
 |      unusable state.
 |  
 |  read(...)
 |      Read at most n characters from stream.
 |      
 |      Read from underlying buffer until we have n characters or we hit EOF.
 |      If n is negative or omitted, read until EOF.
 |  
 |  readline(...)
 |      Read until newline or EOF.
 |      
 |      Returns an empty string if EOF is hit immediately.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from _io._TextIOBase:
 |  
 |  errors
 |      The error setting of the decoder or encoder.
 |      
 |      Subclasses should override.
 |  
 |  newlines
 |      Line endings translated so far.
 |      
 |      Only line endings translated during reading are considered.
 |      
 |      Subclasses should override.
 |  
 |  ----------------------------------------------------------------------
 |  Methods inherited from _io._IOBase:
 |  
 |  __del__(...)
 |  
 |  __enter__(...)
 |  
 |  __exit__(...)
 |  
 |  __iter__(self, /)
 |      Implement iter(self).
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
 |  
 |  __next__(self, /)
 |      Implement next(self).
 |  
 |  fileno(self, /)
 |      Returns underlying file descriptor if one exists.
 |      
 |      OSError is raised if the IO object does not use a file descriptor.
 |  
 |  isatty(self, /)
 |      Return whether this is an 'interactive' stream.
 |      
 |      Return False if it can't be determined.
 |  
 |  readable(self, /)
 |      Return whether object was opened for reading.
 |      
 |      If False, read() will raise OSError.
 |  
 |  readlines(self, hint=-1, /)
 |      Return a list of lines from the stream.
 |      
 |      hint can be specified to control the number of lines read: no more
 |      lines will be read if the total size (in bytes/characters) of all
 |      lines so far exceeds hint.
 |  
 |  seek(...)
 |      Change stream position.
 |      
 |      Change the stream position to the given byte offset. The offset is
 |      interpreted relative to the position indicated by whence.  Values
 |      for whence are:
 |      
 |      * 0 -- start of stream (the default); offset should be zero or positive
 |      * 1 -- current stream position; offset may be negative
 |      * 2 -- end of stream; offset is usually negative
 |      
 |      Return the new absolute position.
 |  
 |  seekable(self, /)
 |      Return whether object supports random access.
 |      
 |      If False, seek(), tell() and truncate() will raise OSError.
 |      This method may need to do a test seek().
 |  
 |  tell(self, /)
 |      Return current stream position.
 |  
 |  truncate(...)
 |      Truncate file to size bytes.
 |      
 |      File pointer is left unchanged.  Size defaults to the current IO
 |      position as reported by tell().  Returns the new size.
 |  
 |  writable(self, /)
 |      Return whether object was opened for writing.
 |      
 |      If False, write() will raise OSError.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from _io._IOBase:
 |  
 |  __dict__

In [13]:
# 调用deletetab
deletetab('\ta')
Out[13]:
'a'
In [14]:
# 演示:flushPrint
import time, random
for i in range(10):
    time.sleep(random.random())
    flushPrint(i) 
9
In [15]:
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:
                ids = 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([ids, source, info, title, body])
                chunk[ids] = line
                block = []
                n += 1
                if n%10 == 0:
                    flushPrint(n)
                copy = False
            # copy must be here.
            elif copy:
                block.append(i)
        except Exception as e:
            print(i, e)
            pass
    return chunk
In [16]:
# 注意:标题和版面之间存在一个空行!所以title是block的第4个元素。
for i in range(1, 8):
    print(news[i][:500])
~~~~~~~~~~~~~~~~~~~~~~~~~~  #1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ \par

am730 | 2014-10-31 \par

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



法治有整合社会功能 \par

\par

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

In [18]:
# 按block清洗新闻报道
news_result = readblocks(news_clean) 
710
In [20]:
# 新闻的数量
len(news_result)
Out[20]:
719
In [21]:
# 查看字典的keys
list(news_result.keys())[:5]
Out[21]:
['201410115306036 ',
 '201410159900080 ',
 '201410170348998 ',
 '201410175309215 ',
 '201410190050028 ']
In [22]:
# 查看字典的values
list(news_result.values())[10]
Out[22]:
'201410110290119 \t成报 \tC08| 娱乐  \t卢巧音性感毋须问准老公 \t"          卢巧音(Candy)、Kolor、Fabel、小尘埃及Redholic等前晚在中环出席「Dr Martens MusicGig Night」, 实行以歌会友。Candy 亦献唱一曲,并透露下星期会有新歌派台,但明年才会推出新碟。 Candy表示,年尾会在理工大学举行演唱会,近日忙于拣歌及准备服装:「衫可能会有些性感。(婚后性感尺度不可太大?)不用理他。(老公Sammy)当然太暴露也是不可以;自己现在106磅,想肥多两磅,在110磅之内。」并指老公没有陪伴一齐增磅,因对方正在减肥兼非常克制;谈及个唱嘉宾方面,Candy称会有别于红馆骚,大约表演一个多小时,因此未必有嘉宾环节。 Kolor受访时表示,希望11月尾可以推出新碟,最近都忙于在Band房努力冲刺。讲到他们四人都非常热血,可会以近来的「占中」事件为题材写歌?他们称没有特别为事件去创作歌曲,但歌曲也不小心有关联:「《意志的胜利》是讲人人都有意志,知道有些学生拿了做打气歌。」Kolor各人均有亲身到「占中」现场参与,觉得他们很和平,看到香港后生的一辈也感到安慰。 <采访、摄影>Wan    "'
In [23]:
import pandas as pd
news_list = [i.split('\t') for i in news_result.values()]
df_news = pd.DataFrame(news_list,
                       columns= ['ids', 'source',\
                                 'info', 'title', 'body'])
df_news.head(3)
Out[23]:
ids source info title body
0 201410115306036 置业家居 016| 置业家居| 封面故事| By 梁子谦陈袆楠陆伟濠余家盛 其他新盘最新部署 " 迎海?星湾御 加推200伙 超额逾11.5倍 马鞍山迎海?星湾御上...
1 201410159900080 东周刊 B048-049| 娱乐追击 心情差饮闷酒 梁潮伟 为香港发愁 " 自拍毕《一代宗师》的梁朝伟,身心疲乏,唞了年多仍未复工,闲时深居简出。...
2 201410170348998 太阳报 A14| 港闻 文化中心展现3D光雕「麻雀」 " 【本报讯】旅游发展局继举办美酒佳肴巡礼外,同期亦会在尖沙咀文化中心外墙...
In [24]:
# 保存数据:将数据写入硬盘
with open('../data/zz-hk-2014-9-clean.txt','a') as p:
     for record in news_result.values():
            p.write(record+"\n")
In [25]:
# 使用pandas读取数据,并查看。
import pandas as pd
df = pd.read_csv( '../data/zz-hk-2014-9-clean.txt', 
                 sep = "\t", names=['ids', 'source','info', 'title', 'body'])
df[:3]
Out[25]:
ids source info title body
0 201409015325665 南华早报 EDT13| EDT Pain of stasis 没有文字档。
1 201409055305251 大公报 A20| 专版 坚决支持和拥护 全国人大常委会对香港政改的决定 一、本会坚决支持全国人大常委会关于香港特别行政区行政长官普选问题和201...
2 201409165304250 大公报 B02| 经济.航运 粤投1.8亿入股中超 【大公报记者毛丽娟深圳十五日电】中国水业(01129)与粤海投资(002...
In [26]:
# 使用os改变默认的工作路径
#import os
#os.chdir('../data/occupycentral/')

# 使用glob读取某一类文件的所有名称
import glob
filenames = glob.glob('../data/occupycentral/*.rtf')
filenames
Out[26]:
['../data/occupycentral/zz-hk-2014-10.rtf',
 '../data/occupycentral/zz-hk-2014-9.rtf']
In [28]:
for i in filenames:
    print(i)
    with open(i, encoding = 'gb18030') as f: 
        news = f.readlines()
        news = [stringclean(n) for n in news]
        news_result = readblocks(news)
        with open('../data/zz-hk-all-clean2018.txt','a') as p:
            for record in news_result.values():
                p.write(record+"\n")
../data/occupycentral/zz-hk-2014-10.rtf
710../data/occupycentral/zz-hk-2014-9.rtf
410


自学Pandas使用

《Python Data Science Handbook》第三章 by Jake VanderPlas



https://github.com/computational-class/datascience/blob/gh-pages/4.datasci/notebooks/03.00-Introduction-to-Pandas.ipynb

This is the End.

Thank you for your attention.