用最基本知识对英文小说进行统计单词个数,出现次数,
# 心蓝之数据分析
'''
统计小说单词个数,出现次数,
'''
import string # 输出所有标点箱号
from matplotlib import pyplot as plt # 第三方画图库存,
w = []
with open('1.txt','r') as f:
# c = f.read() # 消耗内存,
for line in f: # 一行一行的处理,
line = line.replace( '-', '' ) # 把 - 替换为空格,
for i in line.split (): #
i = i.strip ( string.punctuation + string.whitespace ) # # 去标点,+ 去空格
i = i.lower() # 统一大小写
w.append( i ) ## 每次生成加进这个列表中,
print( w )
print( '该小说有%s个单词。' % len(w) )
print( '该小说用了%s个不同单词。' % len (set(w)) ) ## 用集合的方法去重,
## 用字典 dict 实现统计每个单词出现的次,(词频)
di = {} # 创建空字典
for n in w:
if n in di: # 如果单词在字典中,
di[n] += 1 # 那么这个单词对应的值+1,
else:
di[n] = 1 # 否则 这个单词对应的值 = 1
print( di )
## 用列表实现词频由大到小的排列,
di_li = [] # 创建空列表
for k,v in di.items(): # 一个个取出 键值
di_li.append( [v,k] )
print( di_li ) ## 出现次数在前面,单词在后面,
di_li.sort( reverse=True )
print( di_li ) ## 自动排序 reverse=True 从大到小
# 画图,画出前10 个,
for i in range(10):
plt.bar( di_li[i][:-1],di_li[i][1:] )
plt.legend() ## 结束
plt.xlabel('单词')
plt.ylabel('次数')
plt.title('该小说的单词直方图')
plt.show()
# print(c) # 文件读取的内容,
# print( type(c) ) # 数据类型为 <class 'str'> 字条串
# li = c.split(' ') # 用空格做分割,
# print(li) #
# print(type(li)) # 数据类型为 <class 'list'> 列表
# print(len(li)) # 列表长度
# c = c.strip(',.') # 对字符串处理,按要求去除
# c = c.strip( string.punctuation + string.whitespace ) # 去标点,+ 去空格
# ## 1 去掉单词首尾不可见字条,
# ## 2 去标点,
# print(li)
#
# for i in range( len(li) ):
# li[i] = li[i].strip ( string.punctuation + string.whitespace ) # 做循环处理,
# print( li )
# print( len(li) )
# 函数式
import string # 输出所有标点箱号
from matplotlib import pyplot as plt # 第三方画图库存,
w = [] # 创建个空列表,用做计算单词个数,之后转为集合再计算用了几种单词,
def clmyh(line, di):
'''#处理每一行'''
line = line.replace('-', '') # 把 - 替换为空格,
for i in line.split(): # 去空格
i = i.strip( string.punctuation + string.whitespace ) # 去标点,+ 去空格
i.lower() # 统一大小写
w.append(i)
# # 统计词频
# if i in di: # 如果单词在字典中,
# di[i] += 1 # 那么这个单证对应的值+1,
# else:
# di[i] = 1 # 否则 这个单证对应的值 = 1
'''用 gdt 方法,用 i 代表的键取其值,如果没有返回 0'''
di[i] = di.get(i, 0) + 1
def clwj( filename ):
'''处理文件,生成直方图'''
di = {}
with open( filename, 'r' ) as f:
for line in f: # 处理每一行
clmyh( line, di )
print('该小说有%s个单词。' % len(w))
print('该小说用了%s个不同单词。' % len(set(w)))
## 用集合的方法去重,
return di
def pai_xu( di ):
'''由大到小排序'''
px = []
for k ,v in di.items():
# 将文件处理得到的字典中的键,值一个个的取出,
px.append( [v,k] )
# 形成一个新列表,放进 px 列表中,
px.sort( reverse=True )
## 自动排序 reverse=True 从大到小
return px
if __name__ == '__main__':
di = clwj( '1.txt' )
dao_dao_xiao = pai_xu( di )
print( dao_dao_xiao[:10] )
## 画图
for i in range(10):
plt.bar( dao_dao_xiao[i][:-1], dao_dao_xiao[i][1:])
plt.legend() ## 结束
plt.xlabel('单词')
plt.ylabel('次数')
plt.title('该小说的单词直方图')
plt.show()