# -*- coding : utf-8 -*-
# @Time : 2021/1/25 16:53
# @author : 王小王
# @Software : PyCharm
# @File : 词云图.py
# @CSDN : https://blog.csdn.net/weixin_47723732
import pandas as pd
# 导入pyecharts可视化库,词云渲染效果极佳
from pyecharts import options as opts
from pyecharts.charts import WordCloud
from pyecharts.globals import SymbolType
import jieba # jieba用于分词,中文字典及其强大
ll = []
lg = []
lk = []
lj = []
lp = []
li = []
d = {} # 定义好相应的存储变量
# 读取指定的CSV文件的列族
def fc(title):
fields = ['论文名', '作者', '来源', '发表日期', '数据库', '下载次数']
df = pd.read_csv('E:\个人文件\Python\Python源码\基础项目\知网科研\{}.csv'.format(title),skipinitialspace=True, usecols=fields)
# # See the keys
# print(df.keys())
# print("-------------------------------------------")
# # See content in 'star_name'
# for index, item in enumerate(df.论文名):
# print(item)
a = ','.join(df['论文名'].to_list())
b = jieba.lcut(a) # 分词之后,把值储存到b这个变量
for x in b: # 遍历b这个,去除里面的特殊字符
if x in ",。、;:‘’“”【】《》?、.!…研究 大数据 基于 研究 分析 思考 展望 技术 应用 时代\n":
continue
else: # 分别分出有意义的词组,因为对于一个词的,分析没有太大的意义
if len(x) == 1: # 根据中文词组的特点,我们只需要得到2,3,4的词组即可,就可以达到分析目的
ll.append(x) # 存储1词组变量
elif len(x) == 2:
lg.append(x) # 存储2词组变量
elif len(x) == 3:
lk.append(x) # 存储3词组变量
elif len(x) == 4:
lj.append(x) # 存储4词组变量
for i in lg:
lp.append(i) # 存储大于1的词组变量
for p in lk:
lp.append(p)
for f in lj:
lp.append(f)
for t in lp:
li.append(t) # 存储全部变量
for y in ll:
li.append(y)
def cut(choice):
if choice == 1:
lp_1 = ll
elif choice == 2:
lp_1 = lg
elif choice == 3:
lp_1 = lk
elif choice == 4:
lp_1 = lj
elif choice == 5:
lp_1 = lp
elif choice == 6:
lp_1 = li
else:
lp_1 = None
print("输入有误,请重新输入!")
return lp_1
def sort():
global choice
choice = int(input("请输入你的功能选择:"))
for word in cut(choice):
# 这里依次取到列表里面的元素,作为字典的键,d.get(word, 0)代表取到的值,也就是出现的次数
# 如果存在就返回该有的值,如果不存在就返回0,依次递增,比如这个词第一次出现,他没有找到,那么就会默认返回0
# 但是后面有过+1所以这个词现在就出现1次,如果这个词已经出现了10次,那么get到就会返回10次,但刚刚又出现1次
# 那么就会+1,所以现在总共出现11次,这个就是标准的词组排序算法
d[word] = d.get(word, 0) + 1
ls = list(d.items()) # 把所有的词组出现的次数,赋予了相应的次数之后,接下来就是封装这个元组
# 利用字典的item()方法,取出所有的值,返回的是一个元组,存放到列表里面,现在列表里面的每一个元素就是一个元组
# 接下来就是利用列表对里面的元素进行排序处理,利用lambda函数的标准算法,key=lambda 列表里每一个元素:该元素内部里面的第二个元素
# 对该元素进行排序(数字),默认False是从小到大,这里我们需要从大到小,所以需要参数:reverse=True
ls.sort(key=lambda x: x[1], reverse=True)
# 如果列表里面不是之前那样的标准形式,那么就按照下面的方法进行
# for a in ls:
# words.append((a[0],a[1]))
return ls
def main(titles):
try:
fc(titles)
print("\n分词完毕!")
print('''\n\n\t 一键词云算法生成器
\t1--生成一词组的词云图
\t2--生成二词组的词云图
\t3--生成三词组的词云图
\t4--生成四词组的词云图
\t5--生成大于1词组的词云图(研究常用)
\t6--生成全部词组的词云图(包含所有类型的词组)
''')
num = int(input("请输入本次展示的词语数量(最好不超过100):"))
data = sort()[:num]
Str = input("请输入这个词云图的标题:")
print("词云图已经生成完毕,请查收!")
print("感谢您对本程序的使用,欢迎下次光临!!")
c = (
WordCloud()
.add(
"",
data, # 数据集
word_size_range=[20, 100], # 单词字体大小范围
shape=SymbolType.DIAMOND) # 词云图轮廓,有以下的轮廓选择,但是对于这个版本的好像只有在提示里面选
# circl,cardioid,diamond,triangle-forward,triangle,start,pentagon
.set_global_opts(title_opts=opts.TitleOpts(title="{}".format(Str)),
toolbox_opts=opts.ToolboxOpts()) # 工具选项
.render("{}词云制作{}词组.html".format(titles, choice))
)
return c
except:
print("无法找到,请检查你的输入!")
if __name__ == '__main__':
st=str(input("请输入爬取的文件名:"))
main(st)
- 1
- 2
- 3
- 4
- 5
- 6
前往页