End-to-End從混沌到秩序:基于LLM的Pipeline將非結構化數據轉化為知識圖譜

摘要:本文介紹了一種將非結構化數據轉換為知識圖譜的端到端方法。通過使用大型語言模型(LLM)和一系列數據處理技術,我們能夠從原始文本中自動提取結構化的知識。這一過程包括文本分塊、LLM 提示設計、三元組提取、歸一化與去重,最終利用 NetworkX 和 ipycytoscape 構建并可視化知識圖譜。該方法不僅能夠高效地從文本中提取知識,還能通過交互式可視化幫助用戶更好地理解和分析數據。通過實驗,我們展示了該方法在處理復雜文本時的有效性和靈活性,為知識圖譜的自動化構建提供了新的思路。

?? 向所有學習者致敬!

“學習不是裝滿一桶水,而是點燃一把火。” —— 葉芝


我的博客主頁: https://lizheng.blog.csdn.net

?? 歡迎點擊加入AI人工智能社區!

?? 讓我們一起努力,共創AI未來! ??


從純文本構建知識圖譜是一項挑戰。它通常需要識別重要術語,弄清楚它們之間的關系,并使用自定義代碼或機器學習工具來提取這種結構。我們將創建一個由大型語言模型(LLM)驅動的端到端流水線,自動將原始文本轉換為交互式知識圖譜。
我們將使用幾個關鍵的 Python 庫來完成這項工作。讓我們先安裝它們。

# 安裝庫(只運行一次)pip install openai networkx "ipycytoscape>=1.3.1" ipywidgets pandas

安裝完成后,你可能需要重啟 Jupyter 內核或運行時,以便更改生效。

現在我們已經安裝好了,讓我們將所有內容導入到腳本中。

import openai             # 用于 LLM 交互
import json               # 用于解析 LLM 響應
import networkx as nx     # 用于創建和管理圖數據結構
import ipycytoscape       # 用于交互式筆記本中的圖可視化
import ipywidgets         # 用于交互式元素
import pandas as pd       # 用于以表格形式顯示數據
import os                 # 用于訪問環境變量(API 密鑰更安全)
import math               # 用于基本數學運算
import re                 # 用于基本文本清理(正則表達式)
import warnings           # 抑制潛在的棄用警告

完美!我們的工具箱已經準備好了。所有必要的庫都已加載到我們的環境中。

什么是知識圖譜?

想象一個網絡,有點像社交網絡,但除了人之外,它還連接事實和概念。這基本上就是一個知識圖譜(KG)。它有兩個主要部分:

  • 節點(或實體):這些是“事物”——比如“居里夫人”、“物理學”、“巴黎”、“諾貝爾獎”。在我們的項目中,我們提取的每個獨特的主語或賓語都將變成一個節點。
  • 邊(或關系):這些是事物之間的連接,顯示它們如何關聯。關鍵在于,這些連接有意義,并且通常有方向。例如:“居里夫人” — 獲得 → “諾貝爾獎”。其中的“獲得”部分是關系,定義了邊。

最簡單的知識圖譜示例

一個簡單的圖,顯示兩個節點(例如,“居里夫人”和“鐳”)通過一個標記為“發現”的有向邊連接。再添加一個小集群,如(“巴黎” — 位于 → “索邦大學”)。這可視化了節點-邊-節點的概念。

知識圖譜之所以強大,是因為它們以更接近我們思考連接的方式結構化信息,使我們更容易發現見解,甚至推斷出新的事實。

主語-謂語-賓語(SPO)三元組

那么,我們如何從純文本中獲取這些節點和邊呢?我們尋找簡單的事實陳述,通常以 主語-謂語-賓語(SPO) 三元組的形式出現。

  • 主語:事實是關于誰或什么的(例如,“居里夫人”)。將成為一個節點。
  • 謂語:連接主語和賓語的動作或關系(例如,“發現”)。將成為邊的標簽。
  • 賓語:主語相關的事物(例如,“鐳”)。將成為另一個節點。

示例:句子 “居里夫人發現了鐳” 完美地分解為三元組:(居里夫人, 發現, 鐳)。

這直接翻譯到我們的圖中:

  • (居里夫人) -[發現]-> (鐳)。

我們的 LLM 的工作就是讀取文本并為我們識別這些基本的 SPO 事實。

配置我們的 LLM 連接

要使用 LLM,我們需要告訴腳本如何與之通信。這意味著提供一個 API 密鑰,有時還需要一個特定的 API 端點(URL)。

我們將使用 NebiusAI LLM 的 API,但你可以使用 Ollama 或任何其他在 OpenAI 模塊下工作的 LLM 提供商。

# 如果使用標準 OpenAI
export OPENAI_API_KEY='your_openai_api_key_here'# 如果使用本地模型,如 Ollama
export OPENAI_API_KEY='ollama' # 對于 Ollama,可以是任何非空字符串
export OPENAI_API_BASE='http://localhost:11434/v1'# 如果使用其他提供商,如 Nebius AI
export OPENAI_API_KEY='your_provider_api_key_here'
export OPENAI_API_BASE='https://api.studio.nebius.com/v1/' # 示例 URL

首先,讓我們指定我們想要使用的 LLM 模型。這取決于你的 API 密鑰和端點可用的模型。

# --- 定義 LLM 模型 ---# 選擇在你的配置端點可用的模型。# 示例:'gpt-4o', 'gpt-3.5-turbo', 'llama3', 'mistral', 'deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct', 'gemma'llm_model_name = "deepseek-ai/DeepSeek-V3" # <-- **_ 更改為你使用的模型 _**

好的,我們已經記錄下了目標模型。現在,讓我們從之前設置的環境變量中獲取 API 密鑰和基礎 URL(如果需要)。

# --- 獲取憑據 ---api_key = os.getenv("OPENAI_API_KEY")
base_url = os.getenv("OPENAI_API_BASE") # 如果未設置,則為 None(例如,對于標準 OpenAI)

客戶端已準備好與 LLM 通信。

最后,讓我們設置一些控制 LLM 行為的參數:

  • 溫度:控制隨機性。較低的值意味著更專注、更確定性的輸出(適合事實提取!)。我們將溫度設置為 0.0,以實現最大的可預測性。
  • 最大令牌數:限制 LLM 響應的長度。
# --- 定義 LLM 調用參數 ---llm_temperature = 0.0 # 較低的溫度用于更確定性、事實性的輸出。0.0 是提取的最佳選擇。
llm_max_tokens = 4096 # LLM 響應的最大令牌數(根據模型限制調整)

定義我們的輸入文本(原材料)

現在,我們需要將要轉換為知識圖譜的文本。我們將使用居里夫人的傳記作為示例。

unstructured_text = """
Marie Curie, born Maria Sk?odowska in Warsaw, Poland, was a pioneering physicist and chemist.
She conducted groundbreaking research on radioactivity. Together with her husband, Pierre Curie,
she discovered the elements polonium and radium. Marie Curie was the first woman to win a Nobel Prize,
the first person and only woman to win the Nobel Prize twice, and the only person to win the Nobel Prize
in two different scientific fields. She won the Nobel Prize in Physics in 1903 with Pierre Curie
and Henri Becquerel. Later, she won the Nobel Prize in Chemistry in 1911 for her work on radium and
polonium. During World War I, she developed mobile radiography units, known as 'petites Curies',
to provide X-ray services to field hospitals. Marie Curie died in 1934 from aplastic anemia, likely
caused by her long-term exposure to radiation."""

讓我們打印出來,看看它的長度。

print("--- 輸入文本已加載 ---")
print(unstructured_text)
print("-" \* 25)# 基本統計信息可視化char_count = len(unstructured_text)
word_count = len(unstructured_text.split())
print(f"總字符數:{char_count}")
print(f"大約單詞數:{word_count}")
print("-" \* 25)#### 輸出結果 ####
--- 輸入文本已加載 ---
Marie Curie, born Maria Sk?odowska in Warsaw, Poland, was a pioneering physicist and chemist.
She conducted groundbreaking research on radioactivity. Together with her husband, Pierre Curie,# [... 文本其余部分在此打印 ...]includes not only her scientific discoveries but also her role in breaking gender barriers in academia
and science.-------------------------
總字符數:1995
大約單詞數:324---

所以,我們有大約 324 個單詞的居里夫人的文本,雖然在生產環境中不太理想,但足以看到知識圖譜構建的過程。

切分它:文本分塊

LLM 通常有一個處理文本的限制(它們的“上下文窗口”)。

我們的居里夫人文本相對較短,但對于更長的文檔,我們肯定需要將它們分解為更小的部分,或分塊。即使是這種文本,分塊有時也能幫助 LLM 更專注于特定部分。

我們將定義兩個參數:

  • 分塊大小:每個分塊中我們希望的最大單詞數。
  • 重疊:一個分塊的末尾與下一個分塊的開頭之間應該有多少單詞重疊。這種重疊有助于保留上下文,避免事實被尷尬地截斷在分塊之間。

文本分塊過程

我們的完整文本被劃分為三個重疊的段(分塊)。清晰標記“分塊 1”、“分塊 2”、“分塊 3”。突出顯示分塊 1 與 2 之間以及分塊 2 與 3 之間的重疊部分。標記“分塊大小”和“重疊大小”。

讓我們設置我們期望的大小和重疊。

# --- 分塊配置 ---chunk_size = 150 # 每個分塊的單詞數(根據需要調整)
overlap = 30 # 分塊之間的重疊單詞數(必須小于分塊大小)print(f"分塊大小設置為:{chunk_size} 單詞")
print(f"重疊設置為:{overlap} 單詞")# --- 基本驗證 ---
if overlap >= chunk_size and chunk_size > 0:
print(f"錯誤:重疊 ({overlap}) 必須小于分塊大小 ({chunk_size})。")
raise SystemExit("分塊配置錯誤。")
else:
print("分塊配置有效。")### 輸出結果 ###
分塊大小設置為:150 單詞
重疊設置為:30 單詞
分塊配置有效。

好的,計劃是將分塊大小設置為 150 個單詞,分塊之間的重疊為 30 個單詞。

首先,我們需要將文本拆分為單獨的單詞。

words = unstructured_text.split()
total_words = len(words)print(f"文本拆分為 {total_words} 個單詞。")# 顯示前 20 個單詞print(f"前 20 個單詞:{words[:20]}")### 輸出結果 ###
文本拆分為 324 個單詞。
前 20 個單詞:['Marie', 'Curie,', 'born', 'Maria', 'Sk?odowska', 'in',
'Warsaw,', 'Poland,', 'was', 'a', 'pioneering', 'physicist', 'and',
'chemist.', 'She', 'conducted', 'groundbreaking', 'research', 'on',
'radioactivity.']

輸出確認我們的文本有 324 個單詞,并顯示了前幾個單詞。現在,讓我們應用我們的分塊邏輯。

我們將逐步遍歷單詞列表,每次抓取 chunk_size 個單詞,然后回退 overlap 個單詞以開始下一個分塊。

chunks = []
start_index = 0
chunk_number = 1print(f"開始分塊過程...")
while start_index < total_words:end_index = min(start_index + chunk_size, total_words)chunk_text = " ".join(words[start_index:end_index])chunks.append({"text": chunk_text, "chunk_number": chunk_number})    # print(f"  Created chunk {chunk_number}: words {start_index} to {end_index-1}") # Uncomment for detailed log    # 計算下一個分塊的起始位置next_start_index = start_index + chunk_size - overlap    # 確保有進展if next_start_index <= start_index:if end_index == total_words:break # 已經處理了最后一部分next_start_index = start_index + 1    start_index = next_start_indexchunk_number += 1    # 安全中斷(可選)if chunk_number > total_words: # 簡單安全檢查print("警告:分塊循環超出總單詞數,中斷。")breakprint(f"\n文本成功拆分為 {len(chunks)} 個分塊。")#### 輸出結果 ####
開始分塊過程...文本成功拆分為 3 個分塊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79746.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Leetcode 3523. Make Array Non-decreasing

Leetcode 3523. Make Array Non-decreasing 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3523. Make Array Non-decreasing 1. 解題思路 這一題思路上來說就是一個棧的問題&#xff0c;就是從后往前依次考察每一個元素&#xff0c;顯然&#xff0c;當前位置要么被舍棄&…

探秘STM32如何成為現代科技的隱形引擎

STM32單片機原理與應用 前言&#xff1a;微型計算機的硅腦 在我們身邊的每一個智能設備中&#xff0c;都隱藏著一個小小的"硅腦"——單片機。它們體積微小&#xff0c;卻能執行復雜的運算和控制功能&#xff0c;就像是現代科技世界的"神經元"。STM32系列…

機制的作用

“機制”是一個廣泛使用的概念&#xff0c;其含義和應用范圍因領域而異。在不同的學科和實際應用中&#xff0c;機制有著不同的定義和功能。以下從幾個主要領域對“機制”進行詳細解釋&#xff1a; 一、自然科學中的機制 &#xff08;一&#xff09;物理學 定義 在物理學中&…

prim最小生成樹+最大生成樹【C++】板子題

什么是最小生成樹&#xff1f; 在一給定的無向圖G (V, E) 中&#xff0c;(u, v) 代表連接頂點 u 與頂點 v 的邊&#xff0c;而 w(u, v) 代表此的邊權重&#xff0c;若存在 T 為 E 的子集&#xff08;即&#xff09;且為無循環圖&#xff0c;使得的 w(T) 最小&#xff0c;則此 …

讀書筆記--MySQL索引

索引(在 MySQL 中也叫做“鍵(key)”)是存儲引擎用于快速找到記錄的一種數據結構。 索引對于良好的性能非常關鍵。尤其是當表中的數據量越來越大時&#xff0c;索引對性能的影響愈發重要。在數據量較小且負載較低時&#xff0c;不恰當的索引對性能的影響可能還不明顯&#xff0c…

VS Code 遠程連接服務器:Anaconda 環境與 Python/Jupyter 運行全指南。研0大模型學習(第六、第七天)

VS Code 遠程連接服務器&#xff1a;Anaconda 環境與 Python/Jupyter 運行全指南 在使用 VS Code 通過 SSH 遠程連接到服務器進行開發時&#xff0c;尤其是在進行深度學習等需要特定環境的工作時&#xff0c;正確配置和使用 Anaconda 環境以及理解不同的代碼運行方式非常關鍵。…

字節頭條golang二面

docker和云服務的區別 首先明確Docker的核心功能是容器化&#xff0c;它通過容器技術將應用程序及其依賴項打包在一起&#xff0c;確保應用在不同環境中能夠一致地運行。而云服務則是由第三方提供商通過互聯網提供的計算資源&#xff0c;例如計算能力、存儲、數據庫等。云服務…

數據結構和算法(七)--樹

一、樹 樹是我們計算機中非常重要的一種數據結構&#xff0c;同時使用樹這種數據結構&#xff0c;可以描述現實生活中的很多事物&#xff0c;例如家譜、單位的組織架構、等等。 樹是由n(n>1)個有限結點組成一個具有層次關系的集合。把它叫做"樹"是因為它看起來像一…

狀態管理最佳實踐:Provider使用技巧與源碼分析

狀態管理最佳實踐&#xff1a;Provider使用技巧與源碼分析 前言 Provider是Flutter官方推薦的狀態管理解決方案&#xff0c;它簡單易用且功能強大。本文將從實戰角度深入講解Provider的使用技巧和源碼實現原理&#xff0c;幫助你更好地在項目中應用Provider進行狀態管理。 基…

使用 NEAT 進化智能體解決 Gymnasium 強化學習環境

使用 NEAT 進化智能體解決 Gymnasium 強化學習環境 0. 前言1. 環境定義2. 配置 NEAT3. 解決強化學習問題小結系列鏈接0. 前言 在本節中,我們使用 NEAT 解決經典強化學習 (reinforcement learning, RL) Gym 問題。但需要注意的是,我們用于推導網絡和解決方程的方法不是 RL,而…

Pandas高級功能

在數據科學與機器學習的廣闊天地中&#xff0c;Pandas宛如一把瑞士軍刀&#xff0c;以其強大的數據處理和分析能力&#xff0c;成為眾多數據從業者的得力助手。從基礎的數據讀寫、清洗到復雜的數據聚合、轉換&#xff0c;Pandas的功能豐富多樣。本文將深入探索Pandas的一些高級…

英語學習4.15

amateur amateur &#x1f524; 讀音&#xff1a;/?m?t?r/ 或 /?m?t??r/ ? 詞性&#xff1a;名詞 / 形容詞 ? 中文釋義&#xff1a; &#xff08;名詞&#xff09;業余愛好者 ??&#x1f449; 指不是以此為職業的人&#xff0c;通常出于興趣而從事某項活動。 ??…

Java開發軟件

Main.java // 主類&#xff0c;用于測試學生管理系統 public class Main { public static void main(String[] args) { StudentManagementSystem sms new StudentManagementSystem(); // 添加學生 sms.addStudent(new Student(1, "Alice", 20)…

多Agent框架及協作機制詳解

文章目錄 一、多智能體系統介紹1.1 多智能體系統定義1.2 多智能體協作1.3 協作類型1.4 協作策略1.5 通信結構1.6 協調與編排 1.3 多智能體與單智能體對比1.4 應用場景 二、多Agent開發框架AutoGenMetaGPTLangGraphSwarmCrewAI 三、多智能體協作方式3.1 MetaGPT&#xff1a;SOP驅…

AI Agent破局:智能化與生態系統標準化的顛覆性融合!

Hi&#xff01;好久不見 云邊有個稻草人-個人主頁 熱門文章_云邊有個稻草人的博客-本篇文章所屬專欄~ 目錄 一、引言 二、AI Agent的基本概念 2.1 定義與分類 2.2 AI Agent的工作原理 2.3 示例代碼&#xff1a;AI Agent的基本實現 三、AI Agent在企業數字化轉型中的應用 …

在阿里云和樹莓派上編寫一個守護進程程序

目錄 一、阿里云郵件守護進程 1. 安裝必要庫 2. 創建郵件發送腳本 mail_daemon.py 3. 設置后臺運行 二、樹莓派串口守護進程 1. 啟用樹莓派串口 2. 安裝依賴庫 3. 創建串口輸出腳本 serial_daemon.py 4. 設置開機自啟 5. 使用串口助手接收 一、阿里云郵件守護進程 1.…

Python----深度學習(全連接與鏈式求導法則)

一、機器學習和深度學習的區別 機器學習&#xff1a;利用計算機、概率論、統計學等知識&#xff0c;輸入數據&#xff0c;讓計算機學會新知 識。機器學習的過程&#xff0c;就是訓練數據去優化目標函數。 深度學習&#xff1a;是一種特殊的機器學習&#xff0c;具有強大的能力和…

Python爬蟲實戰:獲取網易新聞數據

一、引言 隨著互聯網的飛速發展,網絡上蘊含著海量的信息資源。新聞數據作為其中的重要組成部分,對于輿情分析、市場研究、信息傳播等多個領域具有重要價值。網易新聞作為國內知名的新聞平臺,擁有豐富多樣的新聞內容。使用 Python 的 Scrapy 框架進行網易新聞數據的爬取,可…

matlab論文圖一的地形區域圖的球形展示Version_1

matlab論文圖一的地形區域圖的球形展示Version_1 圖片 此圖來源于&#xff1a; ![Jieqiong Zhou, Ziyin Wu, Dineng Zhao, Weibing Guan, Chao Zhu, Burg Flemming, Giant sand waves on the Taiwan Banks, southern Taiwan Strait: Distribution, morphometric relationship…

藍橋杯:連連看

本題大意要我們在一個給定的nxm的矩形數組中找出符合條件的格子 條件如下&#xff1a; 1.數值相同 2.兩個橫坐標和縱坐標的差值相等&#xff08;由此可得是一個對角線上的格子&#xff09; 那么根據以上條件我們可以用HashMap來解決這個問題&#xff0c;統計對角線上數值相同…