新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python大数据新闻分析推荐系统:从爬虫到个性化推荐实战解析

发布时间:2026/9/30 7:58:15来源:尧图网络
Python大数据新闻分析推荐系统:从爬虫到个性化推荐实战解析
每年毕业季都有大量同学选“Python 大数据 推荐系统”这类题目说实话这类项目在网上不缺源码但大多数都是概念化的Demo跑起来不是缺数据就是逻辑断层。这个“python基于大数据的新闻分析推荐系统”的项目标题看着很常规实际做下来会发现它就像一个技术大杂烩数据采集、清洗、文本分析、推荐算法、可视化展示每一个环节都能单独拆成一门课。这篇内容我把这个项目从零到尾拆开讲清楚包括技术选型、架构分层、核心算法怎么落地、以及那些教程里不会写的坑准备做毕业设计或者想入门推荐系统的朋友可以直接照参考。它的核心作用就两个第一把杂乱无章的新闻文本整理成结构化数据分析出热点、分类、情感倾向这些有价值的信息第二根据用户的历史阅读行为推荐个性化新闻解决新闻平台“千人一面”的痛点。无论你是刚学完Python基础、想找一个完整实战项目的初学者还是正在选毕业设计题目的学生这个项目都可以当作一条很好的主线和练手场地。1. 项目整体设计与技术选型1.1 系统到底要解决什么问题很多人在看到“新闻分析推荐系统”这个标题时最容易犯的毛病是把核心精力全放在“推荐算法”上一上来就研究什么深度兴趣网络、Graph Embedding结果数据管道没搭好算法再好也是无米之炊。实际做下来你会发现这个系统的第一难点在数据第二难点在分析最后才是推荐。先明确需求新闻平台每天会产生海量内容用户不可能把所有新闻都读完所以系统要做的首先是“分析”新闻——比如自动把新闻分类为科技、财经、体育、娱乐等主题统计热点关键词的波动趋势判断新闻情感是正向还是负向然后才是“推荐”——根据用户的历史点击行为找到用户可能感兴趣的新闻推给他。生活化一点讲这个系统就像一个越来越懂你的老编辑刚开始他手里没你的任何资料只能把最热门的新闻推给你热度推荐看了几次你点击了哪些内容之后他摸清了你的兴趣方向基于内容的推荐再往后他发现和你口味相似的一群人都关注了某类新闻于是也推给你协同过滤推荐。这个演进过程其实就是整个推荐系统最经典的三层递进结构。1.2 架构分层与技术选型策略这个项目最忌讳的就是一开始就上重型架构。很多教程喜欢把系统画成五六台机器的集群图Hadoop、Spark、Kafka、Flink一字排开看起来非常唬人但真到你实际部署时光环境搭建就能劝退一半人。我的建议是遵循“能单机跑通再向集群平滑演进”的思路。我自己采用的架构是这样四层数据采集层用Scrapy框架加requests库定时抓取新闻把标题、正文、发布时间、来源、分类等字段落入MySQL。数据存储层MySQL作为业务库Hive作为离线分析的数据仓库适合对历史数据进行批量统计。数据分析层单机量级的统计用Pandas处理数据量大或者需要演示大数据能力时切换到Spark SQL跑同样的逻辑。推荐与展示层推荐引擎输出候选新闻列表Flask提供Restful API接口前端用ECharts做可视化面板。这套选型背后有一个很实际的逻辑Pandas处理百万行以内的DataFrame非常舒服代码写起来又短又直观而当数据量真正上了一定规模同样的清洗和统计逻辑用Spark SQL只改几个函数名就能迁移过去。先保证项目完整性再考虑规模扩展是这类综合项目最稳的推进策略。用户行为数据则统一记录到一张MySQL表字段包括用户ID、新闻ID、行为类型点击、点赞、收藏、行为时间。推荐系统每次计算时就从这个表里拉取最近一段时间的行为记录实时更新推荐结果。2. 新闻数据采集与清洗一篇新闻是如何变成结构化数据的2.1 新闻源选择和字段规格设计采集新闻之前最重要的不是写代码而是先确定数据源和数据结构。我在实际项目中选了三个新闻网站的不同频道作为采集对象覆盖科技、财经、体育、娱乐四类内容采集字段统一设计成下面这张表的结构字段名类型说明news_idvarchar新闻唯一标识直接用URL的MD5生成titlevarchar新闻标题contenttext新闻正文categoryvarchar新闻分类标签sourcevarchar新闻来源网站名称publish_timedatetime发布时间crawl_timedatetime采集时间click_countint阅读量部分网站可采集没有则置0用URL的MD5作为news_id是一种很实用的小技巧因为同一个网站同一篇文章的URL是固定的MD5结果天然去重比自增ID更可靠。采集时还要记录publish_time和crawl_time两个时间后面做热点趋势分析时publish_time决定新闻归属的时间窗口crawl_time用来监控采集延迟。2.2 爬虫实现与请求频率控制我第一版的采集器用的是requests加BeautifulSoup因为目标网站结构简单直连解析即可。后续发现要维护多个站点的解析规则代码越写越乱就升级到了Scrapy框架用Spider分离不同的解析逻辑。下面是requests版采集器的核心代码结构import requests from bs4 import BeautifulSoup headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept: text/html,application/xhtmlxml, Accept-Language: zh-CN,zh;q0.9, } def fetch_news_list(url): resp requests.get(url, headersheaders, timeout10) resp.encoding utf-8 soup BeautifulSoup(resp.text, lxml) news_items [] for item in soup.select(.news-item a): title item.get_text().strip() link item.get(href) if title and link.startswith(http): news_items.append({title: title, url: link}) return news_items这里需要重点说明两个容易踩坑的点。一是编码问题国内新闻站大部分是UTF-8但也有部分老站是GBK或GB2312写采集器时一定要先检查页面编码resp.encoding设置错了轻则乱码重则整篇正文解析失败。二是请求频率建议每次请求之间至少sleep 1秒到3秒不要对目标站点发起高并发采集一方面是不给对方服务器制造压力另一方面也是对自己IP负责采集就走正道、控制频率这本身就是工程上的最佳实践。爬虫写完后还有一个很必要的步骤叫“解析校验”。新闻网站的页面结构经常改版今天能抓到的标签明天可能就失效了。我的做法是把每次采集的HTML页面落一份到本地同时在日志里记录成功解析的条目数和失败数一旦异常波动就说明页面结构变了需要及时调整解析规则。2.3 数据清洗与Hive/Spark清洗实操采集下来的数据是“脏”的不能直接进入分析环节。清洗主要解决四类问题正文中包含HTML标签和广告噪声、发布时间格式不统一、部分字段缺失、以及同一新闻重复出现。先用Pandas做一套快速清洗代码如下import pandas as pd import re def clean_content(text): if not isinstance(text, str): return text re.sub(r[^], , text) # 去HTML标签 text re.sub(r\s, , text) # 合并空白 text re.sub(r.*?, , text) # 去括号内容 return text.strip() df pd.read_csv(news_raw.csv) df[content_clean] df[content].apply(clean_content) df df.dropna(subset[title, content_clean]) df[publish_time] pd.to_datetime(df[publish_time], errorscoerce) df df.drop_duplicates(subset[news_id])这一段看着简单里面有两个细节值得展开。第一re.sub去括号内容所采用的规则要谨慎新闻正文经常有“记者讯本报记者XXX”这种信息去括号可以去掉很多冗余但如果正文里有很多正常的括号内容这个规则就过于暴力。我的处理方式是只去掉以数字、地址、来源信息开头的括号而不是无差别清除。第二drop_duplicates用news_id但实际新闻站之间会互相转载同一篇文章可能标题一模一样却来自不同站点这时候news_id不同就漏掉了。所以我还会加一遍标题相似去重用编辑距离或SimHash摘要比对对重复转载做二次过滤。当数据规模上升到百万级之后Pandas的清洗逻辑就可以平滑切换到Spark SQL。同样逻辑的Hive SQL长这样INSERT OVERWRITE TABLE news_clean SELECT news_id, title, regexp_replace(content, [^], ) AS content_clean, category, source, CAST(publish_time AS TIMESTAMP) AS publish_time FROM news_raw WHERE title IS NOT NULL AND length(trim(content)) 50 GROUP BY news_id, title, category, source, publish_time;这里用length(trim(content)) 50作为过滤条件是因为真正的新闻正文至少应该在几十个字以上很多采集噪声其实是短的列表页摘要。这个阈值不是拍脑袋定的我统计过三万多条样本的正文长度分布发现小于50字的正文基本都无法用于后续分词和关键词提取。3. 新闻内容分析与特征提取从文本里挖出信息3.1 分词、停用词与TF-IDF关键词提取分析新闻文本第一步是做中文分词。中文不像英文有天然空格分隔必须用分词工具拆成词语序列。目前最实用的就是jieba分词代码量小、准确率可以接受加载专业词典后还能提升科技、财经词汇的切分效果。import jieba import jieba.analyse jieba.load_userdict(user_dict.txt) # 自定义领域词典 content df[content_clean].iloc[0] seg_list jieba.lcut(content) print(seg_list[:20]) # 使用TF-IDF算法提取关键词 keywords jieba.analyse.extract_tags(content, topK10, withWeightTrue) for word, weight in keywords: print(word, weight)停用词列表是必然要做的一步。“新闻”“记者”“报道”“今天”“我们”这类词出现频率极高但对区分新闻主题没有任何帮助。我收集了一个包含1200个中文常用停用词的列表分词后过滤停用词再进入下一步统计。这里要说一个很实际的经验过滤停用词的顺序非常重要一定要先分词再过滤而不是先按停用词切分文本否则会把“现代”切成“现”和“代”直接把词义干掉了。TF-IDF算法本身也很值得补一句TF词频衡量词在本篇新闻中的重要程度IDF逆文档频率衡量词在全语料中的区分度。某个词如果一个小时内出现在几百篇新闻里它的IDF值就会很低说明它已经成了大众词而不是特色词。jieba.analyse.extract_tags内部封装的就是这套逻辑用起来很简单但理解原理能帮你判断提取结果是否合理。3.2 新闻分类与主题聚类实战分类是推荐的基石。如果一条新闻连属于科技还是娱乐都不知道推荐系统就只能瞎猜。分类我的方案是两层第一层是基于配置词表的规则分类第二层是基于TF-IDF加KMeans的聚类自动补全。规则分类逻辑很直白我准备了一份每类50个关键词的词典例如“芯片”“算法”“人工智能”归到科技“股市”“基金”“银行”归到财经“进球”“联赛”“球员”归到体育。匹配到哪个分类词多就归到哪类。这份词典来自对历史数据的统计筛选不是拍脑袋写的。规则分类的优点是可解释性强但覆盖不全长尾新闻往往匹配不到任何分类。这时候就用聚类模型做兜底。from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.cluster import KMeans corpus df[content_clean].tolist() vectorizer TfidfVectorizer(max_features5000, stop_wordszh) X vectorizer.fit_transform(corpus) kmeans KMeans(n_clusters4, random_state42) df[cluster] kmeans.fit_predict(X)每篇文章变成一个5000维的稀疏向量KMeans聚类成4簇。聚类完成后不能直接拿簇编号当分类名还需要人工查看每簇的高权重词给簇打上语义标签。举个例子某一簇最高的几个词是“股票”“涨幅”“基金”“市场”那基本可以认定这簇对应财经类。这一步本质上是用无监督方法做预标注再交给人工审核确认。使用LDA主题模型还可以挖掘更深层的主题结构比如把“科技”进一步拆分成“芯片”“互联网”“新能源”等子话题。这个粒度对推荐系统尤其有帮助因为用户可能只对科技下的“芯片”感兴趣而不是所有科技新闻。3.3 情感分析与热点趋势统计新闻分析最后一个重要维度是情感。我用的是SnowNLP库它对简体中文文本能输出0到1之间的情感倾向分数越接近1代表越正向越接近0代表越负向。from snownlp import SnowNLP def get_sentiment(text): try: s SnowNLP(text) return s.sentiments except Exception: return 0.5 df[sentiment] df[content_clean].apply(lambda x: round(get_sentiment(x), 3))情感分析在新闻系统里有两个实际应用场景一个是对单条新闻判断自动打“正、负、中”标签推荐时可以把负面哀伤类新闻适当降权另一个是结合时间序列做热点事件的情感波动曲线比如某种金融新闻发布后的24小时内用户对相关报道的情绪是越来越乐观还是越来越悲观。这种时序上的分析结果不仅适合可视化展示也能丰富用户画像。热点趋势的计算相对简单把清洗后的新闻按publish_time按小时分组统计每个小时内各分类的新闻数量再叠加关键词语义匹配就能画出“某关键词的近7天热度折线图”。这类图表放在系统首页的可视化面板里非常加分。4. 推荐系统核心实现从“千人一面”到“千人千面”4.1 三种推荐策略的组合与切换逻辑整个项目最核心也最容易答非所问的部分就是推荐系统的实现。我最终采用组合策略原因是任何一种单算法都有明显短板热度推荐按点击量、发布时间、点赞数综合排序给新用户和新新闻兜底。基于内容的推荐根据新闻的TF-IDF特征向量计算和用户历史喜欢新闻的相似度推荐最相似的新闻。协同过滤推荐根据用户群体的行为交集实现个性化推荐可分为基于用户的UserCF和基于物品的ItemCF。实际推荐时遵循一个简单的优先级逻辑新用户没有行为数据走热度推荐老用户行为充足走混合推荐具体实现是内容推荐和协同过滤各占一定权重再叠加时间衰减因子。这里要提醒一个常见错误很多人做推荐系统时把精力都花在调算法上却忘了新闻推荐和电商、视频推荐最大的区别在于强时效性。三天前的新闻即使再热门对多数用户也已经没有价值了。所以所有推荐候选集最后都要过一道时间衰减我给每条新闻算一个基础热度分再乘以一个随时间指数衰减的系数import math from datetime import datetime def time_decay_score(base_score, publish_time, decay_lambda0.03): hours_age (datetime.now() - publish_time).total_seconds() / 3600 return base_score * math.exp(-decay_lambda * hours_age)这个decay_lambda取值0.03意味着新闻大约每23小时热度贡献就衰减一半这个半衰期对新闻场景来说比较合适。你可以根据自身场景调节如果做的是深度长文推荐半衰期可以拉长到两三天。4.2 UserCF与ItemCF的代码实现协同过滤的最小可运行版本并不复杂。先说UserCF的思路找到和你阅读历史最相似的一批用户把这些人喜欢而你还没看过的新闻推给你。用户间的相似度我用的是余弦相似度把用户看过哪些新闻看成向量。实际代码比很多教程写的更短import pandas as pd from sklearn.metrics.pairwise import cosine_similarity from scipy.sparse import csr_matrix # user_item表: uid, news_id, score user_item pd.read_sql(SELECT uid, news_id, score FROM user_behavior, engine) # 构建稀疏矩阵 uid_list user_item[uid].astype(category) nid_list user_item[news_id].astype(category) row uid_list.cat.codes.values col nid_list.cat.codes.values data user_item[score].values matrix csr_matrix((data, (row, col))) # 用户相似度矩阵 user_sim cosine_similarity(matrix) def recommend_by_users(uid, top_n20): uid_idx uid_list.cat.categories.get_loc(uid) sim_scores list(enumerate(user_sim[uid_idx])) sim_scores sorted(sim_scores, keylambda x: x[1], reverseTrue) candidate_scores {} for other_idx, sim in sim_scores[1:11]: if sim 0.3: continue # 取该用户看过的新闻按相似度加权 row_indices matrix.getrow(other_idx).indices for news_idx in row_indices: news_id nid_list.cat.categories[news_idx] candidate_scores[news_id] candidate_scores.get(news_id, 0) sim # 过滤用户已看的新闻 watched set(user_item[user_item[uid] uid][news_id]) candidates [(nid, s) for nid, s in candidate_scores.items() if nid not in watched] candidates.sort(keylambda x: x[1], reverseTrue) return [nid for nid, _ in candidates[:top_n]]ItemCF的逻辑则是反过来的统计两个新闻之间被多少用户共同看过新闻A和新闻B经常一起被同一批用户看那看过A的用户也适合推荐B。ItemCF的好处是新闻之间的相似度矩阵可以离线计算在线推荐时响应速度更快尤其适合新闻这种物品数量相对有限的场景。如果你只用Pandas做练习几千用户、几千新闻的矩阵乘法还能接受但一旦用户量上来全矩阵计算就吃不住了。这时候有两个优化方向一是用scipy的稀疏矩阵替代二维数组二是只选取和目标用户相似度最高的前N个用户去计算而不是遍历全体用户。后者叫近邻截断是工业界标配做法。4.3 冷启动问题的解决办法冷启动是推荐系统里绕不开的问题我在这项目里分新用户和新新闻两种情况处理。新用户没有行为记录UserCF和ItemCF都失效解决方案是走热度推荐。热度榜不能只用点击量排序我给出的综合热度公式是hot_score (click_count / max_click) * 0.5 (interact_count / max_interact) * 0.3 (1 / hours_age) * 0.2这里click_count用全站最大值做归一化交互量包括点赞和收藏时间因素直接用倒数的形式加入保证越新的新闻有机会排在前面。新新闻没有用户行为数据协同过滤也失效解决方案是走内容推荐。每条新闻入库后立刻做分词和TF-IDF向量化然后和用户历史上喜欢的新闻向量做余弦相似度计算相似度高就进入该类用户的候选池。换句话说系统不看用户有没有看过这篇新闻只看这篇新闻和他的历史口味像不像。在实际代码里新新闻的向量化可以在数据采集清洗管道中一并完成入库时就带上特征向量字段这样推荐引擎调用时直接取向量计算不用再临时处理文本。5. Flask后端与ECharts可视化让分析结果在浏览器里跑起来5.1 Flask API接口设计整个系统的后端我用Flask做的轻量级服务对外提供JSON格式的接口。前端和后端完全分离前端只负责发请求和画图后端只负责算数据和返回结果。核心接口列表如下接口路径方法功能说明/api/hotGET获取热度新闻排行榜/api/news/listGET分页获取新闻列表/api/recommendGET获取用户个性化推荐列表/api/trendsGET获取关键词或分类的热度趋势/api/user/actionPOST上报用户点击、点赞行为其中/api/user/action是推荐系统闭环的关键接口。前端在用户点击某条新闻时异步发送POST请求把行为数据写入MySQL下次计算推荐结果时这次点击就会影响推荐候选集的排序。没有这个闭环的推荐系统都是假的。一个接口的写法示例from flask import Flask, jsonify, request app Flask(__name__) app.route(/api/recommend, methods[GET]) def recommend(): uid request.args.get(uid, anonymous) rec_list get_recommendations(uid, top_n20) return jsonify({code: 0, data: rec_list}) app.route(/api/user/action, methods[POST]) def user_action(): data request.get_json() save_behavior(data[uid], data[news_id], data[action_type]) return jsonify({code: 0, msg: ok})接口设计有一个容易被忽略的细节所有时间字段在JSON返回时统一转换成字符串格式否则前端JavaScript拿到的会是时间戳处理起来容易出岔子。我自己是在Flask中自定义了一个JSONEncoder日期字段统一序列化为“YYYY-MM-DD HH:mm:ss”格式。5.2 ECharts可视化组件配置可视化面板我选择ECharts最大的原因是配置灵活、图表种类丰富、前端集成不用引太多依赖。我用到的图表组件包括词云图展示热点关键词、折线图展示热度趋势、饼图展示新闻分类占比、散点图展示情感与热度的交叉分布。词云图的配置有一点需要特别注意它不在ECharts官方包里要单独引echarts-wordcloud插件很多新手在这里卡住。配置的核心是data数组里放词和权重权重直接取TF-IDF值即可option { series: [{ type: wordCloud, gridSize: 10, sizeRange: [14, 60], rotationRange: [-45, 45], textStyle: { color: random }, data: keywordData // [{name: 芯片, value: 12.3}, ...] }] };热度趋势折线图更简单X轴是时间Y轴是新闻数量或关键词权重。注意要根据时间跨度动态调整聚合粒度如果数据只覆盖最近24小时按小时聚合如果覆盖最近30天按天聚合。粒度过细曲线噪声大粒度过粗看不出趋势变化。5.3 把推荐和可视化串成一个完整闭环前端页面我分了三个主要区域主页左侧是推荐列表中间是焦点新闻详情右侧是数据可视化面板。用户在左侧点击新闻后前端会同时做两件事展示新闻内容和发送行为上报请求。行为数据积累到一定量刷新推荐列表时会明显看到推荐内容向用户的兴趣点倾斜。实际上把推荐结果和可视化面板放在同一个页面有很大好处用户既能看内容又能直观看到系统对自己的分析结果。比如可视化面板里展示“你的兴趣标签科技 60%财经 25%体育 15%”这种透明化设计让推荐系统的“黑盒感”大大降低演示时也更容易得到认可。6. 部署、排查与性能优化实战中最头疼的部分6.1 Python环境与大数据集群部署策略这个项目要想顺利跑起来环境配置是第一个坎。先强调一个经验永远使用虚拟环境或Anaconda环境来隔离项目依赖不要一股脑把包装进系统Python环境里。我用的依赖清单大致是Flask、requests、scrapy、pandas、jieba、snownlp、scikit-learn、pymysql、pyecharts这些其中scikit-learn和pandas版本容易互相踩坑建议直接装Anaconda基础环境等于一套预装好的科学计算全家桶。IDE方面vscode或者pycharm都可以重点是把Python解释器路径指到你的虚拟环境不然就会出现“终端能跑、IDE里执行报ModuleNotFoundError”的经典问题。另一个常见的坑是MySQL连接编码pymysql连接时一定要加charsetutf8mb4否则存中文正文时容易报编码错误或者乱码。大数据环境这部分我的建议是“先演示后深挖”。本地跑通全流程用MySQL加Pandas完全足够如果你的题目要求体现大数据能力可以在Linux服务器上搭Hadoop伪分布式和Hive把新闻数据导入HDFS用Hive SQL做清洗和统计。伪分布式模式的意义是让你把整个大数据生态的流程走通从HDFS文件落地到MapReduce、再到Hive表查询。等你理解了伪分布式的运作机制再扩展到三节点集群就只有配置文件的差别了。集群部署策略记住一句话从单机伪分布式开始先跑通流程再横向扩展。6.2 常见问题排查速查表长时间跑这个项目我整理了最有代表性的几个坑问题现象可能原因排查与解决方案爬虫采集到大量空正文页面结构改版或正文标签选择器失效检查日志解析率更新选择器增加备用CSS选择器数据库中中文显示乱码MySQL表或连接未使用utf8mb4建表指定ENGINEInnoDB DEFAULT CHARSETutf8mb4pymysql连接加charset参数分词效果差专有名词被切碎缺少领域词典构造user_dict.txt加载自定义词或启用jieba的paddle模式推荐结果永远雷同没有冷启动策略候选集太窄增加热度推荐兜底加入时间衰减因子扩大候选召回数量协同过滤计算内存爆炸全矩阵相似度计算用稀疏矩阵存储改近邻截断只算TopN相似用户API响应慢无缓存且每次实时计算推荐结果离线预计算半小时刷新一次接口走Redis缓存其中“推荐结果永远雷同”是新手最容易遇到也最难自己发现的问题。它看似是算法效果差其实是推荐策略单一导致的用户A和用户B拿到的结果几乎一样因为热度榜的主导权太重。修正方式是给不同用户写入随机扰动因子同时保证候选池足够大至少200篇以上再做排序截断。6.3 性能优化的三板斧这个项目做到演示级别其实已经够了但如果想把性能再往上提一点优先做这三件事。第一MySQL加索引。用户行为表每天新增几万行数据查询“某用户最近一周行为”如果没有索引就是全表扫描加了(uid, action_time)联合索引后查询耗时能从秒级降到底部毫秒级。这条性价比极高适合最先做。第二推荐结果预计算。个性化推荐的核心计算全部离线跑每小时在后台任务里计算好每个用户的TopN列表并存入Redis在线接口只做读缓存操作。这样一来推荐接口的响应时间基本能稳定在10毫秒以内。第三文本特征向量化提前入库。每条新闻在采集清洗时就生成TF-IDF特征向量序列化存入数据库字段推荐引擎在线计算时直接读取反序列化不用重新分词重新向量化节省的算力非常可观。最后分享一点个人体会这个项目做完给我最大的感受是它最大的价值不在某个算法有多前沿而在于把一条数据管道从头到尾打通了。你既要会爬数据、洗数据又要会分析文本、构建特征还要懂推荐算法、做API、画图表每一项单独拿出来都不算难难的是让它们在一个系统里顺畅协作。很多问题只有真正动手才会遇到——比如Python环境版本冲突、MySQL编码折腾半天、ECharts词云组件加载不出来这些都是教程不会写但实际项目里一定会碰到的坎。我的建议是如果你正在做类似的项目不要急着追求复杂的算法先把数据管道跑通把推荐闭环走完再逐步优化各个模块。这个项目后续还可以扩展的方向也很多把离线统计升级成Spark Streaming实时计算把TF-IDF特征换成BERT语义向量加入用户画像标签体系或者把推荐结果做得精排和重排两阶段都是很不错的研究点。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

十款代码表白特效:单文件HTML爱心粒子与互动玩法合集 2026/9/30 10:39:29

十款代码表白特效:单文件HTML爱心粒子与互动玩法合集

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
联合互信息与三元互信息:I(X,Y;Z)和I(X;Y;Z)的区别详解 2026/9/30 10:39:29

联合互信息与三元互信息:I(X,Y;Z)和I(X;Y;Z)的区别详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
罗尔定理推论与辅助函数构造:考研中值定理证明题的核心思路 2026/9/30 10:39:28

罗尔定理推论与辅助函数构造:考研中值定理证明题的核心思路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
EMQX ACL实战:多租户MQTT权限控制、外部授权与排障 2026/9/30 10:39:22

EMQX ACL实战:多租户MQTT权限控制、外部授权与排障

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
网络安全保障方案拆解:从设计原则到落地配置 2026/9/30 10:39:22

网络安全保障方案拆解:从设计原则到落地配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
中科曙光服务器培训:从硬件到运维的避坑实操指南 2026/9/30 10:39:22

中科曙光服务器培训:从硬件到运维的避坑实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉