title: 红楼梦人物关系问答系统
date: 2023-10-14 13:35:49
categories:
- neo4j
tags:
修改后的代码
# -*- coding: utf-8 -*-
#########add 关系#############
from py2neo import Graph
import jieba
import jieba.posseg as pseg
# 创建Neo4j连接
graph = Graph("bolt://localhost:7687", auth=("neo4j", "123456"))
# 初始化jieba分词
jieba.initialize()
# 解析问题和执行查询的逻辑
def answer_question(question):
# 使用jieba进行分词 $character_name
words = jieba.cut(question)
wordsa=words
wordsb=jieba.cut(question)
#print(words)
question_keywordsa = [word for word in wordsa if len(word) > 0]
question_keywords = [word for word in wordsb if len(word) > 1] # 过滤掉单个字符的词语
print(question_keywordsa)
print(question_keywords)
character_name=question_keywordsa[0]
print(question_keywordsa[0])
print(question_keywordsa[-1])
# 找出词性为"nr"(人名)的词语
#names = []
#for word, pos in words:
# if pos == 'nr':
# names.append(word)
#print(names)
#
#guanxi=0
#character_name1=question_keywords[0]
#character_name2=question_keywords[1]
if "关系" in question_keywordsa:
#
character_name1=question_keywords[0]
character_name2=question_keywords[1]
cypher_query ="MATCH (c1:Character)-[r:RELATION]->(c2:Character) WHERE c1.name = '"+ character_name1+ "' and c2.name='"+character_name2+"' RETURN r.type"
elif "丫鬟" in question_keywordsa:
#
cypher_query ="MATCH (c1:Character)-[:RELATION {type: '丫鬟'}]->(c2:Character) WHERE c1.name = '"+ character_name+"' RETURN c2.name"
elif "妾" in question_keywordsa:
#
cypher_query ="MATCH (c1:Character)-[:RELATION {type: '妾'}]->(c2:Character) WHERE c1.name = '"+ character_name+"' RETURN c2.name"
else:
return "抱歉,我不知道如何回答这个问题。"
answer=""
result = graph.run(cypher_query)
if "关系" in question_keywordsa:
answer = [record["r.type"] for record in result]
else:
answer = [record["c2.name"] for record in result]
if answer:
return ", ".join(answer)
else:
return "未找到相关信息。"
import keyboard
def main():
print("Press 'Esc' to exit.")
while True:
try:
user_question = input("请输入您的问题:")
answer = answer_question(user_question)
print("答案:" + str(answer))
# 询问用户是否继续
continue_option = input("继续提问吗?(1继续,0退出): ")
if continue_option == '0':
print("Exiting the program.")
break
except KeyboardInterrupt:
print("Exiting the program.")
break
if __name__ == "__main__":
main()
# 用户输入问题
#user_question = input("请输入您的问题:")
# 回答问题
#answer = answer_question(user_question)
#print(f"答案:{answer}")
运行
(test) hadoop@ubuntu:~/Pictures/neo4jsyDSJ21a/hongloumenDSJ21a/hongloum2a$ python hlmgx5.py
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 0.437 seconds.
Prefix dict has been built successfully.
Press 'Esc' to exit.
请输入您的问题:贾宝玉的妾
['贾宝玉', '的', '妾']
['贾宝玉']
贾宝玉
妾
答案:袭人
继续提问吗?(1继续,0退出): 1
请输入您的问题:贾宝玉的丫鬟
['贾宝玉', '的', '丫鬟']
['贾宝玉', '丫鬟']
贾宝玉
丫鬟
答案:何春燕
继续提问吗?(1继续,0退出): 1
请输入您的问题:贾宝玉与何春燕的关系
['贾宝玉', '与', '何春燕', '的', '关系']
['贾宝玉', '何春燕', '关系']
贾宝玉
关系
答案:丫鬟
继续提问吗?(1继续,0退出): 1
请输入您的问题:林黛玉与贾宝玉的关系
['林黛玉', '与', '贾宝玉', '的', '关系']
['林黛玉', '贾宝玉', '关系']
林黛玉
关系
答案:表妹
继续提问吗?(1继续,0退出): 1
请输入您的问题:贾宝玉的丫鬟
['贾宝玉', '的', '丫鬟']
['贾宝玉', '丫鬟']
贾宝玉
丫鬟
答案:何春燕
继续提问吗?(1继续,0退出): 0
Exiting the program.