一、文本词频同意问题分析
1.1 问题分析
文本词频统计
- 需求:一篇文章,出现了哪些词?哪些词出现得最多?
- 该怎么做呢?
英文文本 --> 中文文本
-
英文文本:Hamet 分析词频
-
中文文本:《三国演义》 分析人物
二、 Hamlet英文词频统计实例讲解
- 文本去噪及归一化
- 使用字典表达词频
f = open(r"E:python实训python预科班day06hamlet.txt", "r", encoding="utf-8")
# 读取文件
data = f.read().lower()
# 通过" "切割单词
data_split = data.split(" ")
# 统计数据
count_data = {}
# 统计单词出现的次数
for word in data_split:
# 判断词是否再字典中
if word in count_data:
count_data[word] += 1
else:
count_data[word] = 1
# item获取键值对(一个一个元组存放0),将所有键值对通过元组存放
data_items = count_data.items()
# 将元组转换成list
list_item = list(data_items)
def func(i):
"""排序"""
return i[1]
# 降序
list_item.sort(key=func, reverse=True)
# 出现最多的前十个单词
res_data = list_item[:10]
for word in res_data:
print(f"{word[0]: ^7} {word[1]: ^5}")
f.close()
结果:
the 791
and 596
of 527
to 508
a 376
my 375
in 320
you 314
i 291
his 235
- 运行结果由大到小排序
- 观察单词出现次数
三、《三国演义》人物出场统计实例讲解
- 中文文本分词
- 使用字典表达词频
- 中文文本分词
- 使用字典表达词频
- 扩展程序解决问题
- 根据结果进一步优化
import jieba
"""
@author RansySun
@create 2019-07-19-11:08
"""
f = open(r"E:python实训python预科班day06 hreekingdoms.txt", encoding="utf8")
data = f.read()
# 切割中文
data_jieba = jieba.lcut(data)
count_dic = {}
for word in data_jieba:
# 去除长度为一的逗号,句号(无意义词)等
if len(word) == 1:
continue
# 去除不是人物词
if word in {"将军", "却说", "荆州", "二人", "不可", "今日", "不能", "不敢", "丞相", "今日", "关公", "天下", "东吴", "于是", "如此", "次日", "大喜", "商议"}:
continue
if "曰" in word:
word = word[:-1]
if word in count_dic:
count_dic[word] += 1
else:
count_dic[word] = 1
def func(i):
return i[1]
data_list = list(count_dic.items())
data_list.sort(key=func, reverse=True)
data_res = data_list[:10]
print(data_res)
for data in data_res:
print(f"{data[0]: ^5} {data[1]: ^7}")
结果:
孔明 1226
玄德 975
曹操 953
张飞 358
吕布 300
赵云 278
刘备 277
云长 265
孙权 264
魏兵 233
四、文本词频统计举一反三
4.1 应用问题的扩展
- 《红楼梦》、《西游记》、《水浒传》…
- 政府工作报告、科研论文、新闻报道 …
- 进一步呢? 未来还有词云…