文本词频统计
《哈姆雷特》单词词频分析
《哈姆雷特》文章
def get_text():
text = open('F:\\PyStudy\\hamlet.txt', 'r').read() # 打开文章文件
text = text.lower() # 方便统计,全部小写
# 去掉无关字符
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
text = text.replace(ch, ' ') # 用空格替换无关单词
return text
def main():
hamlet_text = get_text()
words = hamlet_text.split() # 以空格的形式拆分单词返回列表
counts = {} # 空dict字典
for word in words:
counts[word] = counts.get(word, 0) + 1 # 计算键值
items = list(counts.items()) # 字典键值元组化为列表
items.sort(key=lambda x:x[1], reverse=True) # 使用列表sort算法,关键字按照元组的第二个元素逆序
for i in range(10): # 使用最多的单词前10
word, count = items[i]
print("{:<10}{:>5}".format(word, count))
if __name__ == "__main__":
main()
《三国演义》出场人物TOP分析
《三国演义》文章
条件
对中文分词操作,需要安装jieba库,jieba是优秀的中文分词的第三方库
(cmd命令行)pip install jieba
jieba分词要点jieba.lcut(s)
函数
import jieba
txt = open("F:\\PyStudy\\threekingdoms.txt", "r", encoding="utf-8").read()
excludes = {"将军","却说","荆州","二人","不可","不能","如此",'商议','如何','主公','军士'\
,'左右','军马','引兵','次日','大喜','天下','东吴','于是','今日','不敢','魏兵'\
,'陛下','一人','都督','人马','不知','汉中','只见','众将','后主','蜀兵','上马'\
,'大叫','太守','此人'}
words = jieba.lcut(txt)
counts = {}
for word in words:
if len(word) == 1: # 统计单词
continue
elif word == "诸葛亮" or word == "孔明曰": # 分词优化
rword = "孔明"
elif word == "关公" or word == "云长":
rword = "关羽"
elif word == "玄德" or word == "玄德曰":
rword = "刘备"
elif word == "孟德" or word == "丞相":
rword = "曹操"
else:
rword = word
counts[rword] = counts.get(rword, 0) + 1
for word in excludes: # 删除无关单词
del counts[word]
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
print('《三国演义》中人物出场TOP10')
for i in range(10):
word, count = items[i]
print("{:<10}{:>5}".format(word, count))
文本统计的主要步骤:
- 读取文件文本,剔除不需要统计的内容(符号等)
- 字符串转为列表
- 遍历列表,使用字典存储键和值
- 字典转为列表排序比较
sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
sorted语法
sorted(iterable, key=None, reverse=False)
- terable – 可迭代对象。
- key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
文件
文件是数据的抽象和集合
- 文件是存储在辅助存储器上的数据序列
- 文件时数据存储的一种形式
- 文件展现形态:文件文件和二进制文件
文本文件vs.二进制文件 - 文本文件和二进制文件只是文件的展示方式
- 本质上,所有文件都是二进制形式存储
- 形式上,所有文件采用两种方式展示
文件打开:<变量名>/文件句柄 = open(<文件名>, <打开模式>)
文件关闭:<变量名>/文件句柄.close()
文件的全文本操作一
fname = input('请输入要打开的文件名称:')
fo = open(fname, 'r')
txt = fo.read()
# 对全文txt进行处理
fo.close()
文件的全文本操作二
fname = input('请输入要打开的文件名称:')
fo = open(fname, 'r')
txt = fo.read(2)
while txt != '':
txt = fo.read(2) # 逐步读取
fo.close()
文件的逐行操作一
fname = input('请输入要打开的文件名称:')
fo = open(fname, 'r')
for line in fo.readlines():
print(line) # 一次读入,分行处理
fo.close()
文件的逐行操作二
fname = input('请输入要打开的文件名称:')
fo = open(fname, 'r')
for line in fo:
print(line) # 分行读入,逐行处理
fo.close()
文件写入
fo = open('filename', 'w')
ls = ['中国','法国','美国']
fo.writelines(ls) # 写入一个字符串列表
fo.seek(0)
for line in fo:
print(line)
fo.close()
数据
一维数据的表示:
- 如果数据间有序:使用集合类型
- 如果数据间无序:使用列表类型
一维数据的存储:
存储方式一:空格分隔
中国 美国 日本 德国 法国 英国 意大利
- 使用一个或多个空格空格分隔进行存储,不换行
- 缺点:数据中不能存在空格
存储方式二:逗号分隔
中国,美国,日本,德国,法国,英国,意大利
- 使用英文半角逗号分隔数据进行存储,不换号
- 缺点:数据中不能有英文逗号
存储方式:其他方式
- 使用其他符号或符号组合分隔,建议采用特殊符号
- 缺点:需要根据数据特点定义,通用性较差
# 一维数据读取
txt = open(fname).read()
ls = txt.split() # txt.split(',') txt.split('$')
# 一维数据写入
ls = ['中国', '美国', '日本']
f = oepn(fname, 'w')
f.write(' '.join(ls)) # f.write('$'.join(ls))
f.close()
二维数据:
数据读入
fo = open(fname)
ls = []
for line in fo:
line = line.replace('\n', '')
ls.append(line.split(','))
fo.close()
数据写入
ls = [[], [], []]
f = open(fname, 'w')
for item in ls:
f.write(','.join(item)+'\n')
f.close()
wordcloud库
词云的安装
(cmd命令行)pip install wordcloud
wordcloud库基本使用
wordcloud.WordCloud()
代表一个文本对应的词云- 根据文本中词云出现的频率等参数绘制词云
- 词云的绘制形状、尺寸和颜色都可以设定
# 实例
str = 'Python的设计哲学是“优雅”、“明确”、“简单”。因此,Pe' \
'rl语言中“总是有多种方法来做同一件事”的理念在Python开发者中通常是难以忍受的。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计Python语言时,如果面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。由于这种设计观念的差异,Python源代码通常被认为比Perl具备更好的可读性,并且能够支撑大规模的软件开发。这些准则被称为Python格言。在Python解释器内运行import this可以获得完整的列表。' \
'Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内。所以很多人认为Python很慢。不过,根据二八定律,大多数程序对速度要求不高。在某些对运行速度要求很高的情况,Python设计师倾向于使用JIT技术,或者用使用C/C++语言改写这部分程序。可用的JIT技术是PyPy。' \
'Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。' \
'虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shellscript、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。' \
'Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。《Python技术手册》的作者马特利(Alex Martelli)说:“这很难讲,不过,2004 年,Python 已在Google 内部使用,Google 召募许多 Python 高手,但在这之前就已决定使用Python,他们的目的是 Python where we can, C++ where we must,在操控硬件的场合使用C++,在快速开发时候使用 Python。”'
import wordcloud
import jieba
path = 'C:\\Windows\\Fonts\\simhei.ttf'
w = wordcloud.WordCloud(font_path=path, background_color='white', width=1000,height=800)
ls = jieba.lcut(str)
w.generate(' '.join(ls))
w.to_file('python.jpg')
计算思维
计算思维:抽象和自动化
- 抽象问题的计算过程,利用计算机自动化求解
- 计算思维时基于计算机的思维方式