深度学习实战21(进阶版)-AI实体百科搜索,任何名词都可搜索到的百科全书
迪丽瓦拉
2025-05-30 16:39:27
0

大家好,我是微学AI,今天给大家带来一个AI实体百科搜索的有趣项目。

AI实体百科搜索功能可以让用户通过输入实体名称来搜索相关的信息,并将这些信息以可视化方式呈现出来。构建这个功能可以帮助用户快速地获取与特定实体相关的信息。在这个功能中,用户可以输入一个实体的名称,比如一个人、一个地方或一件事情等等,然后系统将会返回包括该实体的详细信息在内的相关结果,类似与本地部署一个百度百科了。

一、AI实体百科搜索功能

以下是该功能的具体介绍:

实体搜索:用户可以通过输入实体的名称来搜索相关的信息。例如,在搜索框中输入“人工智能”,系统就会返回与人工智能相关的信息。

属性值呈现:搜索结果会显示相关实体的基本属性和属性值,例如人工智能的名称、描述、简称、标签等。

可视化展示:除了基本属性和属性值外,AI实体百科搜索功能还可以以表格等形式进行可视化呈现,使用户更直观地了解实体的相关信息。

二、实体百科输入 

1.例如输入:人工智能,结果如下:

2.例如输入:机器学习,结果如下:

3.例如输入:区块链,结果如下:

三、代码实现

接下来就讲一下如何代码实现以上的功能点,首先是利用gradio框架搭建可视化的网页平台,这是主页的app_entity.pyd代码:

# -*- coding: utf-8 -*-
import gradio as gr
from el import EntityLinkerEL_MODEL = {'embedding': 'damo/nlp_bert_entity-embedding_chinese-base','matching': 'damo/nlp_bert_entity-matching_chinese-base'
}examples = ['人工智能','机器学习','区块链','阿里巴巴集团',
]class App:def __init__(self, index_path, kb_path):self.prepare_kb(index_path, kb_path)self.linker = EntityLinker(embedding_model_id=EL_MODEL['embedding'],matching_model_id=EL_MODEL['matching'],index_path=index_path,kb_path=kb_path)def prepare_kb(self, index_path, kb_path):def download_file(url, save_path):import requestsr = requests.get(url)with open(save_path, 'wb') as f:f.write(r.content)def run(self, text):ner_result  = {'text': text, 'entities': [{'word': text, 'entity': text, 'start': 2, 'end': 5}]}#el_result = {}for e in ner_result['entities']:el_result = self.linker.link(text, e['word'], e['start'], e['end'])return el_resultif __name__ == '__main__':gr.close_all()app = App(index_path='cand.index', kb_path='kb.json')title = "AI实体百科"with gr.Blocks(css='#ner-hint {padding: 5px 12px; color: #b3b3b3!important; font-size: .855rem} ''#el-result .text-green-500 {color: #624aff}') as demo:gr.HTML('
')gr.HTML(f'

{title}

')gr.HTML('
')with gr.Row():with gr.Column():text_input = gr.Textbox(label='请输入实体')submit_btn = gr.Button("提交", variant="primary")gr_examples = gr.Examples(examples=examples, inputs=text_input)with gr.Column():el_output = gr.Dataframe(headers=["实体", "实体名称"],col_count=(2, "fixed"))submit_btn.click(fn=app.run, inputs=[text_input], outputs=[el_output])demo.launch(show_error=True)

接下来需要引入文件el.py ,代码如下:

import json
from typing import Any, Dict, List, Union
import faiss
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from tqdm import tqdm
import pandas as pdclass EntityLinker:ENTITY_START_MARKER = '[ENT_S]'ENTITY_END_MARKER = '[ENT_E]'def __init__(self,embedding_model_id: str,matching_model_id: str,index_path: str,kb_path: str,first_stage_topk: int = 50,second_stage_topk: int = 1):self.embedding_pipeline = pipeline(task=Tasks.sentence_embedding, model=embedding_model_id, model_revision='v1.0.0')self.matching_pipeline = pipeline(task=Tasks.text_ranking, model=matching_model_id, model_revision='v1.0.0')self.index = faiss.read_index(index_path)self.kb = self.load_kb(kb_path)self.null_id = len(self.kb)self.first_stage_topk = first_stage_topkself.second_stage_topk = second_stage_topk@staticmethoddef load_kb(kb_path: str) -> List[Dict[str, Any]]:kb = []with open(kb_path, 'r',encoding='utf-8') as f:#data = f.readline()for line in tqdm(f):kb.append(json.loads(line))print(len(kb))return kbdef get_kb_by_id(self, kb_id: int, fmt: str) -> Union[str, Dict[str, str]]:if fmt == 'str':if kb_id == self.null_id:return 'no link; NULL'data = self.kb[kb_id]ret = '; '.join([data['subject'],'类型:'+data['type'],'别名: '+', '.join(data['alias']),'三元组: '+' $ '.join([' # '.join([data['subject'], x['predicate'], x['object']]) for x in data['data']])])elif fmt == 'dict':if kb_id == self.null_id:return {}data = self.kb[kb_id]ret = {'主体': data['subject'],**dict([(x['predicate'], x['object']) for x in data['data']])}else:raise ValueError(f'Not supported format: {fmt}')return retdef link(self, text: str, mention: str, start: int, end: int) -> List[Dict[str, Any]]:marked_text = text[:start] + self.ENTITY_START_MARKER + mention + self.ENTITY_END_MARKER + text[end:]mention_emb = self.embedding_pipeline({'source_sentence': [marked_text], 'sentences_to_compare': []})['text_embedding']recalled_kb_ids = list(self.index.search(mention_emb, self.first_stage_topk)[1][0])if self.null_id not in recalled_kb_ids:recalled_kb_ids.append(self.null_id)kb_candidates = [self.get_kb_by_id(kb_id, 'str') for kb_id in recalled_kb_ids]rank_scores = self.matching_pipeline({'source_sentence': [marked_text], 'sentences_to_compare': kb_candidates})['scores']rank_scores[recalled_kb_ids.index(self.null_id)] /= 10  # manully modify thresholdranked_idx = sorted(range(len(rank_scores)), key=lambda i: rank_scores[i], reverse=True)final_result = [self.get_kb_by_id(recalled_kb_ids[idx], 'dict') for idx in ranked_idx[:self.second_stage_topk]]datafram =[]for key in final_result[0].keys():datafr = [key, final_result[0][key]]datafram.append(datafr)datas = pd.DataFrame(datafram, columns=["实体", "实体名"])#print(datafram)return datasif __name__ == '__main__':pass

同时程序需要两个文件,一个是索引文件cand.index,一个是kb.json文件,这两个文件可以私信发给你们,或者链接获取:链接:https://pan.baidu.com/s/1gIPVhVl1tH5gf1-d93wgXQ?pwd=y5su 
提取码:y5su。

需要代码辅导,接单,合作的可私信。

 往期作品:

深度学习实战项目

1.深度学习实战1-(keras框架)企业数据分析与预测

2.深度学习实战2-(keras框架)企业信用评级与预测

3.深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类

4.深度学习实战4-卷积神经网络(DenseNet)数学图形识别+题目模式识别

5.深度学习实战5-卷积神经网络(CNN)中文OCR识别项目

6.深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测

7.深度学习实战7-电商产品评论的情感分析

8.深度学习实战8-生活照片转化漫画照片应用

9.深度学习实战9-文本生成图像-本地电脑实现text2img

10.深度学习实战10-数学公式识别-将图片转换为Latex(img2Latex)

11.深度学习实战11(进阶版)-BERT模型的微调应用-文本分类案例

12.深度学习实战12(进阶版)-利用Dewarp实现文本扭曲矫正

13.深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星

14.深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

15.深度学习实战15(进阶版)-让机器进行阅读理解+你可以变成出题者提问

16.深度学习实战16(进阶版)-虚拟截图识别文字-可以做纸质合同和表格识别

17.深度学习实战17(进阶版)-智能辅助编辑平台系统的搭建与开发案例

18.深度学习实战18(进阶版)-NLP的15项任务大融合系统,可实现市面上你能想到的NLP任务

19.深度学习实战19(进阶版)-ChatGPT的本地实现部署测试,自己的平台就可以实现ChatGPT

...(待更新)

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...