文本文件“红楼梦. txt”中包含了《红楼梦》小说前20章内容,“ 停用词. txt”包含了需要排除的词语。请修改模板,实现以下功能。
1.对“红楼梦. txt”中文本进行分词,并对人物名称进行归-化处理,仅归一化以下内容:
凤姐、凤姐儿、凤丫头归-为凤姐
宝玉、二爷、宝二爷归-为宝玉
黛玉、颦儿、林妹妹、黛玉道归-为黛玉
宝钗、宝丫头归一为宝钗
贾母、老祖宗归-为贾母
袭人、袭人道归一为袭人
贾政、贾政道归一为贾政
贾链、琏二爷归一为贾琏
2.不统计“停用词.txt"文件中包含词语的词频(名字必须大于一个字)。
3.提取出场次数不少于40次的人物名称,将人物名称及其出场次教按照递减排序,保存到result.csv文件中,出场次数相同的.则按照人物名称的字符顺序排序。
输出示例
宝玉,597
凤姐,296
一个,179
如今,132
黛玉,113
一面,112
import jieba
f = "红楼梦.txt"
sf = "停用词.txt"
fo=open(f,'r',encoding='utf-8')
txt=jieba.lcut(fo.read())
with open(sf,'r',encoding='utf-8') as f:
m=f.read().splitlines()
txt0=[x for x in txt if x not in m]
counts={}
for word in txt0:
if len(word)==1:
continue
elif word == '凤姐儿' or word == '凤丫头':
rword = '凤姐'
elif word == '二爷' or word == '宝二爷':
rword = '宝玉'
elif word == '颦儿' or word == '林妹妹' or word == '黛玉道':
rword = '黛玉'
elif word == '宝丫头':
rword = '宝钗'
elif word == '老祖宗':
rword = '贾母'
elif word == '袭人道':
rword = '袭人'
elif word == '贾政道':
rword = '贾政'
elif word == '琏二爷':
rword = '贾琏'
else:
rword = word
counts[rword] = counts.get(rword, 0) + 1
items=list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
with open('result.csv','a')as f:
for i in items:
key,value=i
if value <40:
break
f.write(key+','+str(value)+'n')
print(key+','+str(value))
简要说明:
这道题实际上是完成两个事情:1、把红楼梦文章里包含停用词的内容删去;2、统计人物出场次数,同时注意一个人物在书里会有很多叫法,然后把统计出的内容写在一个csv文件里。
实现第一步要做的事:1、把红楼梦用结巴分词分好放进名为txt列表里 2、用f.read().splitlines()方法,把停用词转化为一个列表,每个元素是一个停用词。3、用列表的自定义方式,对txt每一个元素x遍历,如果它不在停用词列表里,就放入新的列表txt0,这样就完成了停用词的删去。
实现第二步要做的事:定义一个空字典,然后遍历前面做好的txt0,如果元素长度为1,证明是标点或者空格,直接用continue跳过这个元素。如果是我们想要的人名,就作一些分类,并把rword改成归一的那个名字。然后结尾用count[rword]=count.get(rword,0)+1,去把名字和次数分别作为键和值放进这个字典里。
然后是排序(常见的列表排序方法),输出。key,value=i,就是把每个元组的第一个第二个元素分别赋值给key和value,然后是对value值的判断,大于等于40就输出。注意写文件的时候,不要漏掉逗号以及’n’。print()函数由于自带换行,就不用加’n’。



