题目描述
附件中保存1个文本文件,分别对应2个问题
其中,文本文件“八十天环游地球txt”是法国作家儒勒. 凡尔纳《八十天环游地球》长篇小说的网络版本,请修改源文件实现以下功能。
问题2:统计每章节的高频词并打印输出。
要求:在模板补充代码,统计“八十天环游地球. txt”中每一章的标题和内容中,出现次数最多的词语(词语长度不少于2个字符)及其次数,输出格式为章节名、 词语及其出现的次数,以空格分隔,示例如下:
示例
第一章 福克 25
第二章 路路通 17
第三章 福克 26
第四章 福克 27
第五章 福克 31
代码
import jieba
import re
strf='八十天环游地球.txt'
with open(strf,'r',encoding='utf-8') as f:
lines=f.read()
t=re.findall('(第.{1,3}章.*)',lines)
with open(strf,'r',encoding='utf-8')as f:
lines=f.read()
s=re.sub('(第.{1,3}章.*)','$',lines)
x=s.split('$')[1:]
for i,j in zip(t,x):
counts={}
txt=jieba.lcut(i+j)
for word in txt:
if len(word)>=2:
counts[word]=counts.get(word,0)+1
lsts=list(counts.items())
lsts.sort(key=lambda x:x[1],reverse=True)
word_max,count_max=lsts[0]
chapter=re.findall('(第.{1,3}章)',i)[0]
print(chapter+' '+word_max+' '+str(count_max))
简要说明:
这道题主要做两件事:1、把每一章相关的内容摘出来 2、分词
首先第一件事,我们要摘出每一章内容,就必须以标题为分割进行摘出,同时要注意,标题的字符也要加入这一章内容进行分词。
这里可以用re.findall(‘()’,lines),把每一章标题摘到一个叫t的列表里。
然后用re.sub(‘()’,‘$’,lines)的方式,把冗长且无法统一的标题名替换成美元符号,然后用字符串split()方式去以美元为分割切成列表,然后去掉第一个元素,也就是标题,就剩下的是每一章的正文内容。
然后用zip()去把每一章对应的标题和正文内容赋值给i和j,再把它们拼起来分词、遍历、用字典记录词频、用列表倒序排序。最后把列表第一个元素拿出来,赋值给word_max和count_max,因为第一个元素是词频最大的。然后是输出,由于’第x章‘相关内容不好输出,再用正则表达式re.findall()去取出来,由于返回的是列表且只有一个元素,因此取[0]即为把这个’第x章’取出来了。
然后用字符串的方式输出来。