python中利用jieba库统计词频,counts[word] = counts.get(word,0)+1的使用

博客介绍了在Python中使用counts[word] = counts.get(word,0)+1来统计词频的方法。当word不在words时返回0,在words中则返回值加1进行累计计数。
部署运行你感兴趣的模型镜像
import jieba       
txt = open("阿甘正传-网络版.txt","r",encoding ="utf-8").read()
words = jieba.lcut(txt)        #用jieba库对文本进行中文分词,输出可能的分词的精确模式
counts ={}            #新建一个空字典
for word in words:
    if len(word) == 1:            #挑出单个的分词(不计数)
        continue
    else:
        counts[word] = counts.get(word,0)+1          #对word出现的频率进行统计,当word不在words时,返回值是0,当word在words中时,返回+1,以此进行累计计数
items = list(counts.items())
items.sort(key = lambda x:x[1],reverse = True)
for i in range(10):
    word,count = items[i]    #返回相对应的键值对
    print("{0}:{1}".format(word,count))
    

注: counts[word] = counts.get(word,0)+1 是对进行计数word出现的频率进行统计,当word不在words时,返回值是0,当word在words中时,返回+1,以此进行累计计数。

运行结果:

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>嗯,用户之前遇到了生成词云时的TypeError错误,现在需要修复这个错误并正确绘制《西游记》文本中前100个高频词的词云。我需要仔细分析用户提供的代码和错误信息,找出问题所在,并给出正确的解决方案。 首先,用户提供的错误信息是TypeError: 'int' object is not iterable,发生在生成词云的代码行。查看代码,发现错误行是`wordcloud = wc.generate_from_frequencies(dict(word_counts[word]))`。这里的问题在于,`word_counts[word]`可能是一个整数值,比如某个词的出现次数,而试图用`dict()`将其转换为字典显然是不正确的,因为整数不是可迭代的键值对。 接下来,我需要检查用户之前的代码。词频统计部分是用字典`word_counts`来存储每个词的出现次数,过滤了停用词。这部分看起来是正确的,因为循环遍历`words`,排除停用词后累加计数。所以`word_counts`应该是一个字典,键是词,值是出现次数。 问题出在生成词云的时候,用户错误地使用了`dict(word_counts[word])`。这里的`word`可能是在循环中使用的变量,但此时已经不在循环上下文中,导致`word`未定义,或者取出的`word_counts[word]`是一个整数值,而不是键值对。正确的做法应该是将整个`word_counts`字典传递给`generate_from_frequencies`方法,而不是单个词频值。 另外,用户希望绘制前100个高频词,但代码中并没有筛选前100的部分。因此,需要先对`word_counts`进行排序,取前100个词,再生成字典传递给词云。 还需要检查是否有其他潜在问题,比如字体路径是否正确,是否支持中文显示。用户使用了`font_path = 'msyh.ttc'`,需要确认该字体文件是否存在,否则中文可能无法正确显示,出现乱码。 总结问题点: 1. `generate_from_frequencies`的参数错误,传递了单个整数值而非字典。 2. 需要筛选前100个高频词。 3. 确保中文字体正确加载。 4. 可能的数据类型问题,如键是否为字符串。 解决方案步骤: 1. 修正`generate_from_frequencies`的参数,直接传递`word_counts`字典。 2. 对`word_counts`按值排序,取前100项生成新字典。 3. 验证字典结构是否正确,键为词,值为计数。 4. 确保字体路径正确,避免中文乱码。 5. 添加必要的导入和绘图代码,展示并保存词云。 此外,用户可能需要安装必要的,如wordcloud和matplotlib,如果尚未安装的话,需要在代码前添加安装指令,但通常在Jupyter笔记本中可能已经安装。需要提醒用户注意这一点。 最后,给出完整的修正代码,并解释每一步的作用,确保用户能够理解并正确实施。</think>根据错误分析和代码修正需求,以下是完整的解决方案(含数学表达式和代码实现): **错误核心**:`generate_from_frequencies()`需要接收形如$\{ \text{"词语"}: \text{频次} \}$的字典,但原代码误传了单个整数值[^1] **完整解决方案**: ```python # ====== 词频预处理 ====== # 按频次降序排序并取前100(满足离散分布条件:Σf_i=词频) top_words = dict(sorted(word_counts.items(), key=lambda x: -x[1])[:100]) # ====== 类型验证 ====== # 验证字典结构满足:∀k∈keys(top_words), type(k)=str ∧ type(v)=int print("示例数据:", list(top_words.items())[:3]) # 应输出类似[('行者', 4523), ('悟空', 3891), ('唐僧', 2876)] # ====== 词云生成 ====== # 定义词云参数(含中文支持) wc = WordCloud( font_path='msyh.ttc', # 确保字体文件存在 background_color="white", width=1200, height=800, max_font_size=200, colormap="viridis" ) # 生成词云对象(通过正确字典输入) wordcloud = wc.generate_from_frequencies(top_words) # 正确传递字典 # ====== 可视化与保存 ====== plt.figure(figsize=(15,10)) plt.imshow(wordcloud, interpolation='bilinear') plt.axis("off") plt.savefig('西游记词云.png', dpi=300, bbox_inches='tight') # 保存高清图 plt.show() ``` **关键数学验证**: 设筛选后的词频字典为$D_{top} = \{ (w_i, f_i) | f_i ≥ f_{100} \}$,其中: $$ \exists! f_{100} \text{ 使得 } |D_{top}|=100 \land \forall f_i \in D_{top}, f_i ≥ f_{100} $$ 该条件确保准确提取前100高频词[^2] **典型问题排查表**: | 现象 | 原因 | 解决方案 | |------|------|----------| | 空白词云 | 字体路径错误 | 检查`font_path`有效性 | | 显示方框 | 未过滤非中文字符 | 添加正则过滤`re.match([\u4e00-\u9fa5]+)` | | 报错`KeyError` | 字典含空键 | 预处理:`{k:v for k,v in dict.items() if k}` | **代码优化建议**: 1. 使用Counter统计词频(时间复杂度$O(n)$): ```python from collections import Counter word_counts = Counter(word for word in words if word not in stopwords) ``` 2. 添加词频分布直方图(验证长尾分布): ```python import numpy as np plt.hist(np.log10(list(word_counts.values())), bins=20) plt.xlabel('log10(词频)') plt.ylabel('词语数量') ``` **扩展应用**: - 使用TF-IDF加权:$$ \text{score}(w) = f_w \times \log\left(\frac{N}{n_w}\right) $$ 其中$N$为总文档数,$n_w$为包含词语$w$的文档数
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值