函数——文件的读写和统计分词12

012

一、方法论

  • 对于文件:做到有始有终
  1. 就像记东西,先启动大脑的记忆状态,将信息储存在大脑的缓存区,然后记忆完毕后关闭此时的进程,执行其他的进程。
def fenci(txt):
	
    f=open(txt,'r')
    datas=f.read()
    f.close()
  • 对缓存的信息进行处理与加工(这里是 分词
import jieba
	
	# 采用经典的精确模式,并将分词结果储存在 data 中
    data = jieba.lcut(datas)
    d = {}
    # 遍历分词结果
    for i in data:
    	# 如果分词的长度大于等于 2:
        if len(i) >= 2:
        	# dict.get 获取某个键的值
        	# 键 i 存在,返回默认值,不存在返回 0+1=1
            d[i] = d.get(i,0)+1
    # 将键值对的字典视图转换成列表,储存在变量 lt 中
    lt = list(d.items())
    # 返回统计的数据,提取统计的次数,并按降序排列。
    lt.sort(key = lambda x:x[1],reverse = True)
    # 返回排序后的列表
    return lt
  • 向人们展示分词的列表
# 定义一个展示该列表的函数
def show(lt):
	# 先遍历前 9 个元素:
	# 原因是先观察:前 9 个元素是按照逗号分隔的
	# 或者是前 9 个是以逗号结尾的
    for i in lt[:9]:
    	# 分的词1:次数,分的词2:次数......
        print(i[0],':',i[1],end=',',sep='')
    # 打印第 10 个数据
    print(lt[9][0],':',lt[9][1],sep='')
  • 需要注意的是:前9个都是以逗号分隔,因此end的参数为西点逗号,而sep为空。
  • 再次强调:end 默认是换行,sep 默认为一个空格

调用函数:

# 将文件 2018 的分词结果存在 l1 中,这里就是调用函数的语句,与平时不一样的在于:这里的实参是一个.txt 的文件。
# 函数的作用就是可以实现代码的复用。
l1=fenci('data2018.txt')
l2=fenci('data2019.txt')
print('2019:',end='',sep='')
# 调用展示函数
show(l2)
print('2018:',end='',sep='')
show(l1)

总代码:

import jieba

# 定义一个分词的函数,形参为位置参数
def fenci(txt):
	'''首先打开文件,以只读模式,并将结果储存在f 中'''
    f=open(txt,'r')
    # 按行读取,并将结果保存在数据datas中
    datas=f.read()
    # 关闭文件
    f.close()
    # 采用精确模式
    # 并将分词的结果保存在data中
    data=jieba.lcut(datas)
    d = {}
    # 遍历分词结果
    for i in data:
    	# 如果分词的长度大于2:
        if len(i)>=2:
        	# dict.get 获取某个键的值
        	# 键i存在,返回默认值,不存在返回 0+1=1
            d[i]=d.get(i,0)+1
    # 将键值对转换成列表
    lt = list(d.items())
    # 返回统计的数据,按降序排列
    lt.sort(key = lambda x:x[1],reverse = True)
    # 返回排序后的列表
    return lt

# 定义一个展示该列表的函数
def show(lt):
	# 从 0 遍历到 8 
    for i in lt[:9]:
    	# 分的词1:次数,分的词2:次数......
        print(i[0],':',i[1],end=',',sep='')
    # 打印第九个数据
    print(lt[9][0],':',lt[9][1],sep='')
# 将文件 2018 的结果存在 l1 中
l1=fenci('data2018.txt')
l2=fenci('data2019.txt')
print('2019:',end='',sep='')
# 调用函数
show(l2)
print('2018:',end='',sep='')
show(l1)

易错点:

  1. 展示函数中,左后一行的 print()end参数不能是空,因为end默认是换行,如果设置为空,那么结果就是一行,就不会按照年份进行换行了。
def show(lt):
    for i in lt[:9]:
        print(i[0],':',i[1],end=',',sep='')
    print(lt[9][0],':',lt[9][1],end='',sep='')#

结果:

2019:改革:17,发展:17,推进:15,加强:10,创新:9,企业:8,提高:7,实施:6,取得:6,全面:62018:改革:31,发展:27,加强:16,创新:15,推进:14,制度:14,经济:13,坚持:12,实施:12,实现:11

如果一开始就是这样:

def show(lt):
    for i in lt[:9]:
        print(i[0],':',i[1],end=',',sep='')
    print(lt[9][0],':',lt[9][1],sep='')#

result:

2019:改革:17,发展:17,推进:15,加强:10,创新:9,企业:8,提高:7,实施:6,取得:6,全面:6
2018:改革:31,发展:27,加强:16,创新:15,推进:14,制度:14,经济:13,坚持:12,实施:12,实现:11
>>> 
  1. 需要注意的是,下面的代码块中注意逗号,不要遗漏!
def show(lt):
    for i in lt[:9]:
        print(i[0],':',i[1],end=',',sep='')#
  1. 上面的代码是遍历的元素 i ,而不是列表 lt !否则运行结果就为:
2019:('改革', 17):('发展', 17),('改革', 17):('发展', 17),('改革', 17):('发展', 17),('改革', 17):('发展', 17),('改革', 17):('发展', 17),('改革', 17):('发展', 17),('改革', 17):('发展', 17),('改革', 17):('发展', 17),('改革', 17):('发展', 17),全面:6
2018:('改革', 31):('发展', 27),('改革', 31):('发展', 27),('改革', 31):('发展', 27),('改革', 31):('发展', 27),('改革', 31):('发展', 27),('改革', 31):('发展', 27),('改革', 31):('发展', 27),('改革', 31):('发展', 27),('改革', 31):('发展', 27),实现:11
>>> 

二、方法论

1. 对分词函数的拆解:
  1. 文件的操作:打开储存关闭
    f=open(txt,'r')
    datas=f.read()
    f.close()
  1. 对文件的分词
    data=jieba.lcut(datas)
  1. 对分词结果去重
	s = set(data)
  1. 对分词结果的统计
    lt = []
    for i in s:
        if len(i)>=2:
            lt.append(i)
  1. 将以上的代码封装在函数中
  • 别忘了导入 jieba
  • 一般函数都有返回值
import jieba

def fenci(txt):
    f=open(txt,'r')
    datas=f.read()
    f.close()
    data=jieba.lcut(datas)
	s = set(data)
    lt = []
    for i in s:
        if len(i)>=2:
            lt.append(i)
    return ls
2. 调用 fenci() 函数,找共性与特性
  1. 值传递:分别导入文件
l1=fenci('data2018.txt')
l2=fenci('data2019.txt')
  1. 创建一个共有的列表:若遍历 2018 的分词列表,在 2019 中也存在,将该元素追加(可以通俗的说:添加)至l3
l3=[]
for i in l1:
    if i in l2:
        l3.append(i)
  1. 以共性找特性:(如何理解?)
for i in l3:
    l1.remove(i)
    l2.remove(i)

在这里插入图片描述

3. 调用 show() 函数,用于展示列表
  1. 先调用函数:(易错点:信息的对应关系,不要对应错误。)
print('共有词语:',end='',sep='')
show(l3)
print('2019特有:',end='',sep='')
show(l2)
print('2018特有:',end='',sep='')
show(l1)
  1. 创建一个 show() 函数:将列表 lt 用逗号组合起来。
def show(lt):
    print(','.join(lt))

代码如下:

import jieba

def fenci(txt):
    f=open(txt,'r')
    datas=f.read()
    f.close()
    data=jieba.lcut(datas)
	s = set(data)
    lt = []
    for i in s:
        if len(i)>=2:
            lt.append(i)
    return ls
def show(lt):
    print(','.join(lt))
l1=fenci('data2018.txt')
l2=fenci('data2019.txt')
l3=[]
for i in l1:
    if i in l2:
        l3.append(i)
for i in l3:
    l1.remove(i)
    l2.remove(i)
print('共有词语:',end='',sep='')
show(l3)
print('2019特有:',end='',sep='')
show(l2)
print('2018特有:',end='',sep='')
show(l1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗的_小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值