用大模型(qwen)提取知识三元组并构建可视化知识图谱:从文本到图谱的完整实现

引言

知识图谱作为一种结构化的知识表示方式,在智能问答、推荐系统、数据分析等领域有着广泛应用。在信息爆炸的时代,如何从非结构化文本中提取有价值的知识并进行结构化展示,是NLP领域的重要任务。知识三元组(Subject-Relation-Object)是知识图谱的基本组成单元,通过大模型强大的语义理解能力,我们可以自动化提取这些三元组,并构建可交互的知识图谱可视化界面。本文将介绍一个基于大模型的知识图谱构建工具,它能从文本中自动提取知识三元组(主体-关系-客体),并通过可视化工具生成交互式知识图谱。

这是运行结果获得,如下图示:

在这里插入图片描述

一、核心依赖库

在开始之前,确保已安装以下依赖库:

pip install networkx pyvis  # 知识图谱构建与可视化
# 其他基础库:json, re, os(通常Python环境自带)

而至于大模型环境,我们不在给出。

二、代码整体结构解析

整个项目代码主要包含四个核心模块,形成"文本输入→三元组提取→图谱构建→可视化输出"的完整流程:

# 核心模块关系
文本输入 → extract_triples() → 知识三元组 → build_knowledge_graph() → 图谱数据 → visualize_knowledge_graph() → 可视化HTML

下面我们逐个解析关键模块的实现逻辑。

1. 大模型调用与三元组提取(extract_triples函数)

该函数是整个流程的核心,负责调用大模型从文本中提取知识三元组。其关键实现思路如下:

大模型提示词设计

为了让大模型精准输出符合要求的三元组,我们设计了严格的系统提示词(System Prompt):

system_prompt = """你是专业知识三元组提取器,严格按以下规则输出:
1. 仅从文本提取(主体, 关系, 客体)三元组,忽略无关信息。
2. 必须用JSON数组格式返回,每个元素含"subject"、"relation"、"object"字段。
3. 输出仅保留JSON数组,不要任何解释、说明、代码块标记。
4. 确保JSON格式正确:引号用双引号,逗号分隔,无多余逗号。
"""

提示词明确了输出格式要求,这是后续解析三元组的基础。

流式响应处理

大模型通常采用流式输出方式返回结果,我们需要持续接收并拼接响应内容:

full_response = ""
for chunk in stream_invoke(ll_model, messages):full_response += str(chunk)print(f"\r已接收 {len(full_response)} 字符...", end="")

这种处理方式能实时反馈进度,提升用户体验。

格式修复机制

大模型输出可能存在格式问题(如引号不规范、多余逗号等),因此需要异常处理和格式修复:

try:return json.loads(full_response)
except json.JSONDecodeError:# 尝试提取JSON结构并修复json_match = re.search(r'\[.*\]', full_response, re.DOTALL)if json_match:cleaned_response = json_match.group()cleaned_response = cleaned_response.replace("'", '"')  # 单引号转双引号cleaned_response = re.sub(r',\s*]', ']', cleaned_response)  # 移除末尾多余逗号try:return json.loads(cleaned_response)except json.JSONDecodeError as e:print(f"修复后仍解析失败:{e}")return []

这一机制大幅提升了代码的健壮性,即使大模型输出格式略有瑕疵也能尝试修复。

2. 知识图谱构建(build_knowledge_graph函数)

提取三元组后,需要将其转换为结构化的知识图谱数据结构:

def build_knowledge_graph(triples):if not triples:return None  # 处理空三元组情况entities = set()# 收集所有实体(主体和客体都是实体)for triple in triples:entities.add(triple["subject"])entities.add(triple["object"])# 构建实体属性字典entity_attributes = {entity: {"name": entity} for entity in entities}# 构建关系列表relations = [{"source": triple["subject"],"target": triple["object"],"type": triple["relation"]} for triple in triples]return {"entities": [{"id": entity, **attrs} for entity, attrs in entity_attributes.items()],"relations": relations}

这个函数的核心逻辑是:

  • 从三元组中提取所有唯一实体(去重)
  • 为每个实体创建基础属性(目前包含名称)
  • 将三元组转换为"源节点-目标节点-关系类型"的边结构
  • 最终返回包含实体和关系的图谱字典

3. 知识图谱可视化(visualize_knowledge_graph函数)

可视化是知识图谱的重要展示方式,本项目使用pyvis库生成交互式HTML图谱:

可视化配置与节点边添加

# 初始化有向图
net = Network(directed=True, height="700px", width="100%", bgcolor="#f5f5f5", font_color="black",notebook=False  # 关键配置:非Notebook环境
)# 添加节点
for entity in graph["entities"]:net.add_node(entity["id"],label=entity["name"],title=f"实体: {entity['name']}",color="#4CAF50"  # 绿色节点)# 添加边(关系)
for relation in graph["relations"]:net.add_edge(relation["source"],relation["target"],label=relation["type"],title=relation["type"],color="#FF9800"  # 橙色边)

这里的关键配置是notebook=False,解决了非Jupyter环境下的模板渲染错误问题。

布局与交互配置

通过JSON配置定义图谱的视觉样式和交互行为:

net.set_options("""
{"nodes": {"size": 30,"font": {"size": 14}},"edges": {"font": {"size": 12},"length": 200},"interaction": {"dragNodes": true,  # 允许拖拽节点"zoomView": true,   # 允许缩放"dragView": true    # 允许拖拽视图}
}
""")

这些配置确保生成的图谱具有良好的可读性和交互性。

容错机制与备选方案

为应对HTML生成失败的情况,代码设计了备选可视化方案:

try:net.write_html(output_file, open_browser=False)
except Exception as e:# 备选方案:使用matplotlib生成静态PNGimport matplotlib.pyplot as pltplt.figure(figsize=(12, 8))pos = nx.spring_layout(nx.DiGraph([(r["source"], r["target"]) for r in graph["relations"]]))nx.draw_networkx_nodes(pos, node_size=3000, node_color="#4CAF50")nx.draw_networkx_labels(pos, labels={e["id"]: e["name"] for e in graph["entities"]})nx.draw_networkx_edges(pos, edgelist=[(r["source"], r["target"]) for r in graph["relations"]], arrowstyle="->")nx.draw_networkx_edge_labels(pos, edge_labels={(r["source"], r["target"]): r["type"] for r in graph["relations"]})plt.savefig(output_file.replace(".html", ".png"))

这种双重保障机制确保即使pyvis出现问题,也能获得基础的可视化结果。

4. 主流程控制(process_text_to_graph函数)

该函数整合了前面的所有模块,形成完整的"文本→三元组→图谱→可视化"流程:

def process_text_to_graph(text):print("正在从文本中提取知识三元组...")triples = extract_triples(text)if not triples:print("未能提取到任何知识三元组")return Noneprint(f"成功提取 {len(triples)} 个知识三元组:")for i, triple in enumerate(triples, 1):print(f"{i}. ({triple['subject']}, {triple['relation']}, {triple['object']})")print("\n正在构建知识图谱...")graph = build_knowledge_graph(triples)if not graph:print("构建知识图谱失败")return Noneprint("\n正在生成知识图谱可视化...")output_file = visualize_knowledge_graph(graph)return output_file

流程清晰,包含了必要的日志输出和异常判断,方便用户跟踪进度和排查问题。

三、使用方法与示例

运行示例

if __name__ == "__main__":sample_text = """爱因斯坦是一位著名的物理学家,他出生于德国。1905年,爱因斯坦提出了相对论。相对论彻底改变了人们对时间和空间的理解。爱因斯坦因光电效应获得了1921年诺贝尔物理学奖。他后来移居美国,并在普林斯顿大学工作。爱因斯坦与玻尔就量子力学的解释有过著名的争论。"""process_text_to_graph(sample_text)

输出结果

运行后会得到以下输出:

正在从文本中提取知识三元组...
正在接收大模型流式响应...
已接收 236 字符...
流式响应接收完成,开始解析...
成功提取 6 个知识三元组:
1. (爱因斯坦, 是, 物理学家)
2. (爱因斯坦, 出生于, 德国)
3. (爱因斯坦, 提出, 相对论)
4. (相对论, 改变, 人们对时间和空间的理解)
5. (爱因斯坦, 获得, 1921年诺贝尔物理学奖)
6. (爱因斯坦, 工作于, 普林斯顿大学)正在构建知识图谱...
正在生成知识图谱可视化...
知识图谱已保存至 /path/to/knowledge_graph.html

打开生成的knowledge_graph.html文件,可看到交互式知识图谱,支持节点拖拽、缩放和平移操作。

代码运行图示:
在这里插入图片描述

四、完整代码

运行知识图谱完整代码,该代码需要调用大模型构建的代码。我只是作为列子给出知识图谱的prompt方法。你可以根据graphrag等方式来提取知识图谱或更专业的方式来提取。

大模型调用完整代码

from langchain_openai import ChatOpenAI
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))# 给出大语言模型默认参数字典的导入内容
llm_config = {"deepseek_1.5b": {"model_name": "deepseek-r1:1.5b","api_url": "http://162.130.245.26:9542/v1","api_key": "sk-RJaJE4fXaktHAI2MB295F6Ad58004feBcE25B83CdD6F0","embedding_ctx_length": 8191,"chunk_size": 1000,"max_retries": 2,"timeout": None,  # 请求超时时间,默认为 None"default_headers": None,  # 默认请求头"default_query": None,  # 默认查询参数"retry_min_seconds": 4,"retry_max_seconds": 20,},"deepseek_14b": {"model_name": "deepseek-r1:14b","api_url": "http://162.130.245.26:9542/v1","api_key": "sk-RJaJE4fXaktHAI2MB295F6Ad58004feBcE25B83CdD6F0","embedding_ctx_length": 8191,"chunk_size": 1000,"max_retries": 2,"timeout": None,  # 请求超时时间,默认为 None"default_headers": None,  # 默认请求头"default_query": None,  # 默认查询参数"retry_min_seconds": 4,"retry_max_seconds": 20,},"deepseek_32b": {"model_name": "deepseek-r1:32b","api_url": "http://162.130.245.26:9542/v1","api_key": "sk-RJaJE4fXaktHAI2MB295F6Ad58004feBcE25B83CdD6F0","embedding_ctx_length": 8191,"chunk_size": 1000,"max_retries": 2,"timeout": None,  # 请求超时时间,默认为 None"default_headers": None,  # 默认请求头"default_query": None,  # 默认查询参数"retry_min_seconds": 4,"retry_max_seconds": 20,},"qwen3_14b": {"model_name": "qwen3:14b","api_url": "http://192.145.216.20:7542/v1","api_key": "sk-RJaJE4fXaktHAI2M295F6Ad58004f7eBcE25B863CdD6F0","embedding_ctx_length": 8191,"chunk_size": 1000,"max_retries": 2,"timeout": None,  # 请求超时时间,默认为 None"default_headers": None,  # 默认请求头"default_query": None,  # 默认查询参数"retry_min_seconds": 4,"retry_max_seconds": 20,},"qwen3_32b": {"model_name": "qwen3:32b","api_url": "http://192.145.216.20:7542/v1","api_key": "sk-RJaJE4fXaktHAI2MB295F6d58004f7eBcE255B863CdD6F0","embedding_ctx_length": 8191,"chunk_size": 1000,"max_retries": 2,"timeout": 60,  # 请求超时时间,默认为 None"default_headers": None,  # 默认请求头"default_query": None,  # 默认查询参数"retry_min_seconds": 4,"retry_max_seconds": 20,},}def stream_invoke(llm_model,prompt):"""prompt可以做成2种方式,方式一:from langchain.schema import HumanMessagemessages = [HumanMessage(content=prompt)]方式二:{"role": "user", "content": question}"""full_response = ""results = llm_model.stream(prompt)for chunk in results:print(chunk.content, end="", flush=True)  # 逐块输出full_response += chunk.contentreturn full_responsedef invoke( llm_model,prompt):"""调用模型生成响应。:param prompt: 输入的提示文本:return: 模型生成的响应内容"""response = llm_model.invoke(prompt)print(response)return response.content
def build_model(mode="deepseek_32b"):config = llm_config[mode]model_name = config["model_name"]api_key = config["api_key"]    api_url = config["api_url"]LLM = ChatOpenAI(model=model_name,openai_api_key=api_key,openai_api_base=api_url)return LLMdef remove_think(answer, split_token='</think>'):"""处理模型响应,分离 think 内容和实际回答。:param answer: 模型的完整响应:param split_token: 分隔符,默认为 </think>:return: 实际回答和 think 内容"""parts = answer.split(split_token)content = parts[-1].lstrip("\n")think_content = None if len(parts) <= 1 else parts[0]return contentif __name__ == "__main__":llm_model = build_model(mode="qwen3_14b")# print(llm_model)stream_invoke(llm_model,"解释大语言模型LLM")

知识图谱提取完整代码

from Models.LLM_Models import build_model, stream_invoke
import networkx as nx
from pyvis.network import Network
import json
import re
import os  # 新增:用于处理文件路径# 初始化大模型
ll_model = build_model()def extract_triples(text):"""使用stream_invoke从文本中提取知识三元组"""system_prompt = """你是专业知识三元组提取器,严格按以下规则输出:1. 仅从文本提取(主体, 关系, 客体)三元组,忽略无关信息。2. 必须用JSON数组格式返回,每个元素含"subject"、"relation"、"object"字段。3. 输出仅保留JSON数组,** 不要任何解释、说明、代码块标记(如```json)**。4. 确保JSON格式正确:引号用双引号,逗号分隔,无多余逗号。示例输出:[{"subject":"爱因斯坦","relation":"是","object":"物理学家"},{"subject":"爱因斯坦","relation":"提出","object":"相对论"}]"""user_input = f"从以下文本提取三元组,严格按示例格式输出:\n{text}"messages = [{"role": "system", "content": system_prompt},{"role": "user", "content": user_input}]# 接收流式响应print("正在接收大模型流式响应...")full_response = ""for chunk in stream_invoke(ll_model, messages):# 根据实际返回格式调整,有些stream_invoke可能需要chunk["content"]full_response += str(chunk)print(f"\r已接收 {len(full_response)} 字符...", end="")print("\n流式响应接收完成,开始解析...")full_response = full_response.strip()# 格式修复try:return json.loads(full_response)except json.JSONDecodeError:print("首次解析失败,尝试修复格式...")json_match = re.search(r'\[.*\]', full_response, re.DOTALL)if json_match:cleaned_response = json_match.group()cleaned_response = cleaned_response.replace("'", '"')cleaned_response = re.sub(r',\s*]', ']', cleaned_response)try:return json.loads(cleaned_response)except json.JSONDecodeError as e:print(f"修复后仍解析失败:{e}")return []else:print("未找到有效JSON结构")return []def build_knowledge_graph(triples):"""构建知识图谱数据结构"""if not triples:return None  # 新增:处理空三元组情况entities = set()for triple in triples:entities.add(triple["subject"])entities.add(triple["object"])entity_attributes = {entity: {"name": entity} for entity in entities}relations = [{"source": triple["subject"],"target": triple["object"],"type": triple["relation"]} for triple in triples]return {"entities": [{"id": entity, **attrs} for entity, attrs in entity_attributes.items()],"relations": relations}def visualize_knowledge_graph(graph, output_file="knowledge_graph.html"):"""修复可视化函数,解决模板渲染错误"""if not graph:print("无法可视化空图谱")return None# 确保输出目录存在output_dir = os.path.dirname(output_file)if output_dir and not os.path.exists(output_dir):os.makedirs(output_dir, exist_ok=True)# 初始化图时指定notebook=False(关键修复)net = Network(directed=True, height="700px", width="100%", bgcolor="#f5f5f5", font_color="black",notebook=False  # 新增:明确指定非 notebook 环境)# 添加节点和边for entity in graph["entities"]:net.add_node(entity["id"],label=entity["name"],title=f"实体: {entity['name']}",color="#4CAF50")for relation in graph["relations"]:net.add_edge(relation["source"],relation["target"],label=relation["type"],title=relation["type"],color="#FF9800")# 简化配置选项,避免复杂JSON解析问题net.set_options("""{"nodes": {"size": 30,"font": {"size": 14}},"edges": {"font": {"size": 12},"length": 200},"interaction": {"dragNodes": true,"zoomView": true,"dragView": true}}""")# 直接使用write_html方法,避免show()的复杂逻辑try:net.write_html(output_file, open_browser=False)print(f"知识图谱已保存至 {os.path.abspath(output_file)}")return output_fileexcept Exception as e:print(f"生成HTML时出错: {e}")# 尝试备选方案:使用networkx的基本可视化import matplotlib.pyplot as pltplt.figure(figsize=(12, 8))pos = nx.spring_layout(nx.DiGraph([(r["source"], r["target"]) for r in graph["relations"]]))nx.draw_networkx_nodes(pos, node_size=3000, node_color="#4CAF50")nx.draw_networkx_labels(pos, labels={e["id"]: e["name"] for e in graph["entities"]})nx.draw_networkx_edges(pos, edgelist=[(r["source"], r["target"]) for r in graph["relations"]], arrowstyle="->")nx.draw_networkx_edge_labels(pos, edge_labels={(r["source"], r["target"]): r["type"] for r in graph["relations"]})plt.savefig(output_file.replace(".html", ".png"))print(f"已生成PNG备选可视化: {output_file.replace('.html', '.png')}")return output_file.replace(".html", ".png")def process_text_to_graph(text):"""端到端处理流程"""print("正在从文本中提取知识三元组...")triples = extract_triples(text)if not triples:print("未能提取到任何知识三元组")return Noneprint(f"成功提取 {len(triples)} 个知识三元组:")for i, triple in enumerate(triples, 1):print(f"{i}. ({triple['subject']}, {triple['relation']}, {triple['object']})")print("\n正在构建知识图谱...")graph = build_knowledge_graph(triples)if not graph:print("构建知识图谱失败")return Noneprint("\n正在生成知识图谱可视化...")output_file = visualize_knowledge_graph(graph)return output_file# 示例用法
if __name__ == "__main__":sample_text = """爱因斯坦是一位著名的物理学家,他出生于德国。1905年,爱因斯坦提出了相对论。相对论彻底改变了人们对时间和空间的理解。爱因斯坦因光电效应获得了1921年诺贝尔物理学奖。他后来移居美国,并在普林斯顿大学工作。爱因斯坦与玻尔就量子力学的解释有过著名的争论。"""process_text_to_graph(sample_text)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89321.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(附源码)基于 Go 和 gopacket+Fyne 的跨平台网络抓包工具开发实录

基于 Go 和 gopacket Fyne 的跨平台网络抓包工具开发实录 一、项目背景 在网络安全、协议分析、运维排查等场景中&#xff0c;抓包工具是不可或缺的利器。Wireshark 虽然功能强大&#xff0c;但对于部分初学者或有定制需求的开发者来说&#xff0c;学习曲线较陡&#xff0c;且…

Langchain和Faiss搭建本地知识库对比

对比 对比维度及优缺点分析对比维度LangChain&#xff08;封装 FAISS&#xff09;直接使用 FAISS易用性✅ 高&#xff0c;提供高级封装&#xff0c;简化开发流程❌ 中等&#xff0c;需要熟悉 FAISS API学习成本✅ 低&#xff0c;适合快速开发❌ 高&#xff0c;需要掌握 FAISS 的…

Java常用命令汇总

JDK 工具命令jps&#xff08;Java Virtual Machine Process Status Tool&#xff09;命令示例&#xff1a;jps -l 应用场景&#xff1a;列出当前系统中所有Java进程的PID和主类名&#xff0c;常用于快速定位Java应用的进程ID。javac&#xff08;Java Compiler&#xff09;命令示…

Llama 2:开放基础模型与微调聊天模型

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" Llama 2&#xff1a;开放基础模型与微调聊天模型 摘要 在本研究中&#xff0c;我们开发并发布了 Llama 2&#xff0c;一组预训练和微调的大型语言模型&#xff08;LLMs&#xff09;&#xff0c;其规模从 70 亿参…

ThinkPHP 8 在 Apache 下启用伪静态

ThinkPHP 8 在 Apache 下启用伪静态&#xff0c;需要配置 .htaccess 文件并确保 Apache 支持 URL 重写。以下是详细设置步骤&#xff1a;1. 启用 Apache 重写模块首先确保 Apache 的 mod_rewrite 模块已启用。编辑 Apache 配置文件&#xff08;通常是 /etc/apache2/apache2.con…

Android开发中Retrofit使用方法与底层原理详解

Retrofit 是 Android 开发中一个 类型安全、基于注解、高度解耦 的 RESTful HTTP 客户端库&#xff0c;由 Square 公司开发。它极大地简化了 Android 应用与 Web 服务进行网络交互的过程。 核心价值&#xff1a; 声明式 API 定义&#xff1a; 使用 Java/Kotlin 接口和注解描述 …

基于FPGA的IIC控制EEPROM读写(2)

基于FPGA的IIC控制EEPROM读写 文章目录基于FPGA的IIC控制EEPROM读写一、EEPROM简介二、代码实现——个人理解1、状态机2、仿真效果3、上板验证4、代码top.viic_master.vuart三、代码实现——复用性较高的IIC模块1、框架设计2、状态机设计3、仿真效果4、上板验证5、代码top.viic…

C# 界面程序在23H2型号系统中无法退出

20250716记录 环境&#xff1a;c# winform问题描述&#xff1a;主界面退出直接使用了Environment.Exit(0); 程序假死&#xff0c;无法关闭解决措施&#xff1a;//使用 this.Close();以下代码目标&#xff1a;执行完程序自身后&#xff0c;删除指定文件&#xff08;可用于程序文…

Kafka——集群核心参数配置

引言在分布式系统中&#xff0c;Kafka 凭借其高吞吐量、低延迟和强大的扩展性&#xff0c;成为数据管道和流处理的首选解决方案。然而&#xff0c;要充分发挥 Kafka 的性能和稳定性&#xff0c;正确配置集群参数至关重要。为什么参数配置如此重要&#xff1f;Kafka 的参数配置直…

单臂路由实现VLAN互通实验

实验拓扑图实验需求&#xff1a;按照图示为 PC3 和 PC4 配置 IP 地址和网关PC3 属于 Vlan10&#xff0c;PC4 属于 Vlan20&#xff0c;配置单臂路由实现 Vlan10 和 Vlan20 三层互通PC3 和 PC4 可以互通实验步骤&#xff1a;1.PC 配置 IP 地址2.PC3 属于 Vlan10&#xff0c;PC4 属…

基于渐进式迁移学习网络(PTLN)​的小样本故障诊断模型

目录 一、研究背景与挑战​ ​二、创新方法:渐进式迁移学习网络(PTLN)​​ ​1. 核心架构​编辑 ​2. 训练优化​ 三、核心代码 四、实验结果与优势​ ​1. 数据集​ ​2. 性能对比​ ​3. 关键验证​ 五、工程价值与未来方向​ 六、补充信息​ 一、研究背景与挑…

网络原理 —— HTTP

通过网络初识&#xff0c;我们认识了网络的协议栈&#xff0c;TCP/IP 分为五层&#xff1a;应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层&#xff0c;物理层。也介绍了其中的关键协议。而这些协议的理解&#xff0c;是我们写网络代码的基础。 应用层&…

docker--安装--原理

安装 链接 启动之后&#xff0c;docker状态查看&#xff1a; sudo systemctl status docker 添加普通用户到docker用户组&#xff1a; sudo usermod -aG docker $USER# 重启或者使用以下命令刷新组权限&#xff1a;newgrp docker 原理

Java并发第一篇(从零开始:一文读懂Java并发编程核心基础)

从零开始&#xff1a;一文读懂Java并发编程核心基础一. 为什么需要并发编程&#xff1f;二. 并发编程的“另一面”&#xff1a;挑战与代价2.1 频繁的上下文切换2.2 线程安全问题&#xff08;如&#xff1a;死锁&#xff09;三. 夯实基础&#xff1a;必须掌握的核心概念与操作3.…

【删库跑路】一次删除pip的所有第三方库

进入命令行&#xff0c;先list看下库存pip list导出所有的第三方库至一文件列表pip freeze >requirements.txt按照列表卸载所有库pip uninstall -r requirements.txt -y再list看下&#xff0c;可见库存已清空

python 【技术面试题和HR面试题】➕列表操作、条件判断、循环、函数定义编程题

1.技术面试题 &#xff08;1&#xff09;解释Linux中的进程、线程和守护进程的概念&#xff0c;以及如何管理它们&#xff1f; 答&#xff1a; 进程 概念&#xff1a;程序运行的实例&#xff0c;有独立资源&#xff08;如内存&#xff09;&#xff0c;是系统调度的基本单位。 管…

Debian 12中利用dpkg命令安装MariaDB 11.8.2

MariaDB 11.8解决了2038问题&#xff0c;即在32位系统中将timestamp从2038-01-19 03:14:07 UTC扩展到2106-02-07 06:28:15 UTC&#xff0c;向后延长了68年。由于写此文时Debian 12的源中还没有MariaDB 11.8,采用源码编译又太费时&#xff0c;可用二进制码或dpkg安装 .下面简要记…

Go语言高并发聊天室(三):性能优化与压力测试

Go语言高并发聊天室&#xff08;三&#xff09;&#xff1a;性能优化与压力测试 &#x1f3af; 本篇目标 在前两篇文章中&#xff0c;我们完成了聊天室的基础功能。本篇将深入性能优化&#xff0c;实现真正的高并发&#xff1a; &#x1f50d; 性能瓶颈分析⚡ 关键优化技术&…

【leetcode】852. 山脉数组的封顶索引

文章目录题目题解1. 遍历2. 二分查找题目 852. 山脉数组的封顶索引 给定一个长度为 n 的整数 山脉 数组 arr &#xff0c;其中的值递增到一个 峰值元素 然后递减。 返回峰值元素的下标。 你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。 示例 1&#xff1a; 输入&a…

Java期末考试准备

文章目录Java期末考试准备一、Java的输入.next()输入.nextLine()输入区别补充二、Java的输出三、类中常写方法toString()equals()其他四、容器/数组五、继承六、静态属性、方法.七、抽象类八、接口九、初始化模块十、泛型考完结束语Java学习历程注:这篇文章本来是写给同学的&am…