1.背景
本qiang~本周在處理手頭項目工作的時候,遇到了一個問題,就是友方提供了一個公司名稱列表(量不小~,因此無法人工處理),且該公司名稱列表均為簡稱,需要與庫中的全稱做一個映射匹配。
看似簡單的一個需求,但傳統(tǒng)的技術(shù)手段貌似都無法派上用場,比如語義相似度,文本編輯距離等等。
因此本qiang花費了半天的時間思考并解決了該任務(wù),遂將工作記錄如下,且本著開放共享,將核心源碼進行公開,歡迎討論~
2.整體框架

其實,原理也非常簡單,由于本地數(shù)據(jù)庫缺乏公司的完整信息,但可以借助互聯(lián)網(wǎng)資源來搜索公司的相關(guān)信息,比如官網(wǎng)介紹、天眼查等來源,然后將檢索后的結(jié)果通過大模型自帶的推理能力輸出最終結(jié)果。
本文中使用的搜索引擎是duckduckgo_search(需要kexue上網(wǎng)),大模型調(diào)用使用的duckduckgo_search內(nèi)部集成的gpt-4o-mini(理論上只要能kexue上網(wǎng),即可免費使用gpt-4o-mini)。
3. 效果展示

4.?全部源碼
由于調(diào)用檢索相對耗時,因此分為公司簡稱檢索和公司全稱提取兩個模塊
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/公司簡稱檢索結(jié)果.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 = """你是一個助手,你的任務(wù)是基于輸入的公司名簡稱以及搜索結(jié)果,分析并提取出公司名簡稱對應(yīng)的公司名全稱。要求如下:
1. "簡稱"是公司名簡稱,"搜索結(jié)果"是基于互聯(lián)網(wǎng)的搜索后的資源,需要根據(jù)"簡稱"和"搜索結(jié)果"進行分析,并輸出公司全稱,如果無法確認(rèn),請返回"無";
2.如果檢索結(jié)果不包含公司全稱,請基于你所學(xué)習(xí)的知識可以進一步判斷;
3.輸出結(jié)果只包含公司名的全稱信息,且只能包含一個,不需要輸出解釋信息;
4.輸入的公司名簡稱均是科技領(lǐng)域的知名公司,這點請注意;
示例:
簡稱:京東
搜索結(jié)果:
1.京東(中國1998年創(chuàng)立的自營式電商企業(yè))_百度百科\n京東(股票代碼:jd),中國自營式電商企業(yè),創(chuàng)始人劉強東初期擔(dān)任京東集團董事局主席兼首席執(zhí)行官,2021年9月,徐雷獲任集團總裁。京東旗下設(shè)有京東商城、京東金融、拍拍網(wǎng)、京東智能、o2o及海外事業(yè)部等。1998年6月18日,劉強東在 中關(guān)村成立京東公司。
2.京東集團 - 維基百科,自由的百科全書\n東集團. 京東集團 (NASDAQ: JD 、 港交所: 9618 、 港交所: 89618 (人民幣結(jié)算)),前稱 360buy 和 京東商城,由劉強東于1998年6月18日創(chuàng)立,是一家總部位于 北京 的 中國 電子商務(wù)公司,主要為 B2C 模式的購物網(wǎng)站 。. 2014年,京東集團在 美國 納斯達克證券交易 ...
3.京東集團股份有限公司 - 愛企查\n簡介: 京東集團股份有限公司(JD.com, Inc.)于2006年11月6日在在英屬維爾京群島注冊成立的公司,通過中國境內(nèi)的子公司和VIE開展經(jīng)營活動,公司總部位于北京。. 京東是專業(yè)的綜合性網(wǎng)上購物商城,是中國B2C市場最大的3C網(wǎng)購專業(yè)平臺,是中國電子商務(wù)領(lǐng)域最受 ...
輸出:京東集團股份有限公司
現(xiàn)在,請按照要求完成:
簡稱: {company_name}
搜索結(jié)果: {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/公司簡稱檢索結(jié)果.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/公司全稱提取結(jié)果.txt', results, json_flag=False)
if __name__ == '__main__':
????get_company_full_names()
5.總結(jié)
一句話足矣~
開發(fā)了一款基于公司簡稱補全公司全稱的工具,包括具體的框架、實現(xiàn)原理以及完整源碼,滿滿誠意,提供給各位看官。歡迎轉(zhuǎn)發(fā)、訂閱~有問題可以私信或留言溝通!
雖然需求比較簡單,且實現(xiàn)過程也比較簡單,但通過搜索引擎搜素以及大模型的各種奇技淫巧,相信可以完成更加復(fù)雜且效果驚艷的項目。
有興趣的客官可以進行溝通合作,感謝~