使用Langchain加载和分析新闻文章

在现代数据驱动的世界中,能够有效地从网络上获取和处理信息对于许多应用场景都是至关重要的。本文将深入探讨如何使用Langchain库中的NewsURLLoader从一组URL中加载HTML新闻文章,并进行下游数据处理。

技术背景介绍

在自然语言处理(NLP)工作流中,尤其是在需要处理来自网络的文章时,将HTML格式的文本解析并转换为机器可读的文档格式是一个常见的步骤。Langchain提供的NewsURLLoader工具能够轻松实现这一目标。它不仅可以将HTML内容转换为结构化数据,还能够利用NLP技术提取关键词和生成文章摘要。

核心原理解析

NewsURLLoader是Langchain库中的组件,它负责从指定的网页URL加载新闻内容并转换为结构化的文档。它提供便利的选项来进行NLP分析,比如关键词提取和摘要生成。这些功能对于下游的机器学习或数据分析任务尤为重要,因为它们能够大大减少手动数据处理的工作量。

代码实现演示

以下是一个如何使用NewsURLLoader加载新闻文章的完整示例:

from langchain_community.document_loaders import NewsURLLoader

# 定义要加载的URL列表
urls = [
    "https://www.bbc.com/news/world-us-canada-66388172",
    "https://www.bbc.com/news/entertainment-arts-66384971",
]

# 初始化加载器并加载数据
loader = NewsURLLoader(urls=urls)
data = loader.load()

# 打印加载的第一篇和第二篇文章的内容
print("第一篇文章: ", data[0])
print("\n第二篇文章: ", data[1])

# 使用nlp=True进行NLP分析以生成关键词和摘要
loader = NewsURLLoader(urls=urls, nlp=True)
data = loader.load()

# 打印第一篇文章的关键词和摘要
print("第一篇文章关键词: ", data[0].metadata["keywords"])
print("第一篇文章摘要: ", data[0].metadata["summary"])

应用场景分析

  1. 新闻聚合与分析:可以用于构建自动化的新闻聚合服务,能够从多个新闻来源抓取最新文章,并进行内容分析。
  2. 舆情监测:通过关键词提取和摘要生成来跟踪和分析社会舆情,尤其是在社交媒体内容繁杂的情况下。
  3. 学术研究:对大量新闻数据进行分析,以研究媒体报道趋势、内容情绪分析等。

实践建议

  • API访问稳定性:在使用过程中建议选择国内稳定访问的API服务,以避免由于网络问题导致的数据加载失败。
  • 数据清洗与预处理:在进行下游处理之前,可以进一步对加载的数据进行清洗和预处理,以提高模型训练或分析的准确性。

结束语:如果遇到问题欢迎在评论区交流。
—END—

从你提供的最新日志来看,你的脚本已经 **成功加载了 Embedding 模型**,并且进入了 `FAISS.from_documents(...)` 的构建阶段。 --- ## 🕒 当前状态分析 | 阶段 | 状态 | |------|------| | 数据获取 | ✅ 成功(226 条) | | 数据预处理 | ✅ 成功(177 条有效文档) | | Embedding 模型加载 | ✅ 成功(虽然有 warning,但模型已加载) | | FAISS 构建 | ⏳ 进行中(当前卡在这里) | --- ## 🔍 为什么看起来“卡住”? 你在日志中看到: ``` INFO - 🏗️ 正在构建 FAISS 向量数据库... ``` 这说明程序正在执行: ```python vectorstore = FAISS.from_documents(documents, embeddings) ``` 这个函数会做以下事情: 1. 对每条 `document.page_content` 调用 `embeddings.embed_query(...)`; 2. 将向量插入 FAISS 索引; 3. 构建文档存储 ID 映射; ### ❗ 问题原因 - **模型较大**:你使用的是 `text2vec-large-chinese`,这是一个基于 BERT 的大模型,embedding 推理较慢; - **设备是 CPU**:Windows 默认使用 CPU,推理速度远低于 GPU; - **无进度提示**:`FAISS.from_documents(...)` 不提供内部进度反馈; - **数据量适中但仍有延迟**:177 条文档 × embedding 推理时间 ≈ 几十秒甚至更久; --- ## ✅ 解决方案:手动拆分并添加进度提示 我们可以在调用 `FAISS.from_documents(...)` 之前,先手动计算所有文档的 embedding,并加上 tqdm 进度条。这样你可以看到是否真的“卡死”。 ### ✅ 改进后的代码片段如下: ```python from langchain_community.docstore.in_memory import InMemoryDocstore import faiss import numpy as np def build_vector_store(): """构建 FAISS 向量数据库""" if os.path.exists(os.path.join(VECTOR_STORE_PATH, "index.faiss")): logger.warning("⚠️ FAISS 索引已存在,跳过构建") return try: logger.info("📥 正在从数据库获取新闻文章...") df = get_news_articles() if df.empty: logger.error("❌ 没有从数据库中获取到任何数据。") return logger.info(f"✅ 成功获取 {len(df)} 条记录") documents = preprocess_data(df) if not documents: logger.error("❌ 过滤后没有可用文本内容,无法构建向量库。") return logger.info("🧠 加载 Embedding 模型...") embeddings = load_embedding_model() logger.info("🏗️ 正在构建 FAISS 向量数据库...") # 手动计算 embedding 并添加进度条 texts = [doc.page_content for doc in documents] logger.info(f"🧠 开始计算 {len(texts)} 条文档的 Embedding...") embeddings_list = [] for i in tqdm(range(len(texts)), desc="🔄 计算 Embedding"): text = texts[i] embedding = embeddings.embed_query(text) embeddings_list.append(embedding) logger.info("✅ Embedding 计算完成,开始构建 FAISS 索引...") # 构建 FAISS 索引 dimension = len(embeddings_list[0]) index = faiss.IndexFlatL2(dimension) # 使用 L2 距离 vectors = np.array(embeddings_list).astype('float32') index.add(vectors) # 创建 docstore id 映射 ids = [str(i) for i in range(len(documents))] docstore = InMemoryDocstore({ids[i]: documents[i] for i in range(len(documents))}) vectorstore = FAISS( embedding_function=embeddings, index=index, docstore=docstore, index_to_docstore_id=ids ) logger.info(f"💾 正在保存 FAISS 向量数据库到 {VECTOR_STORE_PATH} ...") os.makedirs(VECTOR_STORE_PATH, exist_ok=True) vectorstore.save_local(VECTOR_STORE_PATH) logger.info("🎉 向量数据库构建完成并已保存!") except Exception as e: logger.error(f"❌ 构建向量数据库时出错: {e}", exc_info=True) ``` --- ## ✅ 总结建议 | 问题 | 建议 | |------|------| | 构建过程无进度 | 手动计算 embedding 并加 tqdm 进度条 | | CPU 太慢 | 如果有条件,换为 GPU 设备加速 | | 模型太大 | 可尝试使用 `text2vec-base-chinese` 替代 | | 单次构建耗时太久 | 拆分成多个小批次构建、增量更新 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值