Python調(diào)用本地大模型實現(xiàn)Excel表格數(shù)據(jù)匹配與填充
環(huán)境
python3.10
ollama v0.6.1
問題描述
怎么使用python+本地大模型,根據(jù)tx.xlsx表格中B列學(xué)校對應(yīng)J列院校性質(zhì)、K列院校類型 L列院校特色,去xz.xlsx表格A列判斷并找到對應(yīng)A列院校性質(zhì)、B列院校類型 C列院校特色數(shù)據(jù)填入tx.xlsx表格中J、K、L單元格,示例:北京大學(xué) J列院校性質(zhì) 是公辦 K列院校類型 綜合類 L列院校特色985.


解決方案
利用本地部署的 Ollama 和 72B Qwen 大模型 這種方法可以通過自然語言處理(NLP)技術(shù),動態(tài)分析學(xué)校名稱并推斷其屬性,從而解決手動匹配和動態(tài)規(guī)則覆蓋不全的問題。
以下是實現(xiàn)方法和代碼:
實現(xiàn)思路
Ollama 和 Qwen 模型:
確保已經(jīng)在本地部署了 Ollama,并加載了 72B Qwen 大模型。
使用 Qwen 模型的文本生成能力,根據(jù)學(xué)校名稱推斷其屬性。
調(diào)用模型:
通過 API 或命令行調(diào)用 Ollama 的 Qwen 模型,輸入學(xué)校名稱,獲取模型生成的屬性描述。
解析模型輸出,提取院校性質(zhì)、院校類型和院校特色。
填充表格:
將模型推斷的結(jié)果填入 tx.xlsx 的 J、K、L 列。
緩存機(jī)制:
為了提高效率,可以將已經(jīng)匹配的學(xué)校名稱和屬性緩存起來,避免重復(fù)調(diào)用模型。
實現(xiàn)代碼
以下是完整的 Python 腳本:
import pandas as pd
import requests
import json
# Ollama API 地址
OLLAMA_API_URL = "http://192.168.208.123:11434/api/generate"
# 緩存已匹配的學(xué)校名稱和屬性
school_cache = {}
# 調(diào)用 Ollama API 推斷學(xué)校屬性
def infer_school_properties(school_name):
if school_name in school_cache:
return school_cache[school_name]
# 構(gòu)造提示詞
prompt = f"根據(jù)學(xué)校名稱推斷其屬性。學(xué)校名稱:{school_name}。請返回以下屬性:院校性質(zhì)(公辦/民辦/不限)、院校類型(綜合/理工/師范/財經(jīng)/醫(yī)藥/不限)、院校特色(985/211/雙一流/不限)。"
# 調(diào)用 Ollama API
try:
print(f"正在調(diào)用 Ollama API,學(xué)校名稱:{school_name}")
response = requests.post(
OLLAMA_API_URL,
json={
"model": "qwen2.5:72b",
"prompt": prompt,
"stream": False
},
timeout=10
)
response.raise_for_status()
output = response.json()["response"].strip()
print(f"API 返回結(jié)果:{output}")
except Exception as e:
print(f"調(diào)用 Ollama API 失?。簕e}")
return {"院校性質(zhì)": "不限", "院校類型": "不限", "院校特色": "不限"}
# 解析模型輸出
properties = {"院校性質(zhì)": "不限", "院校類型": "不限", "院校特色": "不限"}
if "公辦" in output:
properties["院校性質(zhì)"] = "公辦"
elif "民辦" in output:
properties["院校性質(zhì)"] = "民辦"
if "綜合" in output:
properties["院校類型"] = "綜合"
elif "理工" in output:
properties["院校類型"] = "理工"
elif "師范" in output:
properties["院校類型"] = "師范"
elif "財經(jīng)" in output:
properties["院校類型"] = "財經(jīng)"
elif "醫(yī)藥" in output:
properties["院校類型"] = "醫(yī)藥"
if "985" in output:
properties["院校特色"] = "985"
elif "211" in output:
properties["院校特色"] = "211"
elif "雙一流" in output:
properties["院校特色"] = "雙一流"
# 緩存結(jié)果
school_cache[school_name] = properties
return properties
# 讀取 tx.xlsx 文件
try:
print("正在讀取 tx.xlsx 文件")
tx_df = pd.read_excel('tx.xlsx')
print("成功讀取 tx.xlsx 文件")
print("列名:", tx_df.columns) # 打印列名
print(tx_df.head()) # 打印前幾行數(shù)據(jù)
except Exception as e:
print(f"讀取 tx.xlsx 文件失?。簕e}")
exit()
# 遍歷每一行,根據(jù)學(xué)校名稱填充屬性
for index, row in tx_df.iterrows():
school_name = row['學(xué)校'] # 使用實際的列名
print(f"正在處理學(xué)校:{school_name}")
properties = infer_school_properties(school_name)
tx_df.at[index, '院校性質(zhì)'] = properties["院校性質(zhì)"]
tx_df.at[index, '院校類型'] = properties["院校類型"]
tx_df.at[index, '院校特色'] = properties["院校特色"]
# 保存修改后的 tx.xlsx 文件
try:
print("正在保存文件")
tx_df.to_excel('tx_updated.xlsx', index=False)
print("數(shù)據(jù)處理完成,結(jié)果已保存到 tx_updated.xlsx")
except Exception as e:
print(f"保存文件失敗:{e}")
示例
輸入 tx.xlsx
| A | B | C | … | J | K | L |
|---|---|---|---|---|---|---|
| 1 | 北京大學(xué) | … | … | |||
| 2 | 清華大學(xué) | … | … | |||
| 3 | 未知學(xué)校 | … | … |
輸出 tx_updated.xlsx
| A | B | C | … | J | K | L |
|---|---|---|---|---|---|---|
| 1 | 北京大學(xué) | … | … | 公辦 | 綜合 | 985 |
| 2 | 清華大學(xué) | … | … | 公辦 | 理工 | 985 |
| 3 | 未知學(xué)校 | … | … | 不限 | 不限 | 不限 |
優(yōu)化后腳本:
import pandas as pd
import requests
import json
import os
import re
# 先安裝 debugpy:pip install debugpy
import debugpy
# 監(jiān)聽 5678 端口,等待IDE連接
#print("等待調(diào)試器 attach ...")
#debugpy.listen(("0.0.0.0", 5678))
#debugpy.wait_for_client()
#print("調(diào)試器已連接,可以執(zhí)行遠(yuǎn)程命令")
# Ollama API 地址
OLLAMA_API_URL = "http://192.168.2.103:11434/api/generate"
# 緩存已匹配的學(xué)校名稱和屬性
school_cache = {}
# 斷點保存文件
CHECKPOINT_FILE = "checkpoint.json"
# 調(diào)用 Ollama API 推斷學(xué)校屬性
def infer_school_properties(school_name):
if school_name in school_cache:
return school_cache[school_name]
# 構(gòu)造提示詞
prompt = (
f"根據(jù)學(xué)校名稱推斷其屬性。學(xué)校名稱:{school_name}。"
"請僅返回以下屬性(用中文逗號分隔):"
"院校性質(zhì)(不限、公辦、民辦、中外、港澳合作院校、新增院校、非新增院校),"
"院校類型(不限、綜合、理工、農(nóng)林、醫(yī)藥、師范、語言、財經(jīng)、政法、體育、藝術(shù)、民族、軍事、其他),"
"院校特色(不限、985、211、雙一流、強(qiáng)基院校、101計劃、研究生院、保研資格、國重點、省重點、部委院校、省屬、省部共建、CE國防七子、五院四系、兩電一郵、八大美院、雙高計劃、高水平學(xué)校建設(shè)單位、高水平專業(yè)群建設(shè)單位、國家級示范、國家級骨干、現(xiàn)代學(xué)徒制試點學(xué)院、香港高財通)。"
"例如返回格式:公辦, 理工, 985"
)
# 調(diào)用 Ollama API
try:
print(f"正在調(diào)用 Ollama API,學(xué)校名稱:{school_name}")
response = requests.post(
OLLAMA_API_URL,
json={
"model": "qwen2.5:72b",
"prompt": prompt,
"stream": False
},
timeout=10
)
response.raise_for_status()
output = response.json()["response"].strip()
print(f"API 返回結(jié)果:{output}")
except Exception as e:
print(f"調(diào)用 Ollama API 失?。簕e}")
return {"院校性質(zhì)": "不限", "院校類型": "不限", "院校特色": "不限"}
# 初始化默認(rèn)值
properties = {"院校性質(zhì)": "不限", "院校類型": "不限", "院校特色": "不限"}
# 定義所有可能的選項
院校性質(zhì)列表 = ["不限", "公辦", "民辦", "中外", "港澳合作院校", "新增院校", "非新增院校"]
院校類型列表 = ["不限", "綜合", "理工", "農(nóng)林", "醫(yī)藥", "師范", "語言", "財經(jīng)", "政法", "體育",
"藝術(shù)", "民族", "軍事", "其他"]
院校特色列表 = ["不限", "985", "211", "雙一流", "強(qiáng)基院校", "101計劃", "研究生院", "保研資格",
"國重點", "省重點", "部委院校", "省屬", "省部共建", "CE國防七子", "五院四系", "兩電一郵",
"八大美院", "雙高計劃", "高水平學(xué)校建設(shè)單位", "高水平專業(yè)群建設(shè)單位", "國家級示范",
"國家級骨干", "現(xiàn)代學(xué)徒制試點學(xué)院", "香港高財通"]
# 拆分輸出(按逗號或頓號或空格分割)
parts = re.split(r'[,,、\s]+', output)
parts = [p.strip() for p in parts if p.strip()]
# 嘗試匹配每個屬性
for p in parts:
if p in 院校性質(zhì)列表 and properties["院校性質(zhì)"] == "不限":
properties["院校性質(zhì)"] = p
elif p in 院校類型列表 and properties["院校類型"] == "不限":
properties["院校類型"] = p
elif p in 院校特色列表 and properties["院校特色"] == "不限":
properties["院校特色"] = p
# 緩存結(jié)果
school_cache[school_name] = properties
return properties
# 保存斷點
def save_checkpoint(index, df):
checkpoint = {
"last_index": index,
"data": df.to_dict(orient="records")
}
with open(CHECKPOINT_FILE, "w", encoding="utf-8") as f:
json.dump(checkpoint, f, ensure_ascii=False, indent=2)
print(f"已保存斷點,最后處理的行索引:{index}")
# 加載斷點
def load_checkpoint():
if os.path.exists(CHECKPOINT_FILE):
with open(CHECKPOINT_FILE, "r", encoding="utf-8") as f:
checkpoint = json.load(f)
return checkpoint["last_index"], pd.DataFrame(checkpoint["data"])
return 0, None
# 讀取 tx.xlsx 文件
try:
print("正在讀取 tx.xlsx 文件")
tx_df = pd.read_excel('tx.xlsx')
print("成功讀取 tx.xlsx 文件")
print("列名:", tx_df.columns) # 打印列名
print(tx_df.head()) # 打印前幾行數(shù)據(jù)
except Exception as e:
print(f"讀取 tx.xlsx 文件失?。簕e}")
exit()
# 加載斷點
start_index, checkpoint_df = load_checkpoint()
if checkpoint_df is not None:
tx_df = checkpoint_df
print(f"從斷點繼續(xù)執(zhí)行,最后處理的行索引:{start_index}")
# 遍歷每一行,根據(jù)學(xué)校名稱填充屬性
for index, row in tx_df.iterrows():
if index < start_index:
continue # 跳過已處理的行
school_name = row['學(xué)校'] # 使用實際的列名
print(f"正在處理學(xué)校:{school_name}")
properties = infer_school_properties(school_name)
tx_df.at[index, '院校性質(zhì)'] = properties["院校性質(zhì)"]
tx_df.at[index, '院校類型'] = properties["院校類型"]
tx_df.at[index, '院校特色'] = properties["院校特色"]
# 每處理 50 條保存一次
if (index + 1) % 50 == 0:
save_checkpoint(index, tx_df)
# 保存最終結(jié)果
try:
print("正在保存文件")
tx_df.to_excel('tx_updated.xlsx', index=False)
print("數(shù)據(jù)處理完成,結(jié)果已保存到 tx_updated.xlsx")
# 刪除斷點文件
if os.path.exists(CHECKPOINT_FILE):
os.remove(CHECKPOINT_FILE)
print("斷點文件已刪除")
except Exception as e:
print(f"保存文件失敗:{e}")
運(yùn)行腳本
確保已安裝 pandas 庫,并正確部署了 Ollama 和 Qwen 模型。
將腳本保存為 update_excel_with_ollama.py,并確保 tx.xlsx 文件與腳本在同一目錄下。
運(yùn)行腳本:
python update_excel_with_ollama.py
處理結(jié)果將保存到 tx_updated.xlsx 文件中。

用時1小時多完成3138條數(shù)據(jù)匹對

注意事項
模型調(diào)用速度:
調(diào)用本地模型可能需要一定時間,建議對大量數(shù)據(jù)時優(yōu)化調(diào)用邏輯或使用緩存機(jī)制。
模型輸出解析:
需要根據(jù)模型的實際輸出調(diào)整解析邏輯,確保提取的屬性準(zhǔn)確。
錯誤處理:
如果模型調(diào)用失敗或輸出不符合預(yù)期,可以捕獲異常并填入默認(rèn)值。
到此這篇關(guān)于Python調(diào)用本地大模型實現(xiàn)Excel表格數(shù)據(jù)匹配與填充的文章就介紹到這了,更多相關(guān)Python Excel數(shù)據(jù)匹配與填充內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)統(tǒng)計給定字符串中重復(fù)模式最高子串功能示例
這篇文章主要介紹了Python實現(xiàn)統(tǒng)計給定字符串中重復(fù)模式最高子串功能,涉及Python針對字符串的遍歷、排序、切片、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊列詳解(2)
這篇文章主要為大家詳細(xì)介紹了Python中的隊列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
python開發(fā)準(zhǔn)備工作之配置虛擬環(huán)境(非常重要)
這篇文章主要介紹了python開發(fā)準(zhǔn)備工作之配置虛擬環(huán)境(非常重要),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
Python中map,reduce,filter和sorted函數(shù)的使用方法
這篇文章主要介紹了Python中map,reduce,filter和sorted函數(shù)的使用方法,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08
Python利用Streamlit構(gòu)建一個簡單的照片墻應(yīng)用
在現(xiàn)代 web 開發(fā)中,快速構(gòu)建交互式應(yīng)用是一項重要的技能,Streamlit 是一個強(qiáng)大的 Python 庫,允許開發(fā)者以最小的代碼量創(chuàng)建美觀且功能豐富的 web 應(yīng)用,今天,我們將通過分析一段簡單的 Streamlit 代碼,展示如何構(gòu)建一個照片墻應(yīng)用,需要的朋友可以參考下2025-04-04

