其实很早以前就想搞一套完备的标签云架构了,迫于没有时间(其实就是懒),一直就没有弄出来完整的代码,说到底标签对于网站来说还是很重要的,它能够对一件事物产生标志性描述,通常都会采用相关性很强的关键字,这样不仅便于检索和分类,同时对网站的内链体系也是有促进作用的。
最近疫情的关系一直在家里呆着,闲暇时和一些学生聊天的时候,人家问:你说你一直在写博客,那你到底在写一些什么内容的文章呢?我竟然一时语塞,于是搞出来下面这种的标签云,下回被问同样的问题时,就可以展示一下了。
和传统的在线博客标签云最大的区别在于,这些标签并不是我手动打上去的,因为时间有限,每写一篇文章就自己提取很多关键字出来,还得挨个入库,这件事想想就很痛苦,于是写脚本自动提取关键字,再综合所有文章的标题得出。
这里用到的技术点就是基于python3.7的结巴分词中的提取关键词,首先进行安装
- pip3 install jieba
结巴分词基于TF-IDF关键词提取算法
TF-IDF是关键词提取最基本、最简单易懂的方法。判断一个词再一篇文章中是否重要,一个最容易想到的衡量指标就是词频,重要的词往往在文章中出现的频率也非常高;但另一方面,不是出现次数越多的词就一定重要,因为有些词在各种文章中都频繁出现(例如:我们),那它的重要性肯定不如哪些只在某篇文章中频繁出现的词重要性强。从统计学的角度,就是给予那些不常见的词以较大的权重,而减少常见词的权重,最终得分较高的词语即为关键词。
与此同时,结巴分词还可以帮你过滤那些无意义的虚词,类似「的、地、得、着、了、过」这种
代码如下:
- import jieba.analyse
-
- data = "其实很早以前就想搞一套完备的标签云架构了,迫于没有时间(其实就是懒),一直就没有弄出来完整的代码,说到底标签对于网站来说还是很重要的,它能够对一件事物产生标志性描述,通常都会采用相关性很强的关键字,这样不仅便于检索和分类,同时对网站的内链体系也是有促进作用的。最近疫情的关系一直在家里呆着,闲暇时和一些学生聊天的时候,人家问:你说你一直在写博客,那你到底在写一些什么内容的文章呢?我竟然一时语塞,于是搞出来下面这种的标签云,下回被问同样的问题时,就可以展示一下了。"
- for keyword, weight in jieba.analyse.extract_tags(data, withWeight=True):
- print('%s %s' % (keyword, weight))
默认会直接提取前20个关键词,按照权重倒序:
- 标签 0.36316568234921054
- 一直 0.17986207627776318
- 网站 0.17220419499
- 内链 0.15729957240657894
- 弄出来 0.13730186512105264
- 语塞 0.13539157551710526
- 其实 0.13493691317526316
- 下回 0.1301755850886842
- 很早以前 0.12859925351223683
- 关键字 0.1277766172361842
- 检索 0.1236956313375
- 闲暇 0.1223093087630263
- 标志性 0.12002044945868422
- 迫于 0.11836056412552631
- 相关性 0.11816706218618422
- 架构 0.11760306607526315
- 促进作用 0.11620754539157895
- 说到底 0.11464857692289475
- 博客 0.11084492236894737
- 聊天 0.11041170151776317
看起来还是相当靠谱。
如果你需要修改关键词数量,可以指定topK参数,输入几个就返回几个
那么只要在文章提交时加入上面的脚本,就可以每一次都自动生成关键词了,当然了,关键词的存储结构设计也是一个难题,有时间会探讨一下。
有了文章和关键词的关联关系,那么就剩下前端的展示,这里推荐一下台湾同胞写的一个控件:https://github.com/timdream/wordcloud2.js
效果还是非常赞的,该插件作者谦逊的说自己”可能“是最好的标签云插件,不过我个人认为可能这两个字完全可以去掉了,它就是最好的。
那么wordcloud2.js使用起来也非常简单,导入js文件后,按照官方文档使用即可,这里附上代码
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Demo</title>
- </head>
- <style>
- #container{
- width: 1000px;
- margin: 100px auto;
- border: 1px solid #ccc;
- }
- </style>
- <body>
- <h1>一般</h1>
- <div id="container" style="height: 500px;"></div>
- <!-- <h1>无数据</h1>
- <div id="container1" style="height: 400px;"></div> -->
- <script src="./wordcloud2.min.js"></script>
- <script>
- var wordFreqData = [['使用', 28, 114], ['Mac', 17, 107], ['Python', 15, 1], ['实现', 13, 121], ['python3.7', 13, 157], ['Django2.0', 12, 283], ['利用',11, 202], ['阿里', 10, 187], ['开发', 10, 230], ['关于', 10, 51], ['文件', 9, 215], ['基于', 9, 199], ['Centos7.6', 9, 455], ['配置', 9, 141], ['部署', 8, 323], ['Docker', 8, 479], ['系统', 8, 112], ['vue', 8, 425], ['异步', 8, 162], ['服务', 8, 356], ['安装', 7, 102], ['nginx', 7, 195], ['微信', 7, 707], ['程序', 7, 711], ['进行', 7, 381], ['问题', 7, 52], ['上传', 6, 171], ['mysql', 6, 86], ['以及', 6, 446], ['一个', 6, 14], ['响应', 5, 54], ['compose', 5, 685], ['python3', 5, 414], ['Django', 5, 219], ['搭建', 5, 514], ['性能', 5, 9], ['功能', 5, 119], ['环境', 5, 231], ['OS', 4, 123], ['遇到', 4, 4], ['检测', 4, 41], ['配合', 4, 200], ['redis', 4, 290], ['网站', 4, 324], ['页面', 4, 46], ['记录', 4, 27], ['Tornado', 4, 588], ['测试', 4, 377], ['接口', 4, 399], ['操作', 4, 31], ['js', 4, 207], ['前端', 4, 432], ['应用', 4, 78], ['centos', 4, 100], ['解决方案', 3, 35], ['登录', 3, 361], ['js2.6', 3, 464], ['项目', 3, 552], ['Flask', 3, 252], ['商城', 3, 341], ['实时', 3, 342], ['视频', 3, 471], ['面试', 3, 626], ['api', 3, 884], ['设计', 3, 58], ['打造', 3, 198], ['切换', 3, 155], ['分离', 3, 561], ['最新', 3, 64], ['如何', 3, 130], ['爬虫', 3, 45], ['结合', 3, 371], ['框架', 3, 26], ['自己', 3, 204], ['支付宝', 3, 397], ['布局', 3, 70], ['博客', 3, 186], ['模式', 3, 529], ['并且', 3, 190], ['支付', 3, 401], ['代码', 3, 15], ['Go', 2, 192], ['Linux', 2, 438], ['Lang', 2, 193], ['集成', 2, 410], ['Windows', 2, 439], ['ffmpeg', 2, 470],['全文检索', 2, 727], ['Redisearch', 2, 728], ['变量', 2, 39], ['celery', 2, 315], ['添加', 2, 343], ['Centos7', 2, 413], ['模块', 2, 21], ['各种', 2, 84], ['静态', 2, 197], ['跨域', 2, 284], ['读写', 2, 558], ['前后', 2, 700], ['自定义', 2, 794], ['存储', 2, 888],['Home', 2, 288], ['服务器', 2, 321], ['统一', 2, 701], ['github', 2, 23], ['Brew', 2, 289], ['FastDfs', 2, 513], ['管理', 2, 704], ['中文', 2, 87], ['版本', 2, 156], ['mpvue', 2, 706], ['方案', 2, 65], ['属于', 2, 201], ['文档', 2, 222], ['Tornado5.1', 2, 158], ['https', 2, 184], ['下载', 2, 223], ['方法', 2, 10], ['移动', 2, 69], ['引擎', 2, 92], ['不要', 2, 113], ['h5', 2, 329], ['并发', 2, 374], ['一下', 2, 28], ['Selenium', 2, 139], ['Rabbitmq3.7', 2, 160], ['插件', 2, 205], ['通过', 2, 226], ['Mongodb', 2, 297], ['删除', 2, 332], ['新版', 2, 398], ['excel', 2, 30], ['美多', 2, 335], ['集群', 2, 767], ['用来', 2, 13], ['适应', 2, 74], ['总结', 2, 303], ['压力', 2, 379], ['播放', 2, 490], ['上面', 2, 542], ['可用', 2, 770], ['技巧', 2, 98], ['js2.0', 2, 945], ['Scrapy', 2, 144], ['过程', 2, 191], ['http', 2, 209], ['推送', 2, 339], ['Supervisor', 2, 497], ['工具', 1, 16], ['之子', 1, 53], ['FLOAT', 1, 79], ['python2.7', 1, 101], ['Operation', 1, 145], ['快捷键', 1, 166], ['压缩', 1, 211], ['图形化', 1, 233], ['中文翻译', 1, 251], ['password', 1, 276], ['Score', 1, 307], ['客服', 1, 340], ['vscode', 1, 383], ['2019.04', 1, 406], ['监控', 1, 499], ['tree', 1, 599], ['localStorage', 1, 624], ['格式', 1, 649], ['个人', 1, 678], ['这样', 1, 725], ['mpvue1.0', 1, 780], ['双机', 1, 825], ['浏览器', 1, 857], ['加上', 1, 881], ['截说', 1, 919], ['云云', 1, 950], ['验证码', 1, 996], ['检查', 1, 17], ['显示', 1, 36], ['坍塌', 1, 80], ['预装', 1,122], ['permitted', 1, 146], ['五年', 1, 169], ['请求', 1, 212], ['git', 1, 234], ['YES', 1, 277], ['大名鼎鼎', 1, 308], ['密码', 1,362], ['中为', 1, 384], ['各类', 1, 501], ['master', 1, 555], ['前缀', 1, 600], ['弄清楚', 1, 625], ['电子书', 1, 650], ['协程', 1, 789], ['keepalived', 1, 828], ['从无到有', 1, 858], ['七牛云', 1, 883], ['简短', 1, 921], ['sublime3', 1, 957], ['百度', 1, 998], ['MySQLdb', 1, 19], ['成员', 1, 37], ['数目', 1, 55], ['原理', 1, 82], ['Anaconda', 1, 103], ['shell', 1, 148], ['Hugo', 1, 194], ['效率', 1, 213], ['界面', 1, 235], ['手册', 1, 253], ['进入', 1, 282], ['制度', 1, 309], ['记住', 1, 363], ['误报', 1, 386], ['Centos6', 1, 412], ['pip', 1, 440], ['uwsgi', 1, 506], ['slave', 1, 556], ['索引', 1, 601], ['10g', 1, 654], ['反向', 1, 696], ['原生', 1, 792],['热备', 1, 829], ['调试', 1, 859], ['阐述', 1, 922], ['win10', 1, 958], ['模拟', 1, 1001], ['import', 1, 2], ['autocommit', 1, 20],['元素', 1, 57], ['居中', 1, 83], ['东西', 1, 104], ['10.11', 1, 124], ['脚本', 1, 149], ['千万', 1, 173], ['推荐', 1, 236], ['虚拟环境', 1, 256], ['常用', 1, 364], ['专属', 1, 387], ['缓存', 1, 441], ['针对', 1, 472], ['负载', 1, 508], ['主从', 1, 557], ['原则', 1, 602], ['场景', 1, 627], ['50g', 1, 655], ['代理', 1, 697], ['交互', 1, 736], ['阻塞', 1, 793], ['上用', 1, 836], ['谷歌', 1, 860], ['切分', 1, 886], ['事务', 1, 923], ['vue2.0', 1, 960], ['镜像', 1, 1003], ['惨案', 1, 3], ['函数', 1, 40], ['发现', 1, 105], ['El', 1, 125], ['知识', 1, 151], ['涉及', 1, 174], ['减少', 1, 216], ['双撇号', 1, 238], ['之中', 1, 258], ['那些', 1, 317], ['通信', 1, 344], ['文本编辑', 1, 366], ['语法', 1, 388], ['节约', 1, 442], ['一些', 1, 475], ['均衡', 1, 510], ['联合', 1, 603], ['彻底', 1, 628],['1t', 1, 656], ['高性能', 1, 737], ['抓包', 1, 837], ['半小时', 1, 861], ['拍云', 1, 925], ['注册码', 1, 961], ['下载速度', 1, 1004], ['15', 1, 22], ['笔记', 1, 59], ['乱码', 1, 85], ['Capitan', 1, 126], ['共存', 1, 154], ['业务', 1, 175], ['提高', 1, 218], ['关键字', 1, 239], ['SQLAlchemy', 1, 261], ['主动', 1, 346], ['KindEditor', 1, 368], ['提醒', 1, 390], ['神坑', 1, 415], ['用以', 1, 444], ['直播', 1, 478], ['分布式文件系统', 1, 512], ['数据库', 1, 559], ['单元测试', 1, 608], ['区别', 1, 629], ['花式', 1, 657], ['虚假', 1, 743], ['CSS3', 1, 795], ['Charles', 1, 838], ['一款', 1, 862], ['扫码', 1, 893], ['cdn', 1, 926], ['破解', 1, 962], ['Homebrew',1, 1007], ['遍历', 1, 6], ['是否', 1, 42], ['适配', 1, 62], ['默认', 1, 109], ['升级', 1, 128], ['公司', 1, 177], ['保留', 1, 240], ['基础', 1, 264], ['win', 1, 348], ['4.1', 1, 369], ['防止', 1, 391], ['处理', 1, 416], ['空间', 1, 445], ['mock', 1, 609], ['架构图', 1, 631], ['读取', 1, 658], ['真实', 1, 744], ['暗黑', 1, 796], ['抓取', 1, 840], ['扩展', 1, 863], ['第三方', 1, 896], ['全网', 1, 927], ['2020', 1, 971], ['换成', 1, 1009], ['字典', 1, 7], ['py', 1, 24], ['存在', 1, 44], ['倒霉', 1, 110], ['dict', 1, 179], ['xlwt', 1, 220], ['对于', 1, 242], ['优酷', 1, 265], ['Process', 1, 350], ['11', 1, 370], ['2019', 1, 394], ['kindeditor4.11', 1, 419], ['rtmp', 1, 481], ['谈谈', 1, 566], ['cProfile', 1, 610], ['搞清楚', 1, 633], ['Authentication', 1, 664], ['容器', 1, 749], ['属性', 1,798], ['水印', 1, 841], ['关联', 1, 867], ['Picture', 1, 898], ['评测', 1, 928], ['攻略', 1, 972], ['国内', 1, 1011], ['对比', 1, 8], ['受欢迎', 1, 25], ['终端', 1, 88], ['最好', 1, 111], ['pytest', 1, 133], ['key', 1, 180], ['情况', 1, 243], ['大误', 1, 266], ['守护', 1, 291], ['协议', 1, 325], ['Worker', 1, 351], ['私钥', 1, 395], ['解决', 1, 423], ['3.7', 1, 448], ['推流', 1, 483], ['Hbuilder', 1, 524], ['优化', 1, 567], ['轻量', 1, 613], ['绘制', 1, 635], ['Basic', 1, 665], ['flex', 1, 754], ['celery4.1', 1, 804], ['高清', 1, 842], ['尝试', 1, 868], ['画中画', 1, 899], ['免费', 1, 929], ['机器人', 1, 974], ['增加', 1, 1012], ['转载', 1, 68], ['查看', 1, 89], ['setuptools', 1, 134], ['出现', 1, 244], ['几年', 1, 267], ['进程', 1, 293], ['Uploadify3.0', 1, 328], ['exited', 1, 352], ['ApacheBench', 1, 373], ['公钥', 1, 396], ['Alipay', 1, 449], ['Video', 1, 485], ['app', 1, 525], ['具体', 1, 570], ['Hexo', 1, 614],['怎样', 1, 636], ['Auth', 1, 666], ['弹性', 1, 757], ['封装', 1, 807], ['软件', 1, 844], ['公众', 1, 869], ['技术', 1, 907], ['加速', 1, 930], ['递归', 1, 978], ['禁止', 1, 47], ['wget', 1, 135], ['Celery3.1', 1, 159], ['解析', 1, 185], ['方式', 1, 225], ['弹指一挥间', 1, 245], ['Access', 1, 270], ['设置', 1, 294], ['exitcode', 1, 353], ['resource', 1, 427], ['refund', 1, 450], ['播放器', 1, 486], ['混合', 1, 528], ['Siege', 1, 573], ['高逼格', 1, 615], ['到底', 1, 637], ['Oauth2', 1, 667], ['9012', 1, 715], ['Sentinel', 1, 765], ['架构', 1, 808], ['手机', 1, 846], ['消息', 1, 874], ['opencv4.1', 1, 910], ['长期', 1, 932], ['层级', 1, 983], ['装逼', 1, 11], ['控件', 1, 48], ['sql', 1, 95], ['宴席', 1, 246], ['denied', 1, 271], ['duplicate', 1, 354], ['秒杀', 1, 375], ['绑定', 1, 429], ['退款', 1, 452], ['挂载', 1, 487], ['简易', 1, 617], ['支撑', 1, 638], ['jwt', 1, 668], ['Thrift', 1, 716], ['哨兵', 1, 766], ['面试题', 1, 811], ['体验版', 1, 847], ['live2d', 1, 875], ['人脸识别', 1, 911], ['Apache', 1, 936], ['组件', 1, 984], ['利器', 1, 12], ['选择器', 1, 49], ['异同', 1, 72], ['排序', 1, 96], ['vim', 1, 115], ['Webdriver', 1, 140], ['16', 1, 161], ['grunt', 1, 206], ['rails', 1, 228], ['不散', 1, 247], ['user', 1, 272], ['常用命令', 1, 302], ['下面', 1, 355], ['双向', 1, 431], ['分发', 1, 489], ['分布式', 1, 538], ['MindMaster', 1, 593], ['建立', 1, 618], ['互转', 1, 641], ['认证', 1, 669], ['RPC', 1, 717], ['Weui', 1, 813], ['openId', 1, 849], ['博君', 1, 876], ['人脸', 1, 912], ['httpd', 1, 937], ['无限', 1, 985], ['checkbox', 1, 50], ['查询', 1, 97], ['自动', 1, 118], ['迁移', 1, 188], ['感恩', 1, 248], ['root', 1, 273], ['websocket', 1, 337], ['生成', 1, 400], ['nginx1.16', 1, 456], ['导图', 1, 594], ['session', 1, 621], ['word', 1, 643], ['进化', 1, 670], ['拯救', 1, 720], ['题库', 1, 814], ['获取', 1, 850], ['挂件', 1,877], ['模型', 1, 913], ['上将', 1, 940], ['分类', 1, 986], ['中文字体', 1, 33], ['rem', 1, 75], ['报错', 1, 142], ['队列', 1, 163],['css', 1, 208], ['六年', 1, 249], ['localhost', 1, 274], ['等级分', 1, 304], ['聊天室', 1, 338], ['Iterm', 1, 359], ['机制', 1, 434], ['uwsgi2.0', 1, 457], ['网络', 1, 492], ['Jenkins', 1, 545], ['脑图', 1, 595], ['cookie', 1, 622], ['pdf', 1, 644], ['用户', 1, 671], ['传统', 1, 722], ['Motor', 1, 773], ['正式', 1, 819], ['不到', 1, 852], ['一晒', 1, 878], ['训练', 1, 914], ['结构', 1, 988], ['绘图', 1, 34], ['完成', 1, 120], ['任务', 1, 164], ['版本控制', 1, 232], ['没有', 1, 250], ['using', 1, 275], ['Elo', 1, 306], ['账号', 1, 360], ['语法错误', 1, 382], ['最新版', 1, 403], ['安装包', 1, 436], ['18', 1, 458], ['自动化', 1, 549], ['思维', 1, 596], ['sessionStorage', 1, 623], ['兼容', 1, 648], ['Pelican', 1, 673], ['需要', 1, 724], ['提高效率', 1, 777], ['发布', 1, 822], ['Chrome', 1, 856], ['动态', 1, 879], ['特征', 1, 915], ['七牛', 1, 948], ['ai', 1, 993]];
- var canvas = document.getElementById('container');
- var options = eval({
- "list": wordFreqData,
- "gridSize": 9, // 密集程度 数字越小越密集
- "word":'v3u',
- //"shape" : "pentagon",
- drawOutOfBound: false,
- fontWeight:700,
- maxRotation: 40 * Math.PI / 180,
- minRotation: -40 * Math.PI / 180,
- drawMask: false,
- "weightFactor": 1,
- "color": 'random-light', // 字体颜色 'random-dark' 或者 'random-light'
- "backgroundColor": 'black', // 背景颜色
- "rotateRatio": 1, // 字体倾斜(旋转)概率,1代表总是倾斜(旋转)
- click: function(item) {
- alert(item[0] + ': ' + item[2]);
- }
- });
- //生成
- WordCloud(canvas, options);
- </script>
- </body>
- </html>