|
|
发表于 2026-5-15 17:14:26
|
显示全部楼层
你好!看到你的问题,你遇到的词频统计不准确,很可能是因为代码中存在一个关键错误,并且分词本身也可能把想要的词语切碎了。下面详细说明并给出修改方案。
## 1. 代码根本错误
你的统计部分写成了:
- text_dict = text_dict.get(word, 0) + 1
复制代码
这一行会把 text_dict.get(word, 0) 返回的整数(比如3)赋值给 text_dict,导致整个字典变量变成了一个整数,后面的 text_dict.items() 会报错。
正确写法应该是:
- text_dict[word] = text_dict.get(word, 0) + 1
复制代码
## 2. 分词可能不准确
jieba默认词典可能没有包含你文本中的一些专有词汇,比如“机器学习”、“人工智障”等会被拆成单字或更短的词,从而导致这些词语的统计结果为零或偏小。
**解决方法**:使用 jieba.load_userdict() 加载自定义词典,或者直接用 jieba.add_word() 把要统计的词语加入分词器。
## 3. 修改后的完整代码示例
假设你要统计“机器学习”、“深度学习”等词,可以这样:
- import jieba
- from collections import Counter
- text = open("1.txt", "r", encoding='utf-8').read()
- # 添加自定义词语,确保这些词不会被切碎
- jieba.add_word("机器学习")
- jieba.add_word("深度学习")
- # 可以根据需要继续添加
- # 分词(使用精确模式)
- words = jieba.lcut(text)
- # 定义过滤集
- stop_punc = {",", "。", "、", "?", "!", "“", "”", "‘", "’", "(", ")", "《", "》", ":", ";", " ", "\n", "\t", "\r", """, "'", ",", "."}
- # 过滤并统计
- text_dict = {}
- for word in words:
- if word in stop_punc or word.isspace() or len(word) == 1:
- continue
- # 正确的字典赋值
- text_dict[word] = text_dict.get(word, 0) + 1
- # 排序(按频次降序)
- sorted_items = sorted(text_dict.items(), key=lambda x: x[1], reverse=True)
- print(sorted_items[:10])
复制代码
如果只需要出现次数最多的前10个词语,也可以用 Counter 更简洁:
- word_counts = Counter(word for word in words if word not in stop_punc and len(word) > 1)
- 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 小助理,如未能正确解答您的问题,请继续追问。 |
|