1.背景
本qiang~本週在處理手頭專案工作的時候,遇到了一個問題,就是友方提供了一個公司名稱列表(量不小~,因此無法人工處理),且該公司名稱列表均為簡稱,需要與庫中的全稱做一個對映匹配。
看似簡單的一個需求,但傳統的技術手段貌似都無法派上用場,比如語義相似度,文字編輯距離等等。
因此本qiang花費了半天的時間思考並解決了該任務,遂將工作記錄如下,且本著開放共享,將核心原始碼進行公開,歡迎討論~
2.整體框架
其實,原理也非常簡單,由於本地資料庫缺乏公司的完整資訊,但可以藉助網際網路資源來搜尋公司的相關資訊,比如官網介紹、天眼查等來源,然後將檢索後的結果透過大模型自帶的推理能力輸出最終結果。
本文中使用的搜尋引擎是duckduckgo_search(需要kexue上網),大模型呼叫使用的duckduckgo_search內部整合的gpt-4o-mini(理論上只要能kexue上網,即可免費使用gpt-4o-mini)。
3. 效果展示
AutoX |
深圳安途智行科技有限公司 |
Cosmose |
翱覓苷(上海)資訊科技有限公司 |
Magic Data |
北京晴數智慧科技有限公司 |
Minimax |
名之夢(上海)科技有限公司 |
Momenta |
北京初速度科技有限公司 |
Testin雲測 |
北京雲測資訊科技有限公司 |
一流科技 |
一流科技有限公司 |
三六零 |
三六零安全科技股份有限公司 |
東傑智慧 |
東傑智慧科技集團股份有限公司 |
東軟 |
東軟集團股份有限公司 |
中心通訊 |
中興通訊股份有限公司 |
中科創達 |
中科創達軟體股份有限公司 |
中科曙光 |
曙光資訊產業股份有限公司 |
中科視拓 |
中科視拓(北京)科技有限公司 |
中譯語通 |
中譯語通科技股份有限公司 |
九四智慧 |
廣州九四智慧科技有限公司 |
九章雲極 |
北京九章雲極科技有限公司 |
雲天勵飛 |
深圳雲天勵飛技術股份有限公司 |
雲徙科技 |
廣州雲徙科技有限公司 |
亞信科技 |
亞信科技控股有限公司 |
4. 全部原始碼
由於呼叫檢索相對耗時,因此分為公司簡稱檢索和公司全稱提取兩個模組
4.1公司簡稱檢索
from duckduckgo_search import DDGS import json import time def save_datas(file_path, datas, json_flag=True, all_flag=False, with_indent=False, mode='w'): """儲存文字檔案""" with open(file_path, mode, encoding='utf-8') as f: if all_flag: if json_flag: f.write(json.dumps(datas, ensure_ascii=False, indent= 4 if with_indent else None)) else: f.write(''.join(datas)) else: for data in datas: if json_flag: f.write(json.dumps(data, ensure_ascii=False) + '\n') else: f.write(data + '\n') def search_companies(companies): results = [] for company in companies: if '公司' in company: results.append({ 'company': company, 'search_results': 'company' }) continue text = f'{company} 公司名全稱' search_results = None while search_results is None: try: search_results = DDGS().text(text, max_results=10) if search_results: break except Exception as e: print('sleep 2s') time.sleep(2) continue results.append({ 'company': company, 'search_results': search_results }) time.sleep(2) save_datas('data/公司簡稱檢索結果.json', results) def get_datas(file_path, json_flag=True, all_flag=False, mode='r'): """讀取文字檔案""" results = [] with open(file_path, mode, encoding='utf-8') as f: for line in f.readlines(): if json_flag: results.append(json.loads(line)) else: results.append(line.strip()) if all_flag: if json_flag: return json.loads(''.join(results)) else: return '\n'.join(results) return results if __name__ == '__main__': search_companies(get_datas('data/公司簡稱列表.txt', json_flag=False))
4.2公司全名提取
from duckduckgo_search import DDGS import json import time PROMPT = """你是一個助手,你的任務是基於輸入的公司名簡稱以及搜尋結果,分析並提取出公司名簡稱對應的公司名全稱。要求如下: 1. "簡稱"是公司名簡稱,"搜尋結果"是基於網際網路的搜尋後的資源,需要根據"簡稱"和"搜尋結果"進行分析,並輸出公司全稱,如果無法確認,請返回"無"; 2. 如果檢索結果不包含公司全稱,請基於你所學習的知識可以進一步判斷; 3. 輸出結果只包含公司名的全稱資訊,且只能包含一個,不需要輸出解釋資訊; 4. 輸入的公司名簡稱均是科技領域的知名公司,這點請注意; 示例: 簡稱: 京東 搜尋結果: 1. 京東(中國1998年創立的自營式電商企業)_百度百科\n京東(股票程式碼:jd),中國自營式電商企業,創始人劉強東初期擔任京東集團董事局主席兼執行長,2021年9月,徐雷獲任集團總裁。京東旗下設有京東商城、京東金融、拍拍網、京東智慧、o2o及海外事業部等。1998年6月18日,劉強東在 中關村成立京東公司。 2. 京東集團 - 維基百科,自由的百科全書\n東集團. 京東集團 (NASDAQ: JD 、 港交所: 9618 、 港交所: 89618 (人民幣結算)),前稱 360buy 和 京東商城,由劉強東於1998年6月18日創立,是一家總部位於 北京 的 中國 電子商務公司,主要為 B2C 模式的購物網站 。. 2014年,京東集團在 美國 納斯達克證券交易 ... 3. 京東集團股份有限公司 - 愛企查\n簡介: 京東集團股份有限公司(JD.com, Inc.)於2006年11月6日在在英屬維爾京群島註冊成立的公司,透過中國境內的子公司和VIE開展經營活動,公司總部位於北京。. 京東是專業的綜合性網上購物商城,是中國B2C市場最大的3C網購專業平臺,是中國電子商務領域最受 ... 輸出: 京東集團股份有限公司 現在,請按照要求完成: 簡稱: {company_name} 搜尋結果: {search_results} 輸出: """ def save_datas(file_path, datas, json_flag=True, all_flag=False, with_indent=False, mode='w'): """儲存文字檔案""" with open(file_path, mode, encoding='utf-8') as f: if all_flag: if json_flag: f.write(json.dumps(datas, ensure_ascii=False, indent= 4 if with_indent else None)) else: f.write(''.join(datas)) else: for data in datas: if json_flag: f.write(json.dumps(data, ensure_ascii=False) + '\n') else: f.write(data + '\n') def get_datas(file_path, json_flag=True, all_flag=False, mode='r'): """讀取文字檔案""" results = [] with open(file_path, mode, encoding='utf-8') as f: for line in f.readlines(): if json_flag: results.append(json.loads(line)) else: results.append(line.strip()) if all_flag: if json_flag: return json.loads(''.join(results)) else: return '\n'.join(results) return results def get_company_full_names(): results = [] for ele in get_datas('data/公司簡稱檢索結果.json'): company_name = ele['company'] search_results = ele['search_results'] if isinstance(search_results, str): results.append(f'{company_name}\t{company_name}') continue prompt = PROMPT.format(company_name=company_name, search_results=search_results) result = '' while result == '': try: result = DDGS().chat(prompt, model='gpt-4o-mini') if result.strip(): break except Exception as e: time.sleep(2) continue results.append(f'{company_name}\t{result}') save_datas('data/公司全稱提取結果.txt', results, json_flag=False) if __name__ == '__main__': get_company_full_names()
5.總結
一句話足矣~
開發了一款基於公司簡稱補全公司全稱的工具,包括具體的框架、實現原理以及完整原始碼,滿滿誠意,提供給各位看官。歡迎轉發、訂閱~有問題可以私信或留言溝通!
雖然需求比較簡單,且實現過程也比較簡單,但透過搜尋引擎搜素以及大模型的各種奇技淫巧,相信可以完成更加複雜且效果驚豔的專案。
有興趣的客官可以進行溝通合作,感謝~
6.參考
(1) Duckduckgo_search: https://github.com/deedy5/duckduckgo_search.git