【人工智能】通過ChatGPT、Claude與通義千問 API 實現(xiàn)智能語料知識圖譜的自動化構(gòu)建(詳細(xì)教程)
什么是知識圖譜
知識圖譜(Knowledge Graph),在圖書情報界稱為知識域可視化或知識領(lǐng)域映射地圖,是顯示知識發(fā)展進(jìn)程與結(jié)構(gòu)關(guān)系的一系列各種不同的圖形,用可視化技術(shù)描述知識資源及其載體,挖掘、分析、構(gòu)建、繪制和顯示知識及它們之間的相互聯(lián)系。
環(huán)境與工具準(zhǔn)備
在開始之前,確保您具備以下環(huán)境和工具:
- 編程語言:Python(推薦3.7及以上版本)
- 開發(fā)環(huán)境:Jupyter Notebook 或任意代碼編輯器
- API 訪問權(quán)限:注冊并獲取ChatGPT、Claude與通義千問 API的訪問密鑰
- 必要的庫:
pip install openai
pip install faiss-cpu
pip install neo4j
pip install requests
文檔切分與預(yù)處理
數(shù)據(jù)來源與采集
構(gòu)建知識圖譜的第一步是數(shù)據(jù)收集。數(shù)據(jù)來源可以多種多樣,包括但不限于:
- 新聞文章
- 研究報告
- 數(shù)據(jù)庫記錄
- 社交媒體內(nèi)容
確保數(shù)據(jù)的多樣性和覆蓋面,以構(gòu)建全面且精確的知識圖譜。
文檔切分方法
大型文本需要被切分成更小的片段以便后續(xù)處理。利用ChatGPT API 或Claude API 進(jìn)行文檔切分是一種高效的方法。
示例代碼:
import openai
def split_document(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "請將以下文本切分為段落和句子,并標(biāo)記每個句子的起始和結(jié)束位置。"
}],
prompt=text
)
return response['choices'][0]['message']['content']
# 示例文本
document = "這是第一段。它包含幾個句子。這里是第二段。"
# 切分結(jié)果
split_text = split_document(document)
print(split_text)
數(shù)據(jù)清洗與標(biāo)準(zhǔn)化
在切分完成后,需要對數(shù)據(jù)進(jìn)行清洗與標(biāo)準(zhǔn)化處理,包括:
- 去除特殊符號
- 刪除重復(fù)數(shù)據(jù)
- 處理亂碼或不完整文本
示例代碼:
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)
基于文檔向量的聚類
向量化處理
將文本轉(zhuǎn)換為向量是實現(xiàn)文本相似度計算和聚類的基礎(chǔ)。通過ChatGPT API 或Claude API,可以使用內(nèi)置的嵌入模型將文本轉(zhuǎn)化為高維向量。
示例代碼:
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)
向量聚類技術(shù)
將文檔向量化后,可以利用聚類算法將相似的文檔歸類在一起。常用的聚類算法包括 K-Means 和 HDBSCAN。
聚類工具選擇與使用
FAISS 是一個高效的相似性搜索庫,適用于大規(guī)模向量數(shù)據(jù)的聚類。以下是使用 FAISS 進(jìn)行聚類的示例:
import faiss
import numpy as np
# 假設(shè) embeddings 是一個二維的 numpy 數(shù)組,每一行是一個向量
embeddings = np.array([embedding1, embedding2, ...]).astype('float32')
# 構(gòu)建索引
index = faiss.IndexFlatL2(embeddings.shape[1])
index.add(embeddings)
# 進(jìn)行聚類,比如使用 K-Means
k = 10 # 聚類數(shù)量
kmeans = faiss.Kmeans(embeddings.shape[1], k)
kmeans.train(embeddings)
clusters = kmeans.assignments
print(clusters)
通用知識圖譜語料庫構(gòu)建
實體識別
實體識別是知識圖譜構(gòu)建的基礎(chǔ)步驟,涉及從文本中提取出人名、地名、組織等實體。
示例代碼:
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)
關(guān)系抽取
關(guān)系抽取旨在識別實體之間的關(guān)系,例如“某人是某公司的CEO”。
示例代碼:
def extract_relations(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "從以下文本中提取實體之間的關(guān)系。"
}],
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日發(fā)布了新的智能手機(jī)產(chǎn)品。")
print(events)
垂直領(lǐng)域知識圖譜語料庫構(gòu)建
在特定領(lǐng)域構(gòu)建知識圖譜需要針對領(lǐng)域特定的實體和關(guān)系進(jìn)行識別和抽取。
領(lǐng)域特定實體與關(guān)系抽取
以醫(yī)療領(lǐng)域為例,需提取疾病、藥品、癥狀等專業(yè)實體,并識別它們之間的關(guān)系。
示例代碼:
def extract_medical_entities(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "請從以下醫(yī)療文本中提取所有專業(yè)實體(如疾病、藥品、癥狀等)及其關(guān)系。"
}],
prompt=text
)
return response['choices'][0]['message']['content']
medical_text = "患者張三被診斷出患有高血壓,醫(yī)生建議他服用降壓藥物阿莫洛爾。"
medical_entities = extract_medical_entities(medical_text)
print(medical_entities)
知識圖譜構(gòu)建工具
將提取的實體和關(guān)系存儲到知識圖譜中,可以使用Neo4j 等圖數(shù)據(jù)庫。
示例代碼:
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")
# 創(chuàng)建實體
kg.create_entity("張三", "Person")
kg.create_entity("高血壓", "Disease")
kg.create_entity("阿莫洛爾", "Drug")
# 創(chuàng)建關(guān)系
kg.create_relationship("張三", "患有", "高血壓")
kg.create_relationship("高血壓", "使用藥物", "阿莫洛爾")
kg.close()
輸入生成 Cypher 語料庫
Cypher 查詢語言簡介
Cypher 是 Neo4j 圖數(shù)據(jù)庫的查詢語言,類似于 SQL,用于創(chuàng)建、讀取、更新和刪除圖中的數(shù)據(jù)。
查詢生成方法
利用ChatGPT API 自動生成 Cypher 查詢,實現(xiàn)自然語言到查詢語言的轉(zhuǎn)換。
示例代碼:
def generate_cypher_query(description):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "根據(jù)以下描述生成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 是用于關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)查詢語言,用于管理和操作結(jié)構(gòu)化數(shù)據(jù)。
查詢生成方法
同樣利用ChatGPT API 生成符合需求的 SQL 查詢。
示例代碼:
def generate_sql_query(description):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "根據(jù)以下描述生成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 等大模型,可以更準(zhǔn)確地從文本中抽取實體。
示例代碼:
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)
關(guān)系抽取
同樣,通過大模型提高關(guān)系抽取的準(zhǔn)確性。
示例代碼:
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)
事件抽取
利用大模型識別復(fù)雜事件信息,增強(qiáng)知識圖譜的數(shù)據(jù)豐富性。
示例代碼:
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日發(fā)布了新的智能手機(jī)產(chǎn)品。")
print(events)
總結(jié)
本文詳細(xì)介紹了如何通過ChatGPT API、Claude API 和通義千問 API 實現(xiàn)文檔切分、實體識別、關(guān)系抽取、知識圖譜構(gòu)建及查詢生成的全流程自動化處理。通過結(jié)合多種先進(jìn)的自然語言處理技術(shù),可以大幅提高知識圖譜構(gòu)建的效率和準(zhǔn)確性,為企業(yè)和開發(fā)者提供強(qiáng)大的數(shù)據(jù)支持和智能分析能力。
本文轉(zhuǎn)載自??愛學(xué)習(xí)的蝌蚪??,作者:hpstream
