鱼C论坛

 找回密码
 立即注册
查看: 25|回复: 2

[已解决]关于使用jieba统计词频问题

[复制链接]
发表于 2026-5-15 17:14:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
经过实际比对,发现在使用jieba统计词频时并不准确,一些词语词频统计要少于实际词频。
下面的代码就是如此,问了deepseek、千问、豆包,使用jieba模块都没能解决,因为无法
具体到某一个词语,所以也无法使用正则匹配。请教大神们,如何修改代码?

import jieba

text = open("1.txt","r",encoding = 'utf-8').read()
text_list = jieba.lcut(text)
text_dict = {}

# 定义需过滤字符集
stop_punc = {",", "。", "、", "?", "!", "“", "”", "‘", "’", "(", ")", "《", "》", ":", ";", " ", "\n", "\t", "\r", "\"", "'", ",", "."}

for word in text_list:
    # 1. 过滤
    if word in stop_punc or word.isspace() or len(word) == 1:
        continue

    # 统计词频
    text_dict[word] = text_dict.get(word, 0) + 1

# 排序并输出前10
text_dict = sorted(text_dict.items(), key=lambda x: x[1], reverse=True)
print(text_dict[:10])
最佳答案
2026-5-15 17:29:52
这个问题大概率是分词粒度导致的——jieba 默认会按最细粒度切,但有些词可能被合并了。可以试试在代码开头加一句 jieba.load_userdict('自定义词典.txt'),把你想要的词手动加进去。另外,如果文本里有很多专业术语,建议先暴力遍历所有 n-gram(2-5字组合)做个词频统计,再对比 jieba 的结果,这样能定位到底是分词漏了还是统计逻辑有问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-5-15 17:14:26 | 显示全部楼层
你好!看到你的问题,你遇到的词频统计不准确,很可能是因为代码中存在一个关键错误,并且分词本身也可能把想要的词语切碎了。下面详细说明并给出修改方案。

## 1. 代码根本错误

你的统计部分写成了:

  1. text_dict = text_dict.get(word, 0) + 1
复制代码

这一行会把 text_dict.get(word, 0) 返回的整数(比如3)赋值给 text_dict,导致整个字典变量变成了一个整数,后面的 text_dict.items() 会报错。

正确写法应该是:

  1. text_dict[word] = text_dict.get(word, 0) + 1
复制代码


## 2. 分词可能不准确

jieba默认词典可能没有包含你文本中的一些专有词汇,比如“机器学习”、“人工智障”等会被拆成单字或更短的词,从而导致这些词语的统计结果为零或偏小。

**解决方法**:使用 jieba.load_userdict() 加载自定义词典,或者直接用 jieba.add_word() 把要统计的词语加入分词器。

## 3. 修改后的完整代码示例

假设你要统计“机器学习”、“深度学习”等词,可以这样:


  1. import jieba
  2. from collections import Counter

  3. text = open("1.txt", "r", encoding='utf-8').read()

  4. # 添加自定义词语,确保这些词不会被切碎
  5. jieba.add_word("机器学习")
  6. jieba.add_word("深度学习")
  7. # 可以根据需要继续添加

  8. # 分词(使用精确模式)
  9. words = jieba.lcut(text)

  10. # 定义过滤集
  11. stop_punc = {",", "。", "、", "?", "!", "“", "”", "‘", "’", "(", ")", "《", "》", ":", ";", " ", "\n", "\t", "\r", """, "'", ",", "."}

  12. # 过滤并统计
  13. text_dict = {}
  14. for word in words:
  15.     if word in stop_punc or word.isspace() or len(word) == 1:
  16.         continue
  17.     # 正确的字典赋值
  18.     text_dict[word] = text_dict.get(word, 0) + 1

  19. # 排序(按频次降序)
  20. sorted_items = sorted(text_dict.items(), key=lambda x: x[1], reverse=True)
  21. print(sorted_items[:10])
复制代码


如果只需要出现次数最多的前10个词语,也可以用 Counter 更简洁:

  1. word_counts = Counter(word for word in words if word not in stop_punc and len(word) > 1)
  2. print(word_counts.most_common(10))
复制代码


## 4. 如果某些词还是统计不对

请检查:
- 文本中该词语实际出现的次数(手动搜索确认)。
- 分词结果:可以用 print(jieba.lcut(文本)) 看看目标词语被切成什么样了,然后针对性地添加自定义词语。
- 过滤条件 len(word) == 1 可能会漏掉一些有意义的单字词,如果你需要的词语长度都大于1,则没问题。

另外,你原代码最后排序那一行 sorted(text_dict.items(), key=lambda x: x, reverse=True) 的key应该用 x[1] 才能按频次排序,否则是按词语字典序排序。

总结:先修好字典赋值的 bug,再自定义分词词典,你的统计就会准确了。试试看,如果有具体词语仍不对,欢迎贴出示例文本片段,我可以帮你进一步分析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-15 17:29:52 | 显示全部楼层    本楼为最佳答案   
这个问题大概率是分词粒度导致的——jieba 默认会按最细粒度切,但有些词可能被合并了。可以试试在代码开头加一句 jieba.load_userdict('自定义词典.txt'),把你想要的词手动加进去。另外,如果文本里有很多专业术语,建议先暴力遍历所有 n-gram(2-5字组合)做个词频统计,再对比 jieba 的结果,这样能定位到底是分词漏了还是统计逻辑有问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-5-24 23:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表