Python調(diào)用本地大模型實(shí)現(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ī)則覆蓋不全的問題。
以下是實(shí)現(xiàn)方法和代碼:
實(shí)現(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)用模型。
實(shí)現(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ì)(公辦/民辦/不限)、院校類型(綜合/理工/師范/財(cái)經(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 "財(cái)經(jīng)" in output: properties["院校類型"] = "財(cái)經(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é)校'] # 使用實(shí)際的列名 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 = {} # 斷點(diǎn)保存文件 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ī)藥、師范、語言、財(cái)經(jīng)、政法、體育、藝術(shù)、民族、軍事、其他)," "院校特色(不限、985、211、雙一流、強(qiáng)基院校、101計(jì)劃、研究生院、保研資格、國重點(diǎn)、省重點(diǎn)、部委院校、省屬、省部共建、CE國防七子、五院四系、兩電一郵、八大美院、雙高計(jì)劃、高水平學(xué)校建設(shè)單位、高水平專業(yè)群建設(shè)單位、國家級示范、國家級骨干、現(xiàn)代學(xué)徒制試點(diǎn)學(xué)院、香港高財(cái)通)。" "例如返回格式:公辦, 理工, 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ì)": "不限", "院校類型": "不限", "院校特色": "不限"} # 定義所有可能的選項(xiàng) 院校性質(zhì)列表 = ["不限", "公辦", "民辦", "中外", "港澳合作院校", "新增院校", "非新增院校"] 院校類型列表 = ["不限", "綜合", "理工", "農(nóng)林", "醫(yī)藥", "師范", "語言", "財(cái)經(jīng)", "政法", "體育", "藝術(shù)", "民族", "軍事", "其他"] 院校特色列表 = ["不限", "985", "211", "雙一流", "強(qiáng)基院校", "101計(jì)劃", "研究生院", "保研資格", "國重點(diǎn)", "省重點(diǎn)", "部委院校", "省屬", "省部共建", "CE國防七子", "五院四系", "兩電一郵", "八大美院", "雙高計(jì)劃", "高水平學(xué)校建設(shè)單位", "高水平專業(yè)群建設(shè)單位", "國家級示范", "國家級骨干", "現(xiàn)代學(xué)徒制試點(diǎn)學(xué)院", "香港高財(cái)通"] # 拆分輸出(按逗號或頓號或空格分割) parts = re.split(r'[,,、\s]+', output) parts = [p.strip() for p in parts if p.strip()] # 嘗試匹配每個(gè)屬性 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 # 保存斷點(diǎn) 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"已保存斷點(diǎn),最后處理的行索引:{index}") # 加載斷點(diǎn) 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() # 加載斷點(diǎn) start_index, checkpoint_df = load_checkpoint() if checkpoint_df is not None: tx_df = checkpoint_df print(f"從斷點(diǎn)繼續(xù)執(zhí)行,最后處理的行索引:{start_index}") # 遍歷每一行,根據(jù)學(xué)校名稱填充屬性 for index, row in tx_df.iterrows(): if index < start_index: continue # 跳過已處理的行 school_name = row['學(xué)校'] # 使用實(shí)際的列名 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") # 刪除斷點(diǎn)文件 if os.path.exists(CHECKPOINT_FILE): os.remove(CHECKPOINT_FILE) print("斷點(diǎn)文件已刪除") 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
文件中。
用時(shí)1小時(shí)多完成3138條數(shù)據(jù)匹對
注意事項(xiàng)
模型調(diào)用速度:
調(diào)用本地模型可能需要一定時(shí)間,建議對大量數(shù)據(jù)時(shí)優(yōu)化調(diào)用邏輯或使用緩存機(jī)制。
模型輸出解析:
需要根據(jù)模型的實(shí)際輸出調(diào)整解析邏輯,確保提取的屬性準(zhǔn)確。
錯(cuò)誤處理:
如果模型調(diào)用失敗或輸出不符合預(yù)期,可以捕獲異常并填入默認(rèn)值。
到此這篇關(guān)于Python調(diào)用本地大模型實(shí)現(xiàn)Excel表格數(shù)據(jù)匹配與填充的文章就介紹到這了,更多相關(guān)Python Excel數(shù)據(jù)匹配與填充內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中l(wèi)en()函數(shù)用法使用示例
這篇文章主要介紹了Python中的len()函數(shù),包括其基礎(chǔ)用法、適用范圍、常見使用場景以及在第三方庫(如NumPy和pandas)中的應(yīng)用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03Python用threading實(shí)現(xiàn)多線程詳解
這篇文章主要給大家介紹了Python用threading實(shí)現(xiàn)多線程的方法示例,文中介紹的很詳細(xì),對大家具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-02-02使用Python生成200個(gè)激活碼的實(shí)現(xiàn)方法
這篇文章主要介紹了使用Python生成200個(gè)激活碼的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11