- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,需求
本文案例的资源,可直接下载
https://download.csdn.net/download/qq_55006020/89864064?spm=1001.2014.3001.5501
案例要求: 要求:统计出title中 热门词频Top10
有这么有一份数据文件 46.2MB
打开之后:
要求:统计出title中 热门词频Top10
实现技术栈:
实现这道题的需求,可以用的工具选择有很多,用sql,用hive,用pandas等都可以实现;
这里用spark中的RDD算子分析;
二,思路
- 第一步:导入数据
- 第二步:把数据转为字典
- 第三步:根据字典键取值,拿到title
- 第四步:使用jieba分词,过滤掉形容词,保留名词
- 第五步:多维列表拉平至一维列表;
- 第六步:过滤单词长度小于1的;
- 第七步:单词计数,转为kv结构,给每个单词后面计数为1
- 第八步:reduce规约,统计单词次数
- 第九步:排序,以单词出现的次数降序排序
- 第十步:输出前Top10的单词以及出现的次数
完整代码
# encoding=utf-8
import json
from pyspark import SparkContext
import jieba.posseg as pseg
sc = SparkContext()
#第一步,导入数据
rdd = sc.textFile('hdfs://node1:8020/baike_qa_valid.json')
# print(rdd.take(10))
#第二步,转json为字典
rdd_dict = rdd.map(lambda x:json.loads(x))
# print(rdd_dict.take(10))
#第三步,遍历每一行,根据键取值
rdd_title = rdd_dict.map(lambda x:x['title'])
# print(rdd_title.take(10))
# 过滤名词
def minci(title):
words = pseg.cut(title) #全部的分词
nouns = []
for word, flag in words:
if flag.startswith('n'): #如果是名词就放进去
nouns.append(word)
return nouns
#第四步 运用叽霸分词 把词分出来 我只保留名词哦~~
rdd_word = rdd_title.map(lambda x:minci(x))
# print(rdd_word.take(10))
#第五步 拉平列表
rdd_word1 = rdd_word.flatMap(lambda x:x)
# print(rdd_word1.collect(),'查看分词的结果')
#第六步 过滤单词长度小于1的,
rdd_fiflt = rdd_word1.filter(lambda x:len(x)>1)
# print(rdd_fiflt.collect())
#第七步:单词计数 转为kv结构
rdd_tuple = rdd_fiflt.map(lambda x:(x,1))
# print(rdd_tuple.collect())
#第八步,分组聚合
rdd_group = rdd_tuple.reduceByKey(lambda x,y:x+y)
# print(rdd_group.collect())
#第九步,排序 降序
rdd_sort = rdd_group.sortBy(lambda x:x[1],ascending=False)
# print(rdd_sort.collect())
# print(rdd.take(10))
# print(rdd_dict.collect())
# print(rdd_title.take(5))
print(rdd_sort.take(10))
'''
但是统计出来的 都是一些形容词 没啥意义 所以需要保留名词
'''
#[('什么', 7555), ('怎么', 4546), ('问题', 3090),
# ('请问', 2982), ('为什么', 2563), ('一个', 2492),
# ('可以', 2355), ('如何', 2331), ('现在', 2201), ('知道', 1993)]
'''
这是保留名词之后结果
[('问题', 3090), ('大家', 1243),
('宝宝', 1231), ('时候', 1224),
('电脑', 1184), ('谢谢', 1106),
('游戏', 896), ('高手', 780), ('朋友', 740), ('老师', 615)]
'''
三,代码实现以及实时展示过程
第一步:导入数据
#第一步,导入数据
rdd = sc.textFile('hdfs://node1:8020/baike_qa_valid.json')
- 验证是否导入成功
第二步:把数据转为字典
#第二步,转json为字典
rdd_dict = rdd.map(lambda x:json.loads(x))
验证是否转入成功
第三步:根据字典键取值,拿到title
#第三步,遍历每一行,根据键取值
rdd_title = rdd_dict.map(lambda x:x['title'])
抽样前10条 验证查看
第四步:使用jieba分词,过滤掉形容词,保留名词
def minci(title):
words = pseg.cut(title) #全部的分词
nouns = []
for word, flag in words:
if flag.startswith('n'): #如果是名词就放进去
nouns.append(word)
return nouns
#第四步 运用叽霸分词 把词分出来 我只保留名词哦~~
rdd_word = rdd_title.map(lambda x:minci(x))
print(rdd_word.take(10))
第五步:多维列表拉平至一维列表;
#第五步 拉平列表
rdd_word1 = rdd_word.flatMap(lambda x:x)
print(rdd_word1.collect(),'查看分词的结果')
第六步:过滤单词长度小于1的;
#第六步 过滤单词长度小于1的,
rdd_fiflt = rdd_word1.filter(lambda x:len(x)>1)
print(rdd_fiflt.collect())
第七步:单词计数,转为kv结构,给每个单词后面计数为1
#第七步:单词计数 转为kv结构
rdd_tuple = rdd_fiflt.map(lambda x:(x,1))
print(rdd_tuple)
第八步:reduce规约,统计单词次数
#第八步,分组聚合
rdd_group = rdd_tuple.reduceByKey(lambda x,y:x+y)
print(rdd_group.collect())
第九步:排序,以单词出现的次数降序排序
#第九步,排序 降序
rdd_sort = rdd_group.sortBy(lambda x:x[1],ascending=False)
print(rdd_sort.collect())
第十步:输出前Top10的单词以及出现的次数
print(rdd_sort.take(10))
完整代码
# encoding=utf-8
import json
from pyspark import SparkContext
import jieba.posseg as pseg
sc = SparkContext()
#第一步,导入数据
rdd = sc.textFile('hdfs://node1:8020/baike_qa_valid.json')
# print(rdd.take(10))
#第二步,转json为字典
rdd_dict = rdd.map(lambda x:json.loads(x))
# print(rdd_dict.take(10))
#第三步,遍历每一行,根据键取值
rdd_title = rdd_dict.map(lambda x:x['title'])
# print(rdd_title.take(10))
# 过滤名词
def minci(title):
words = pseg.cut(title) #全部的分词
nouns = []
for word, flag in words:
if flag.startswith('n'): #如果是名词就放进去
nouns.append(word)
return nouns
#第四步 运用叽霸分词 把词分出来 我只保留名词哦~~
rdd_word = rdd_title.map(lambda x:minci(x))
# print(rdd_word.take(10))
#第五步 拉平列表
rdd_word1 = rdd_word.flatMap(lambda x:x)
# print(rdd_word1.collect(),'查看分词的结果')
#第六步 过滤单词长度小于1的,
rdd_fiflt = rdd_word1.filter(lambda x:len(x)>1)
# print(rdd_fiflt.collect())
#第七步:单词计数 转为kv结构
rdd_tuple = rdd_fiflt.map(lambda x:(x,1))
# print(rdd_tuple.collect())
#第八步,分组聚合
rdd_group = rdd_tuple.reduceByKey(lambda x,y:x+y)
# print(rdd_group.collect())
#第九步,排序 降序
rdd_sort = rdd_group.sortBy(lambda x:x[1],ascending=False)
# print(rdd_sort.collect())
# print(rdd.take(10))
# print(rdd_dict.collect())
# print(rdd_title.take(5))
print(rdd_sort.take(10))
'''
但是统计出来的 都是一些形容词 没啥意义 所以需要保留名词
'''
#[('什么', 7555), ('怎么', 4546), ('问题', 3090),
# ('请问', 2982), ('为什么', 2563), ('一个', 2492),
# ('可以', 2355), ('如何', 2331), ('现在', 2201), ('知道', 1993)]
'''
这是保留名词之后结果
[('问题', 3090), ('大家', 1243),
('宝宝', 1231), ('时候', 1224),
('电脑', 1184), ('谢谢', 1106),
('游戏', 896), ('高手', 780), ('朋友', 740), ('老师', 615)]
'''
分析完毕之后,可以转出存储数据库,或者交给pandas,或者pyehcarts直接去做图
这里暂略
谢谢观看~~~
四,总结
中文词频统计热门top10,需要注意的点
业务方面:
- 形容词,比如什么,怎么,等等没啥意义,所以需要过滤掉
- 单词数量小于1的,一个字的也没有什么意义,所以也需要过滤掉
技术方面:
- 源数据是json数据,所以需要导入json模块,将其转为字典
- 字典可以通过键取值
- 取到的值在用分词器过滤
- 过滤之后的数据在进一步筛选
- 然后生成kv结构
- 聚合并排序
- 取top10
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用