import jieba file=open(r"C:\Users\yikandan\Desktop\红楼梦.txt","r",encoding='utf-8') txt=file.read() wordsList=jieba.lcut(txt) actors=[('贾宝玉',"宝玉"),("林黛玉","黛玉"),("薛宝钗","宝钗"),("王熙凤","凤姐"),("贾母","老太太"),("袭人",),("探春",),('贾琏',),('王夫人','夫人')] dictActors={} for actor in actors: if len(actor)==2: count1=wordsList.count(actor[0]) count2=wordsList.count(actor[1]) dictActors[actor[0]]=count1+count2 else: count1=wordsList.count(actor[0]) dictActors[actor[0]]=count1+count2 items=list(dictActors.items()) items.sort(key=lambda x:x[1],reverse=True) for i in range(len(items)): word,count=items[i] print("{}\t{}".format(word,count))给我逐行解释这段代码
时间: 2024-01-03 10:04:58 浏览: 114
这段代码是用来读取《红楼梦》这本小说,然后统计小说中出现的人物名字及其出现的次数的。
代码的第一行是导入了一个名为jieba的分词库。
第二行打开了《红楼梦》这本小说的文件,并以只读方式读取文件中的内容。
第三行使用分词库jieba对小说文本进行分词,得到一个包含所有分词结果的列表wordsList。
第四行定义了一个包含小说中出现的人物名字的列表actors,其中每个元素都是一个包含人物名字的元组。
第五行定义了一个空字典dictActors,用来存储人物名字及其对应的出现次数。
第六行开始遍历actors列表中的每个元素,如果该元素是一个包含两个人物名字的元组,则分别统计这两个人物名字在小说文本中出现的次数,并将这两个次数相加后存入dictActors字典中;如果该元素只包含一个人物名字,则直接统计该人物名字在小说文本中出现的次数并存入dictActors字典中。
第九行将dictActors字典中的所有键值对以列表的形式取出来,并按照键所对应的值(出现次数)进行降序排序。
第十一行开始遍历排序后的键值对列表,将每个人物名字及其出现次数以格式化的形式输出。
相关问题
import jieba f=open('荷塘月色.txt') article_text=f.read() f.close() article=jieba.lcut(article_text) dic={} for word in article: if word not in dic: dic[word]=1 else: dic[word]+=1 swd=sorted(list(dic.items()),key=lambda lst:lst[1],reverse=True) f1=open('filename.txt', encoding='utf-8') text = f.read() stop_wds=f1.read() f1.close() for kword,times in swd: if kword not in stop_wds: print(kword,times) 哪里有问题进行改正并写出
在第13行,应该将`f`改为`f1`,即:
```
stop_wds=f1.read()
```
此外,第12行应该加上关闭文件的操作,即:
```
f1.close()
```
改正后的代码如下:
```
import jieba
f = open('荷塘月色.txt')
article_text = f.read()
f.close()
article = jieba.lcut(article_text)
dic = {}
for word in article:
if word not in dic:
dic[word] = 1
else:
dic[word] += 1
swd = sorted(list(dic.items()), key=lambda lst:lst[1], reverse=True)
f1 = open('filename.txt', encoding='utf-8')
text = f1.read()
stop_wds = text.split('\n')
f1.close()
for kword, times in swd:
if kword not in stop_wds:
print(kword, times)
```
import jieba import wordcloud import imageio mask = imageio.imread('C:/Users/Febird/Desktop/1.png') #设定一个词云背景 with open('C:/Users/Febird/Desktop/傲世.txt', encoding='utf-8') as f: t = f.read() # 打开需要制作词云图的文件 ls = jieba.lcut(t) txt = " ".join(ls) # 将文章中的词组提出来 stopwords_file = open('C:/Users/Febird/Desktop/stopWord.txt', 'r', encoding='utf-8') stopwords = [(words.strip()) for words in stopwords_file.readlines()] w = wordcloud.WordCloud(width=4000, height=4000, stopwords=stopwords, font_path="msyh.ttc", colormap='hot', background_color='pink', mask=mask) # 定义一个词云 w.generate(txt) #生成词云 w.to_file(r'C:/Users/Febird/Desktop/test_3.png') #将词组变量txt导入词云对象w中并保存 添加代码 完成排名前五十个词的词云
在代码中添加以下部分可以完成排名前五十个词的词云:
```
from collections import Counter
# 统计词频
words_count = Counter(ls)
# 获取词频前50的词及其频次
top50_words = words_count.most_common(50)
# 将排名前50的词转换为一个字符串
top50_str = ""
for word, count in top50_words:
top50_str += (word + " ") * count
# 生成词云
w.generate(top50_str)
```
完整代码如下:
```
import jieba
import wordcloud
import imageio
from collections import Counter
mask = imageio.imread('C:/Users/Febird/Desktop/1.png')
with open('C:/Users/Febird/Desktop/傲世.txt', encoding='utf-8') as f:
t = f.read()
ls = jieba.lcut(t)
txt = " ".join(ls)
stopwords_file = open('C:/Users/Febird/Desktop/stopWord.txt', 'r', encoding='utf-8')
stopwords = [(words.strip()) for words in stopwords_file.readlines()]
w = wordcloud.WordCloud(width=4000, height=4000,
stopwords=stopwords,
font_path="msyh.ttc",
colormap='hot',
background_color='pink',
mask=mask)
# 统计词频
words_count = Counter(ls)
# 获取词频前50的词及其频次
top50_words = words_count.most_common(50)
# 将排名前50的词转换为一个字符串
top50_str = ""
for word, count in top50_words:
top50_str += (word + " ") * count
# 生成词云
w.generate(top50_str)
w.to_file(r'C:/Users/Febird/Desktop/test_3.png')
```