【人工智能】通過ChatGPT、Claude與通義千問 API 實現智能語料知識圖譜的自動化構建(詳細教程)
什么是知識圖譜
知識圖譜(Knowledge Graph),在圖書情報界稱為知識域可視化或知識領域映射地圖,是顯示知識發展進程與結構關系的一系列各種不同的圖形,用可視化技術描述知識資源及其載體,挖掘、分析、構建、繪制和顯示知識及它們之間的相互聯系。
環境與工具準備
在開始之前,確保您具備以下環境和工具:
- 編程語言:Python(推薦3.7及以上版本)
- 開發環境:Jupyter Notebook 或任意代碼編輯器
- API 訪問權限:注冊并獲取ChatGPT、Claude與通義千問 API的訪問密鑰
- 必要的庫:
pip install openai
pip install faiss-cpu
pip install neo4j
pip install requests
文檔切分與預處理
數據來源與采集
構建知識圖譜的第一步是數據收集。數據來源可以多種多樣,包括但不限于:
- 新聞文章
- 研究報告
- 數據庫記錄
- 社交媒體內容
確保數據的多樣性和覆蓋面,以構建全面且精確的知識圖譜。
文檔切分方法
大型文本需要被切分成更小的片段以便后續處理。利用ChatGPT API 或Claude API 進行文檔切分是一種高效的方法。
示例代碼:
import openai
def split_document(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "請將以下文本切分為段落和句子,并標記每個句子的起始和結束位置。"
}],
prompt=text
)
return response['choices'][0]['message']['content']
# 示例文本
document = "這是第一段。它包含幾個句子。這里是第二段。"
# 切分結果
split_text = split_document(document)
print(split_text)
數據清洗與標準化
在切分完成后,需要對數據進行清洗與標準化處理,包括:
- 去除特殊符號
- 刪除重復數據
- 處理亂碼或不完整文本
示例代碼:
import re
def clean_text(text):
# 移除特殊符號
text = re.sub(r'[^\w\s]', '', text)
# 去除多余的空格
text = re.sub(r'\s+', ' ', text).strip()
return text
cleaned_text = clean_text(split_text)
print(cleaned_text)
基于文檔向量的聚類
向量化處理
將文本轉換為向量是實現文本相似度計算和聚類的基礎。通過ChatGPT API 或Claude API,可以使用內置的嵌入模型將文本轉化為高維向量。
示例代碼:
def get_embeddings(text):
response = openai.Embedding.create(
model="text-embedding-ada-002",
input=text
)
return response['data'][0]['embedding']
embedding = get_embeddings("這是待處理的文本")
print(embedding)
向量聚類技術
將文檔向量化后,可以利用聚類算法將相似的文檔歸類在一起。常用的聚類算法包括 K-Means 和 HDBSCAN。
聚類工具選擇與使用
FAISS 是一個高效的相似性搜索庫,適用于大規模向量數據的聚類。以下是使用 FAISS 進行聚類的示例:
import faiss
import numpy as np
# 假設 embeddings 是一個二維的 numpy 數組,每一行是一個向量
embeddings = np.array([embedding1, embedding2, ...]).astype('float32')
# 構建索引
index = faiss.IndexFlatL2(embeddings.shape[1])
index.add(embeddings)
# 進行聚類,比如使用 K-Means
k = 10 # 聚類數量
kmeans = faiss.Kmeans(embeddings.shape[1], k)
kmeans.train(embeddings)
clusters = kmeans.assignments
print(clusters)
通用知識圖譜語料庫構建
實體識別
實體識別是知識圖譜構建的基礎步驟,涉及從文本中提取出人名、地名、組織等實體。
示例代碼:
def extract_entities(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "請從以下文本中提取所有實體(如人名、地點、公司等)。"
}],
prompt=text
)
return response['choices'][0]['message']['content']
text = "在2024年,張三成為了華為的CEO,他訪問了美國。"
entities = extract_entities(text)
print(entities)
關系抽取
關系抽取旨在識別實體之間的關系,例如“某人是某公司的CEO”。
示例代碼:
def extract_relations(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "從以下文本中提取實體之間的關系。"
}],
prompt=text
)
return response['choices'][0]['message']['content']
relations = extract_relations("張三是華為的CEO。")
print(relations)
事件抽取
事件抽取用于識別文本中的事件信息,如事件類型、時間、參與者等。
示例代碼:
def extract_events(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "從以下文本中提取事件信息,包括事件類型、時間和參與者。"
}],
prompt=text
)
return response['choices'][0]['message']['content']
events = extract_events("張三于2024年6月10日發布了新的智能手機產品。")
print(events)
垂直領域知識圖譜語料庫構建
在特定領域構建知識圖譜需要針對領域特定的實體和關系進行識別和抽取。
領域特定實體與關系抽取
以醫療領域為例,需提取疾病、藥品、癥狀等專業實體,并識別它們之間的關系。
示例代碼:
def extract_medical_entities(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "請從以下醫療文本中提取所有專業實體(如疾病、藥品、癥狀等)及其關系。"
}],
prompt=text
)
return response['choices'][0]['message']['content']
medical_text = "患者張三被診斷出患有高血壓,醫生建議他服用降壓藥物阿莫洛爾。"
medical_entities = extract_medical_entities(medical_text)
print(medical_entities)
知識圖譜構建工具
將提取的實體和關系存儲到知識圖譜中,可以使用Neo4j 等圖數據庫。
示例代碼:
from neo4j import GraphDatabase
class KnowledgeGraph:
def __init__(self, uri, user, password):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def close(self):
self.driver.close()
def create_entity(self, name, label):
with self.driver.session() as session:
session.run(f"MERGE (n:{label} {{name: $name}})", name=name)
def create_relationship(self, entity1, relation, entity2):
with self.driver.session() as session:
session.run(
f"MATCH (a), (b) WHERE a.name = $entity1 AND b.name = $entity2 "
f"MERGE (a)-[r:{relation}]->(b)",
entity1=entity1, entity2=entity2
)
# 連接到本地的Neo4j實例
kg = KnowledgeGraph("bolt://localhost:7687", "neo4j", "password")
# 創建實體
kg.create_entity("張三", "Person")
kg.create_entity("高血壓", "Disease")
kg.create_entity("阿莫洛爾", "Drug")
# 創建關系
kg.create_relationship("張三", "患有", "高血壓")
kg.create_relationship("高血壓", "使用藥物", "阿莫洛爾")
kg.close()
輸入生成 Cypher 語料庫
Cypher 查詢語言簡介
Cypher 是 Neo4j 圖數據庫的查詢語言,類似于 SQL,用于創建、讀取、更新和刪除圖中的數據。
查詢生成方法
利用ChatGPT API 自動生成 Cypher 查詢,實現自然語言到查詢語言的轉換。
示例代碼:
def generate_cypher_query(description):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "根據以下描述生成Cypher查詢語句。"
}],
prompt=f"查詢:{description}"
)
return response['choices'][0]['message']['content']
description = "找到所有屬于華為公司的員工。"
cypher_query = generate_cypher_query(description)
print(cypher_query)
生成的Cypher查詢示例:
MATCH (e:Employee)-[:WORKS_FOR]->(c:Company {name: "華為"}) RETURN e
輸入生成 SQL 語料庫
SQL 查詢語言簡介
SQL 是用于關系數據庫的標準查詢語言,用于管理和操作結構化數據。
查詢生成方法
同樣利用ChatGPT API 生成符合需求的 SQL 查詢。
示例代碼:
def generate_sql_query(description):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "根據以下描述生成SQL查詢語句。"
}],
prompt=f"查詢:{description}"
)
return response['choices'][0]['message']['content']
description = "獲取2020年銷售額大于100萬的訂單。"
sql_query = generate_sql_query(description)
print(sql_query)
生成的SQL查詢示例:
SELECT * FROM orders WHERE sales_amount > 1000000 AND YEAR(order_date) = 2020;
基于大模型的抽取
實體抽取
利用通義千問 API 等大模型,可以更準確地從文本中抽取實體。
示例代碼:
import requests
def extract_entities_via_tongyi(text):
api_url = "https://api.tongyi.aliyun.com/nlp/entity_extraction"
headers = {"Authorization": "Bearer YOUR_TONGYI_API_KEY"}
data = {"text": text}
response = requests.post(api_url, headers=headers, jsnotallow=data)
return response.json()
entities = extract_entities_via_tongyi("張三是華為的CEO。")
print(entities)
關系抽取
同樣,通過大模型提高關系抽取的準確性。
示例代碼:
def extract_relations_via_tongyi(text):
api_url = "https://api.tongyi.aliyun.com/nlp/relation_extraction"
headers = {"Authorization": "Bearer YOUR_TONGYI_API_KEY"}
data = {"text": text}
response = requests.post(api_url, headers=headers, jsnotallow=data)
return response.json()
relations = extract_relations_via_tongyi("張三是華為的CEO。")
print(relations)
事件抽取
利用大模型識別復雜事件信息,增強知識圖譜的數據豐富性。
示例代碼:
def extract_events_via_tongyi(text):
api_url = "https://api.tongyi.aliyun.com/nlp/event_extraction"
headers = {"Authorization": "Bearer YOUR_TONGYI_API_KEY"}
data = {"text": text}
response = requests.post(api_url, headers=headers, jsnotallow=data)
return response.json()
events = extract_events_via_tongyi("張三于2024年6月10日發布了新的智能手機產品。")
print(events)
總結
本文詳細介紹了如何通過ChatGPT API、Claude API 和通義千問 API 實現文檔切分、實體識別、關系抽取、知識圖譜構建及查詢生成的全流程自動化處理。通過結合多種先進的自然語言處理技術,可以大幅提高知識圖譜構建的效率和準確性,為企業和開發者提供強大的數據支持和智能分析能力。
本文轉載自??愛學習的蝌蚪??,作者:hpstream
