sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程)

https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share

http://blog.csdn.net/boksic/article/details/7216468

http://yixuan.cos.name/cn/2011/03/text-mining-of-song-poems/这篇文章的启发,觉得PYTHON来做文字处理分析应该不错,可以来做个词频分析,分析聊天记录可以看出每个人的说话习惯

用的是暴力方法 不用语义分析 直接列出所有出现的字词

做下来觉得难点就在中文编码这部分 python下中文涉及的编码转化确实要琢磨一番

首先数据文件要存为utf-8格式

在python显示中文的关键代码:

[python] view plaincopy
  1. import sys
  2. reload(sys)
  3. sys.setdefaultencoding('utf8')
  4. txt.encode('gb18030')

txt为中文字符串

搜索中文,用正则表达式匹配:

[python] view plaincopy
  1. r = re.compile('[\x80-\xff]+')
  2. m = r.findall(txt)

字典排序,按照value排序,代码很精简:

[python] view plaincopy
  1. dict=sorted(dict.items(), key=lambda d:d[1])

代码:

[python] view plaincopy
  1. #coding=utf-8
  2. #Author: http://blog.csdn.net/boksic
  3. import sys,re
  4. reload(sys)
  5. sys.setdefaultencoding('utf8')
  6. txt = open('blog.csdn.net.boksic.txt','r').read()
  7. wfile=open('result.txt','w')
  8. r = re.compile('[\x80-\xff]+')
  9. m = r.findall(txt)
  10. dict={}
  11. z1 = re.compile('[\x80-\xff]{2}')
  12. z2 = re.compile('[\x80-\xff]{4}')
  13. z3 = re.compile('[\x80-\xff]{6}')
  14. z4 = re.compile('[\x80-\xff]{8}')
  15. for i in m:
  16. x = i.encode('gb18030')
  17. i = z1.findall(x)
  18. #i+= z2.findall(x)
  19. #i+= z2.findall(x[2:])
  20. #i+= z3.findall(x)
  21. #i+= z3.findall(x[2:])
  22. #i+= z3.findall(x[4:])
  23. #i+= z4.findall(x)
  24. #i+= z4.findall(x[2:])
  25. #i+= z4.findall(x[4:])
  26. #i+= z4.findall(x[6:])
  27. for j in i:
  28. if (j in dict):
  29. dict[j]+=1
  30. else:
  31. dict[j]=1
  32. dict=sorted(dict.items(), key=lambda d:d[1])
  33. for a,b in dict:
  34. if b>0:
  35. wfile.write(a+','+str(b)+'\n')

感觉匹配的代码还不是很好

于是改了一个直接在utf-8格式下搜索的代码

[python] view plaincopy
  1. for l in range(len(i)/3):
  2. x+=[i[3*l:3*l+3]]
  3. for l in range(len(i)/3-1):
  4. x+=[i[3*l:3*l+6]]
  5. for l in range(len(i)/3-2):
  6. x+=[i[3*l:3*l+9]]

但实际运行速度太慢了,有时还有错误,望高手指点这部分

最后还是用正则搜索的代码,虽然代码比较冗长 运行速度还可以 50万字的文件 不到一秒就统计完了

(不太理解这里的python正则搜索的速度比数组存取怎么快这么多)

因为这种方法没有什么语义算法,所以得到的结果还需要一些人工筛选

聊天记录的统计效果:

低频单字

高频单字

多字

也来分析下唐诗宋词

单字的话

香,106

何,107

有,109

夜,109

日,111

千,114

年,114

是,114

时,115

相,117

雨,118

月,121

处,128

云,133

山,141

春,157

来,160

天,163

花,179

一,184

不,189

无,193

风,230

人,276

多字

归去,14
明月,14
西风,15
盈盈,15
不见,16
万里,17
多少,17
相思,18
风流,18
当年,18
浣溪,19
回首,19
少年,20
无人,20
千里,22
人间,24
何处,31

http://blog.sina.com.cn/s/blog_8bdd25f80101c7te.html
 ps:注意用editplus将文本文件改为utf8格式

'''

import sys

reload(sys)

sys.setdefaultencoding('utf8')

txt.encode('gb18030')

'''

import sys,re

reload(sys)

sys.setdefaultencoding('utf8')

txt = open('d://1.txt','r').read()

wfile=open('d://result.txt','w')

r = re.compile('[\x80-\xff]+')

m = r.findall(txt)

dict={}

z1 = re.compile('[\x80-\xff]{2}')

z2 = re.compile('[\x80-\xff]{4}')

z3 = re.compile('[\x80-\xff]{6}')

z4 = re.compile('[\x80-\xff]{8}')

for i in m:

x = i.encode('gb18030')

i = z1.findall(x)

#i+= z2.findall(x)

#i+= z2.findall(x[2:])

#i+= z3.findall(x)

#i+= z3.findall(x[2:])

#i+= z3.findall(x[4:])

#i+= z4.findall(x)

#i+= z4.findall(x[2:])

#i+= z4.findall(x[4:])

#i+= z4.findall(x[6:])

for j in i:

if (j in dict):

dict[j]+=1

else:

dict[j]=1

dict=sorted(dict.items(), key=lambda d:d[1])

for a,b in dict:

if b>0:

wfile.write(a+','+str(b)+'\n')

print sum(dict.items())

最近要帮做RA的老姐写个合并excel工作表的脚本……源数据是4000+个excel 工作表,分布在9个xlsm文件里,文件内容是中英文混杂的一些数据,需要从每张表中提取需要的部分,分门别类合并到多个大的表里。

寻觅工具

确定任务之后第一步就是找个趁手的库来干活。 Python Excel上列出了xlrd、xlwt、xlutils这几个包,但是

  1. 它们都比较老,xlwt甚至不支持07版以后的excel
  2. 它们的文档不太友好,都可能需要去读源代码,而老姐的任务比较紧,加上我当时在期末,没有这个时间细读源代码

再一番搜索后我找到了openpyxl,支持07+的excel,一直有人在维护,文档清晰易读,参照Tutorial和API文档很快就能上手,就是它了~

安装

这个很容易,直接pip install openpyxl,呵呵呵~

因为我不需要处理图片,就没有装pillow。

一些考虑

  1. 源文件大约一个在1~2MB左右,比较小,所以可以直接读入内存处理。
  2. 既然是处理excel,何况他们整个组显然都是win下干活(数据都用excel存了= =,商科的人啊……),这个脚本还是在win下做吧
  3. 这个任务完全不需要我对现有的文件做修改!囧……我只要读入、处理、再写出另一个文件就行了

学习使用

嗯,就是打开cmd,然后用python的shell各种玩这个模块来上手……(win下没有装ipython,囧)

做这个小脚本基本上我只需要import两个东西

from openpyxl import Workbookfrom openpyxl import load_workbook

load_workbook顾名思义是把文件导入到内存,Workbook是最基本的一个类,用来在内存里创建文件最后写进磁盘的。

干活

首先我需要导入这个文件

inwb = load_workbook(filename)

得到的就是一个workbook对象

然后我需要创建一个新的文件

outwb = Workbook()

接着在这个新文件里,用create_sheet新建几个工作表,比如

careerSheet = outwb.create_sheet(0, 'career')

就会从头部插入一个叫career的工作表(也就是说用法类似python list的insert)

接下来我需要遍历输入文件的每个工作表,并且按照表名做一些工作(e.g.如果表名不是数字,我不需要处理),openpyxl支持用字典一样的方式通过表名获取工作表,获取一个工作簿的表名的方法是get_sheet_names

for sheetName in inwb.get_sheet_names(): if not sheetName.isdigit(): continue sheet = inwb[sheetName]

得到工作表之后,就是按列和行处理了。openpyxl会根据工作表里实际有数据的区域来确定行数和列数,获取行和列的方法是sheet.rows和sheet.columns,它们都可以像list一样用。比如,如果我想跳过数据少于2列的表,可以写

if len(sheet.columns) < 2: continue

如果我想获取这个工作表的前两列,可以写

colA, colB = sheet.columns[:2]

除了用columns和rows来得到这个工作表的行列之外,还可以用excel的单元格编码来获取一个区域,比如

cells = sheet['A1':'B20']

有点像excel自己的函数,可以拉出一块二维的区域~

为了方便处理,遇到一个没有C列的工作表,我要创建一个和A列等长的空的C列出来,那么我可以用sheet.cell这个方法,通过传入单元格编号和添加空值来创建新列。

alen = len(colA)for i in range(1, alen + 1): sheet.cell('C%s' % (i)).value = None

注意:excel的单元格命名是从1开始的~

上面的代码也显示出来了,获取单元格的值是用cell.value(可以是左值也可以是右值),它的类型可以是字符串、浮点数、整数、或者时间(datetime.datetime),excel文件里也会生成对应类型的数据。

得到每个单元格的值之后,就可以进行操作了~openpyxl会自 动将字符串用unicode编码,所以字符串都是unicode类型的。

除了逐个逐个单元格用cell.value修改值以外,还可以一行行append到工作表里

sheet.append(strA, dateB, numC)

最后,等新的文件写好,直接用workbook.save保存就行

outwb.save("test.xlsx")

这个会覆盖当前已有的文件,甚至你之前读取到内存的那个文件。

一些要注意的地方

  • 如果要在遍历一列的每个单元格的时候获取当前单元格的在这个column对象里的下标

    for idx, cell in enumerate(colA): # do something...
  • 为了防止获取的数据两端有看不见的空格(excel文件里很常见的坑),记得strip()

  • 如果工作表里的单元格没有数据,openpyxl会让它的值为None,所以如果要基于单元格的值做处理,不能预先假定它的类型,最好用

    if not cell.value continue

    之类的语句来先行判断

  • 如果要处理的excel文件里有很多noise,比如当你预期一个单元格是时间的时候,有些表的数据可能是字符串,这时候可以用

    if isinstance(cell.value, unicode): break

    之类的语句处理。

  • win下的cmd似乎不太好设定用utf-8的code page,如果是简体中文的话可以用936(GBK),print的时候会自动从unicode转换到GBK输出到终端。

一些帮忙处理中文问题的小函数

我处理的表有一些超出GBK范围的字符,当我需要把一些信息print出来监控处理进度的时候非常麻烦,好在它们都是可以无视的,我直接用空格替换再print也行,所以加上一些我本来就要替换掉的分隔符,我可以:

# annoying seperatorsdot = u'\u00b7'dash = u'\u2014'emph = u'\u2022'dot2 = u'\u2027'seps = (u'.', dot, dash, emph, dot2)def get_clean_ch_string(chstring): """Remove annoying seperators from the Chinese string. Usage: cleanstring = get_clean_ch_string(chstring) """ cleanstring = chstring for sep in seps: cleanstring = cleanstring.replace(sep, u' ') return cleanstring

此外我还有一个需求,是把英文名[空格]中文名分成英文姓、英文名、中文姓、中文名

首先我需要能把英文和中文分割开,我的办法是用正则匹配,按照常见中英文字符在unicode的范围来套。匹配英文和中文的正则pattern如下:

# regex pattern matching all ascii charactersasciiPattern = ur'[%s]+' % ''.join(chr(i) for i in range(32, 127))# regex pattern matching all common Chinese characters and seporatorschinesePattern = ur'[\u4e00-\u9fff. %s]+' % (''.join(seps))

英文就用ASCII可打印字符的范围替代,常见中文字符的范围是\u4e00-\u9fff,那个seps是前面提到过的超出GBK范围的一些字符。 除了简单的分割,我还需要处理只有中文名没有英文名、只有英文名没有中文名等情况,判断逻辑如下:

def split_name(name): """Split
[English name, Chinese name]. If one of them is missing, None
will be returned instead. Usage: engName, chName =
split_name(name) """ matches = re.match('(%s) (%s)' % (asciiPattern, chinesePattern), name) if matches: # English name + Chinese name return matches.group(1).strip(), matches.group(2).strip() else: matches = re.findall('(%s)' % (chinesePattern), name) matches = ''.join(matches).strip() if matches: # Chinese name only return None, matches else: # English name only matches = re.findall('(%s)' % (asciiPattern), name) return ''.join(matches).strip(), None


到了中文名之后,我需要分割成姓和名,因为任务要求不需要把姓名分割得很明确,我就按照常见的中文名姓名分割方式来分——两个字or三个字的第一个字是
姓,四个字的前两个字是姓,名字带分隔符的(少数民族名字)分隔符前是姓(这里用到了前面的get_clean_ch_string函数来移除分隔符),
名字再长一些又不带分割符的,假设整个字符串都是名字。(注意英语的first name 指的是名,last name指的是姓,2333)

def split_ch_name(chName): """Split
the Chinese name into first name and last name. * If the name is
XY or XYZ, X will be returned as the last name. * If the name is
WXYZ, WX will be returned as the last name. * If the name is
...WXYZ, the whole name will be returned as the last name.
* If the name is ..ABC * XYZ..., the part before the seperator
will be returned as the last name. Usage: chFirstName,
chLastName = split_ch_name(chName) """ if len(chName) < 4: # XY or XYZ chLastName = chName[0] chFirstName = chName[1:] elif len(chName) == 4: # WXYZ chLastName = chName[:2] chFirstName = chName[2:] else: # longer cleanName = get_clean_ch_string(chName) nameParts = cleanName.split() print u' '.join(nameParts) if len(nameParts) < 2: # ...WXYZ return None, nameParts[0] chLastName, chFirstName = nameParts[:2] # ..ABC * XYZ... return chFirstName, chLastName

 

用python + openpyxl处理excel(07+)文档 + 一些中文处理的技巧的更多相关文章

  1. 利用Python openpyxl操作Excel

    from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = ...

  2. linux centos7 安装虚拟Python环境,pyenv安装文档

    python多版本控制pyenv安装文档 1.在线安装: curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-i ...

  3. Python处理PDF和Word文档常用的方法

    Python处理PDF和Word文档的模块是PyPDF2,使用之前需要先导入. 打开一个PDF文档的操作顺序是:用open()函数打开文件并用一个变量来接收,然后把变量给传递给PdfFileReade ...

  4. 分享一下自己写的Python 3的各种PDF文档【花了半年时间那】

    这些文档花了我半年的时间去整理.因为是第一次进行整理,希望帮助后来者少走弯路.毕竟是第一次整理.哪些地方不到位,希望大家和我练习,我们一起把它做好,以下就直接给出下载地址了,都是免积分的下载奥.因此. ...

  5. 使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)

    为大家介绍下Python爬虫库BeautifulSoup遍历文档树并对标签进行操作的详细方法与函数下面就是使用Python爬虫库BeautifulSoup对文档树进行遍历并对标签进行操作的实例,都是最 ...

  6. 解决Linux文档显示中文乱码问题以及编码转换

    解决Linux文档显示中文乱码问题以及编码转换 解决Linux文档显示中文乱码问题以及编码转换 使vi支持GBK编码 由于Windows下默认编码是GBK,而linux下的默认编码是UTF-8,所以打 ...

  7. SharePoint 开发另存文档库中文档

    前言 最近碰到这样一个问题,用前端框架读取SharePoint文档库中文档的时候,如果是PDF/TXT等类型的文档,不会出现另存为的操作,而是在浏览器中在线打开,这样用户是无法接受的. 解决方法 通过 ...

  8. 迷上我成真恋爱学心理学挽回她PDF文档资料完整版情感技巧脱单教程

    迷上我成真恋爱学心理学挽回她PDF文档资料完整版情感技巧脱单教程 成真迷上我偷听女人心挽回她课程 百度网盘迷上我教程pdf地址 百度网盘挽回她教程pdf+视频的地址 备用地址淘宝百度网盘发货地址 百度 ...

  9. Python openpyxl : Excel 文档简单操作

    安装方法 使用 pip 或通过专门python IDE(如pyCharm)进行安装 其中pip安装方法,命令行输入:  pip install openpyxl 基本使用 第一步先是要导入 openp ...

随机推荐

  1. [T-ARA][HOLIDAY]

    歌词来源:http://music.163.com/#/song?id=22704407 HOLI HOLI DAY [HOLI HOLI DAY] 뚜뚜 뚜루루 [ddu-ddu ddu-lu-lu ...

  2. react native中props的使用

    react native中props的使用 一.props的使用 1:父组件传递的方式 在子组件中可以用this.props访问到父组件传递的值 <View> <Text> { ...

  3. 复利计算器app发布

    复利计算器app发布 抱歉:由于无法实现服务端的持续开启,发布的app仅为简单的单机版,暂时舍弃了c/s版本的一些功能,如:投资动态管理功能. 应用详情博客:请点击这里 apk下载地址1(百度手机助手 ...

  4. 互评Alpha版本——杨老师粉丝群——Pinball

    一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 成语学习对除汉语言专业外的大学生的需求并不是很高,初中生和高中生因为在升学时需要参加语文 ...

  5. 四则运算2+psp0

    程序要求: 1.题目避免重复 2.可定制(数量\打印方式) 3.可以一下控制参数 ① 是否有乘除法 ② 是否有括号(最多支持十个数参与运算) ③ 数值范围 ④加减有无负数 ⑤除法有无余数 分析:① 如 ...

  6. 【每日scrum】NO.8

    (1) 在图的设计过程中掌握了图的基本运算函数的算法的理解和程序的有效吸收,包括图的深度和广度优先的遍历,对图的联通分量的求解,图的最小生成树,图的拓扑排序,图的关键路径, (2)在迪杰斯特拉算法的基 ...

  7. 项目Beta冲刺(团队)第一天

    1.今天解决的进度 成员 进度 陈家权 回复界面设计,由于成员变动加上和其他成员距离较远,服务器404 赖晓连 改进Alpha版本页面没能及时更新的问题 雷晶 获取提问问题时间更新到数据库 林巧娜 今 ...

  8. 新手使用github过程记录

    初次接触github,记录下我的使用过程.一开始确实有些懵,但好在网上这类的教程有很多,过程也很详细易懂,按照网上的教程走完全没问题,感谢无私分享辛苦整理的各位前辈们. 注册github账号 创建一个 ...

  9. 第一章 JavaScript简介

    DOM级别 DOM1:映射文档的结构 DOM2: DOM视图,定义了跟踪不同文档视图的接口(例如CSS应用前后的文档) DOM事件,定义了事件和事件处理的接口 DOM样式,定义了基于CSS为元素应用样 ...

  10. 1st 四人小组项目

    小组名称:好好学习 项目组长:林莉 组员:王东涵.宫丽君.胡丽娜 项目选题:基于jsp的车库管理系统 项目期限:十周内<暂定> 需求分析:有待进一步思考