集体智慧学习笔记二——中文标点的去除

从网站上爬下内容其实在python中是一件还比较简单的事情,如果不需要考虑各种反爬虫机制来说的话。

集体智慧学习的第四章是搜索与排名,各种索引的建立,我之后再总结。这里我主要总结下,如何整理爬取到的文字内容。问题解决的过程中使我进一步深化对python2各种编码机制的了解。

我只以一个简单的txt文档为例,文档内容如下:


先上最后的效果图吧:


一开始以为这个过程会很简单嘛,不就是建立一个ignoring_words的list,然后对文档中的每一个字进行检查。如果检查的字在ignoring_words里面,则省略,否则继续。想法是好的,也的确有网友提出了类似的想法。这不就是几行代码的事情呀(虽然最后的代码也只有几行代码。。。)本着这样的想法,我写了一下代码:

# -*- coding: utf-8 -*-
import codecs

ignoring_words = ['【', '】', ',']                                 #这是忽略的字符集
content = codecs.open('test.txt', 'r').read()                       #test.txt就是我上述给出的需要整理的内容
file = codecs.open('finished.txt', 'w', encoding = 'utf-8')         #打开一个新文档来存我整理后的内容
for word in content: 
    if word in ignoring_words:                                      #如果在,忽略
        continue
    else:
        file.write(word)

运行后,出问题了:


为啥就在写文件时出现问题了呢?算了,不想了,反正网友的历来那个是无穷的,我在网上又试着查找第二种思路。果不其然,找到了,利用正则表达式!(最后证明也不行,还我白惊喜一场)。具体代码是这样的:

import re
import string

content_s = content.replace(string.punctuation, '')
然而并没有什么卵用。。。但是我觉得这个方法应该可以去除英文标定符号!下次如果对英文文档进行整理,我再试试~


我又看到一个方法(小激动呢)!代码如下(此代码为粘贴过来的):

import re
temp = "想做/ 兼_职/学生_/ 的 、加,我Q:  1 5.  8 0. !!??  8 6 。0.  2。 3     有,惊,喜,哦"
temp = temp.decode("utf8")
string = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+".decode("utf8"), "".decode("utf8"),temp)
print string

这里注意,又是编码问题!!!出现在string= ...decode('utf8')这一行。


这我就奇了怪了。。。


于是,潜行修行开始了。。。

工欲善其事必先利其器,应对编码问题,推荐大家安装chardet,直接pip install chardet即可。这个工具可以直接推断出字符串的编码格式:

temp = "想做/ 兼_职/学生_/ 的 、加,我Q:  1 5.  8 0. !!??  8 6 。0.  2。 3     有,惊,喜,哦"
print chardet.detect(temp)

{'confidence': 0.99, 'encoding': 'GB2312'}   #输出

这样以后妈妈就不用担心的我不知道字符串编码格式了~


这里我就直接上正确的代码了:



-*- coding: utf-8 -*-
import re
import codecs
import chardet
content = codecs.open('test.txt', 'r').read()                           #打开休要整理的文档,获得句柄
#print chardet.detect(content)				                #我所有需要整理的文档都是utf-8进行编码的,如果不知道的话,大家用chardet工具。
content = content.decode('utf-8')                    #python中的中文编码就是一个烦心事,最好的解决方法就是全部转化成unicode编码(python内部编码方式)

punct = codecs.open('puntuation.txt', 'r')                              #这是中文标点符号集:排列格式如下图
punctuation = list()
for line in punct:
    word = line.strip('\r\n')                                           #出去换行符,注意是\r\n
    word = word.decode('utf-8')                                         #当然标点符号也需要转换成unicode格式
    punctuation.append(word)       

file = codecs.open('finished.txt', 'w', encoding = 'utf-8')             #推荐大家使用codecs来打开文档,设置编码方式很方便
str = ''.decode('utf-8')
for item in content:
    if item in punctuation:                                             #如果是标点符号,即跳过
        continue
    else:
        str = str + item
    
    
file.write(str)                                                         #一次性写入整理后的文档		

这是我需要忽略的标点符号文档文件:



这是效果图:


咦咦咦!!!空格,那么多空字符怎么办???

给大家一个非常简答的方法来去除字符串内部的空格,当然如果是字符串两端的字符用strip( )会更好。

这里利用string.split(),在空格部分对字符串进行分割,然后利用join函数进行粘接。

例如:

content = ''.join(content.split())

把上述代码加入就完成中文标点符号的去除了!!!



还是总结一下吧:
1、中英文标点符号的编码肯定是不同的,即利用string.punctuation来表示中文标点符号是不行的。
2、python2中的中文编码问题很乱,最简单的思路就是将所有的编码转换成unicode编码。python中有两种编码方式转换函数:decode和encode:
decode是将源编码转化成unicode编码,encode是将unicode编码转换成指定编码。
例如:
s.decode('utf-8'):将原来用utf8编码的字符串s转换成unicode编码格式;
s.encode('gbk'):将原来unicode编码的字符串s转换成gbk编码格式。
当然还有s.decode('utf-8', 'ignore'),这样可以忽略其中无法编码的地方。
3、在写入txt文档时如果出现 'ascii' codec can't decode byte 0xef in position 0等这样类似的问题,一般是txt的编码方式有问题,如果是中文编码的话一般选择utf-8进行编码。
4、最好不要利用记事本进行文档的打开和设置。在notebook格式中选择utf-8 无bom格式,可以便面很多问题。
5、在写如文件时,用unicode编码:
例如: file.write(content) 其中的content最好用unicode斤西瓜编码










cda备考学习学习笔记——基础知识篇()主要涉及了计算机科学与技术领域的基本概念和知识。 首先,它介绍了计算机网络的基础知识。网络是将多台计算机通过通信链路连接起来,使它们能够相互通信和共享资源的系统。笔记中详细介绍了网络的组成、拓扑结构和通信协议等重要内容。 其次,笔记还解释了计算机系统的基本组成。计算机系统由硬件和软件两部分组成,其中硬件包括中央处理器、存储器、输入输出设备等,而软件则分为系统软件和应用软件。笔记详细介绍了各种硬件和软件的功能和作用。 此外,笔记还对数据库管理系统进行了介绍。数据库管理系统是一种用于管理和组织数据的软件系统,它能够实现数据的存储、检索和更新等操作。笔记中详细介绍了数据库的概念、结构和操作等内容。 最后,笔记还包括了算法和数据结构的基础知识。算法是解决问题的一系列步骤和规则,而数据结构则是组织和存储数据的方式。笔记中介绍了常用的算法和数据结构,如排序算法、树和图等。 总之,通过学习CDA备考学习笔记中的基础知识篇(),我们能够更好地理解计算机网络、计算机系统、数据库管理系统以及算法和数据结构等相关概念和知识。这些基础知识对于我们深入研究计算机科学与技术领域是非常重要的,也为我们日后的学习和工作奠定了坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值