大家好,我是微学AI,今天给大家讲一下知识图谱实战应用5-基于知识图谱的创建语义搜索功能。基于知识图谱的语义搜索功能是一种能够理解用户意图、并根据语义关系在知识图谱中进行查询的搜索方式。相比于传统的文本搜索,它可以更准确地回答用户的问题,提高搜索效率和搜索质量。
一、语义搜索步骤
自然语言理解:将用户输入的自然语言转化为机器可理解的形式,并提取其中的实体、属性、关系等关键信息。
实体识别:在知识图谱中识别与用户输入相关的实体,例如人物、地点、事件等。
关系抽取:根据用户输入的查询条件,从知识图谱中抽取符合条件的实体之间的关系,如“A是B的子类”、“A与B有关联”等。
结果生成:根据查询结果,生成符合用户需求的结果列表,并按照一定的排序方式进行排列,以便用户快速找到所需信息。
二、语义搜索代码实践
现在基于neo4j构建知识图谱,从实体的创建和关系的创建开始,构建企业中的数据关系。
以企业数据为样例,创建一个简单的知识图谱数据结构。后续大家可以根据实际的应用场景自行创建。
我这里将创建一个简单的企业与其相关的员工、部门和产品的关系。
企业 - 有 -> 部门
企业 - 有 -> 员工
部门 - 有 -> 员工
部门 - 生产 -> 产品
代码实战:
from py2neo import Graph, Node, Relationship
# 1. 连接到 Neo4j 数据库
graph = Graph("http://localhost:7474/browser/", auth=("neo4j", "neo4j"))
# 2. 创建企业节点
company_node = Node("Company", name="微学AI有限公司")
graph.create(company_node)
# 3. 创建部门节点及其与企业的关系
department_names = ["研发部", "市场部", "人事部"]
department_nodes = []
for name in department_names:
department_node = Node("Department", name=name)
department_nodes.append(department_node)
company_department_relationship = Relationship(company_node, "HAS", department_node)
graph.create(company_department_relationship)
# 4. 创建员工节点及其与企业和部门的关系
employee_data = [
{"name": "张三", "age": 30, "department_index": 0},
{"name": "李四", "age": 28, "department_index": 1},
{"name": "王五", "age": 35, "department_index": 2},
]
employee_nodes = []
for data in employee_data:
employee_node = Node("Employee", name=data["name"], age=data["age"])
employee_nodes.append(employee_node)
department = department_nodes[data["department_index"]]
company_employee_relationship = Relationship(company_node, "HAS", employee_node)
department_employee_relationship = Relationship(department, "HAS", employee_node)
graph.create(company_employee_relationship)
graph.create(department_employee_relationship)
# 5. 创建产品节点及其与部门的关系
product_data = [
{"name": "产品1", "price": 100, "department_index": 0},
{"name": "产品2", "price": 200, "department_index": 0},
{"name": "产品3", "price": 120, "department_index": 1},
]
product_nodes = []
for data in product_data:
product_node = Node("Product", name=data["name"], price=data["price"])
product_nodes.append(product_node)
department = department_nodes[data["department_index"]]
department_product_relationship = Relationship(department, "PRODUCES", product_node)
graph.create(department_product_relationship)
# 语义搜索函数
def semantic_search(keyword):
result = graph.run(f"MATCH (n) WHERE n.name CONTAINS '{keyword}' RETURN n").data()
return result
if __name__ == "__main__":
keyword = input("请输入搜索关键词:")
search_result = semantic_search(keyword)
if search_result:
print(f"搜索到以下包含'{keyword}'的实体:")
for result in search_result:
print(dict(result["n"]))
else:
print(f"未找到包含’{keyword}'的实体")
我们进行数据添加到图数据库中,就可以进行查询了,图数据库创建图像如下:
根据以上关系进行查询,这个是初步的项目,更深的应用在后续发布,谢谢支持。