【AI大模型学习路线】第二阶段之RAG基础与架构——第十一章(【项目实战】基于RAG的新闻推荐)新闻数据的准备与整理 ?
【AI大模型学习路线】第二阶段之RAG基础与架构——第十一章(【项目实战】基于RAG的新闻推荐)新闻数据的准备与整理 ?
文章目录
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://fighting.blog.csdn.net/article/details/147526990
前言
- 在构建基于 RAG 的新闻推荐系统时,新闻数据的准备与整理贯穿整个流程,其质量直接影响检索召回和生成效果。
- 因此,需要从数据源选择、数据采集、清洗预处理、结构化与标注、切分与存储五个方面做好规划,并结合 Python 工具链实现自动化流水线。
- 以下将详细阐述各环节要点,并附上核心 Python 示例,以帮助快速搭建高效、可扩展的新闻数据处理框架。
1. 数据源选择与采集
首先,需要确定新闻数据的来源,包括开放新闻 API(如 NewsAPI、NYTimes API)、网站爬虫和第三方数据集等。
- 通过 NewsAPI 等接口可以获取带有元数据(标题、摘要、发布时间、来源站点等)的规范化 JSON 格式新闻流,便于后续解析和索引。
- 对于不提供 API 的网站,可使用 Scrapy、BeautifulSoup 等工具爬取网页,并抽取关键信息字段(正文、标签、作者、地理位置等)。
- 也可考虑公开数据集,如 Microsoft MIND、Kaggle 上的新闻聚合数据集,既包含大规模样本又有点击行为标注,便于后续用户建模。
2. 数据清洗与预处理
在获得原始新闻文本后,必须对其进行严格的清洗与预处理,以保证后续向量化和检索的准确性。常见步骤包含:
- 去重与去噪:剔除重复文章、广告和导航文本,保留正文主体。
- 处理缺失与异常值:对缺失字段(如缺省发布时间)进行填补,或根据规则丢弃严重不完整的条目。
- 文本标准化:统一字符编码、去除 HTML 标签和多余空白,保留中文或英文核心内容。
- 分词与停用词过滤:中文可用 Jieba,英文可用 NLTK,对短词、停用词进行过滤,提升语义表达质量。
3. 结构化与标注
为了让检索模块和生成模块更好地利用新闻内容,需要对数据进行结构化存储并添加必要标注:
- 字段提取:将新闻分为标题(title)、正文(content)、摘要(summary)、发布时间(publish_time)、标签(tags)等结构化字段。
- 分类与主题标注:利用已有分类模型或关键词规则,将新闻归入如“地震”、“疫情”、“经济”等主题类别,支持主题过滤。
- 质量评分:可引入源站点权威度、内容长度等指标,为后续检索排序提供额外维度。
4. 数据切分与版本管理
在研发和线上部署中,需对数据进行合理切分并做好版本管理:
- 时序切分:将数据按时间窗口拆分为训练集、验证集与测试集,避免未来信息泄露。
- 增量更新:利用 Apache Airflow 等调度工具,定时拉取新增新闻,增量清洗并追加到向量库。
- 数据版本控制:通过 DVC 或 Delta Lake 管理数据快照,便于回滚与审计。
5. 存储与检索索引
处理完成后,应将新闻文本和向量化后的 embedding 一并存储,并搭建检索引擎:
- 文本存储:推荐使用 MongoDB、Elasticsearch 存储结构化新闻文档,支持全文检索与元数据过滤。
- 向量索引:基于 FAISS 或 ChromaDB 构建新闻 embedding 索引,配置合适的向量维度与近邻搜索参数。
- 元数据同步:确保文本库与向量库同步更新,以免检索到过期或已删除的内容。
6. Python 自动化示例
以下示例展示了新闻数据的收集、清洗、分词、向量化及索引构建的流水线核心步骤:
import requests, json
from bs4 import BeautifulSoup
from langchain.embeddings import SentenceTransformerEmbedding
from langchain.vectorstores import FAISS
from jieba import lcut
from sklearn.model_selection import train_test_split
# 1. 新闻 API 采集(示例:NewsAPI)
api_key = "YOUR_NEWSAPI_KEY"
resp = requests.get(
f"https://newsapi.org/v2/everything?q=earthquake&language=zh&pageSize=100&apiKey={api_key}"
)
articles = resp.json().get("articles", [])
# 2. 数据清洗与结构化
cleaned = []
for art in articles:
title = art.get("title","").strip()
content = art.get("content","")
if not content: continue # 丢弃无正文条目
# 去除 HTML
soup = BeautifulSoup(content, "html.parser")
text = soup.get_text().replace("\n"," ").strip()
# 分词 & 停用词过滤(示例词表)
tokens = [w for w in lcut(text) if len(w)>1]
cleaned.append({"title": title, "content": text, "tokens": tokens, "time": art["publishedAt"]})
# 3. 时序切分
train, test = train_test_split(cleaned, test_size=0.2, shuffle=False)
# 4. 向量化与索引构建
embedder = SentenceTransformerEmbedding(model_name="all-MiniLM-L6-v2")
docs = [c["content"] for c in train]
vectors = embedder.embed_documents(docs)
faiss_index = FAISS.from_embeddings(vectors, docs)
# 5. 保存索引(磁盘持久化)
faiss_index.save_local("news_faiss_index")
print("新闻数据准备与索引构建完成,共处理文章:", len(docs))
- 本示例涵盖了从 API 采集、内容清洗、分词处理,到向量化与 FAISS 索引构建的核心流程,可据此扩展为完整的 ETL 作业,并结合调度系统实现全自动化。
通过上述步骤,即可搭建起高质量的新闻数据处理流水线,为基于 RAG 的推荐系统奠定坚实的数据基础,从而提升检索召回及生成质量,实现真正可用、可靠的智能新闻推荐。