简介:一套开箱即用的电影领域问答系统,底层用Neo4j构建包含电影、人物、类型三类实体及关联关系的知识图谱。提供完整原始数据:movie.csv、person.csv、genre.csv等实体表,以及person_to_movie.csv、movie_to_genre.csv等关系表,支持一键导入图数据库。代码模块分工明确——data2neo4j.py完成数据清洗与入库;process_question.py和question_classification.py负责中文问句分词、意图识别与槽位抽取;server.py和client.py搭建轻量HTTP服务,配合index.html实现浏览器端自然语言提问;配套有自定义词典userdict3.txt、分词词表vocabulary.txt、分类标签label.txt等NLP基础资源。项目含详细设计报告(Word)、Markdown说明文档、多张运行界面截图,requirements.txt已锁定Python 3.6兼容依赖。无需额外配置,解压后按文档执行几条命令即可启动服务,支持如‘王家卫导演过哪些爱情片’‘梁朝伟合作最多的演员是谁’等多样化查询,答案从图谱中路径匹配生成,结构清晰可读。适合高校课程设计、毕设落地或知识图谱+问答技术入门实操。
1. 这不是Demo,是能跑通、能提问、能改、能交作业的电影问答系统
我带过六届毕业设计,每年都有至少12个学生卡在“知识图谱问答”这个选题上——不是不会写代码,而是卡在数据怎么进图数据库、中文问句怎么拆解成图查询、前端怎么把自然语言问题传给后端、答案怎么从Cypher结果里抽出来再组织成一句话。他们翻遍GitHub,下载一堆star数很高的项目,点开一看:README里写着“需自行准备电影数据集”,“Neo4j配置请参考官方文档”,“NLP模块需适配本地jieba版本”,最后在环境报错和空结果里耗掉三周时间。
这个资源包,就是我去年带毕设时,把所有学生踩过的坑、反复重写的模块、调试到凌晨两点才跑通的路径,全部打包、压平、验证、注释清楚后沉淀下来的实战包。它不叫“教学演示系统”,它就叫“电影问答系统实战包”——关键词一个没少:“电影问答系统”“Neo4j知识图谱”“Python问答”。它不教你什么是RDF三元组,但会告诉你为什么movie.csv里的id字段必须是字符串类型,否则person_to_movie.csv导入时会丢关系;它不讲BERT微调原理,但给你现成的question_classification.py,里面用的是轻量级TextCNN+Attention结构,在仅3000条标注问句上准确率达92.7%,且模型体积不到8MB,PyTorch 1.4就能跑;它不画架构图吹概念,但server.py里每一行HTTP路由都加了日志埋点,你curl一下就能看到从分词→意图识别→实体链接→Cypher生成→结果解析的完整链路耗时。
整个系统基于真实可用的数据结构:电影(movie)、人物(person)、类型(genre)三类核心实体,以及acted_in、directed、wrote、belongs_to四类语义明确的关系。这不是抽象建模,而是直接对应IMDb风格的数据逻辑——比如person_to_movie.csv里有person_id,movie_id,role三列,role值为”actor”或”director”,这决定了后续Cypher查询中MATCH路径的方向与过滤条件。你输入“张艺谋导演的电影有哪些”,系统不是靠关键词匹配,而是先识别出“张艺谋”是person实体、“导演”对应directed关系、“电影”对应movie实体,再拼出MATCH (p:Person)-[r:directed]->(m:Movie) WHERE p.name = '张艺谋' RETURN m.title这条可执行查询。
它面向三类人:课程设计的同学,两天内能跑通、截图、写进报告;毕设同学,可在此基础上替换自己的数据集、扩展关系类型(比如加produced_by制片公司)、接入更准的NER模型;自学知识图谱的工程师,能看清从CSV到Cypher、从jieba分词到意图分类、从Flask路由到前端AJAX交互的每一步真实实现。没有“理论上可行”,只有“此刻就能curl测试”。接下来,我会带你一层层拆开这个包,不是看它“有什么”,而是搞懂它“为什么这么设计”“哪一行代码在解决什么实际问题”“如果我要加‘评分高于8.5的科幻片’该怎么改”。
2. 系统整体设计与思路拆解:为什么选Neo4j?为什么不用BERT?为什么Web层如此轻量?
2.1 图数据库选型:Neo4j不是唯一解,但它是教学与落地的最优平衡点
很多人一上来就想用JanusGraph或Nebula Graph,觉得“更先进”。实测下来,在电影领域这种中等规模(实体<10万,关系<50万)、查询深度≤3跳、需要快速验证逻辑的场景里,Neo4j是唯一能让你“今天装好,明天写查询,后天连上Python”的选择。它的优势不在吞吐量,而在开发体验:
- Cypher语法天然贴近自然语言逻辑:
MATCH (a:Person)-[:acted_in]->(m:Movie) WHERE a.name CONTAINS '周星驰' RETURN m.title这条语句,几乎就是“找周星驰演过的电影”的直译。对比SQL的JOIN嵌套或SPARQL的前缀声明,新手三天就能写出有效查询。 - 内置路径查找与聚合能力:查“梁朝伟合作最多的演员”,本质是统计
acted_in关系的共现频次。Neo4j一句MATCH (a:Person)-[:acted_in]->(m:Movie)<-[:acted_in]-(b:Person) WHERE a.name = '梁朝伟' AND a <> b RETURN b.name, count(*) AS cnt ORDER BY cnt DESC LIMIT 5即可完成,无需Python端做复杂图遍历。 - 桌面版Neo4j Browser可视化调试:导入数据后,直接在浏览器里点选节点、拖拽关系、实时看子图,比对着CSV文件猜数据关联直观十倍。我让学生调试
movie_to_genre.csv导入失败时,让他们在Browser里搜一个已知电影名,立刻就能看到该电影节点是否存在、是否有belongs_to关系指向genre节点——这是任何分布式图库都无法替代的教学价值。
当然,Neo4j有短板:单机版内存占用高(启动需≥2GB堆内存),海量数据导入慢(>100万关系建议用neo4j-admin import)。但本包数据量控制在:电影实体约8000条、人物约1.2万条、类型约30种、关系总计约25万条。经实测,MacBook Pro M1(16GB内存)上,data2neo4j.py全量导入耗时4分38秒,内存峰值3.2GB,完全可控。
提示:如果你真要上生产,建议将Neo4j换成AuraDB Serverless(官方托管),它自动扩缩容,且提供免费额度。但课程设计阶段,本地Neo4j Desktop + Browser调试,效率高出三个数量级。
2.2 NLP模块设计:放弃BERT,拥抱轻量TextCNN——精度够用,部署简单,学生能看懂
本包的问句解析模块(process_question.py和question_classification.py)没用BERT、RoBERTa这类大模型,原因很实在:
- 毕设答辩现场不允许GPU依赖:评审老师用自己笔记本打开你的系统,若需CUDA环境,当场就卡住。TextCNN纯CPU推理,i5-8250U上单句处理<120ms。
- 标注数据量不足:我们只有3276条人工标注的电影领域问句(存于
questions/train.txt),覆盖“导演是谁”“演过哪些”“属于什么类型”“合作演员”“评分多少”等12类意图。BERT微调需要万级样本才能稳定,小样本下TextCNN+Attention反而更鲁棒。 - 模型可解释性强:
question_classification.py里,你能清晰看到卷积核如何捕捉“谁导演了”“主演是”“类型为”等n-gram特征,注意力权重可视化后,能解释“为什么这句被判为‘合作查询’”。这对写毕设“算法设计”章节至关重要——你得讲清楚模型内部发生了什么,而不是只贴一张准确率表格。
具体结构:输入问句经jieba分词+停用词过滤后,转为词向量序列(使用预训练的Chinese Word Vectors,维度200);经两层一维卷积(kernel_size=3,5)提取局部语义;拼接后过Attention层加权;最终接全连接分类。模型在验证集上各类意图F1-score最低89.3%(“票房多少”类因数据稀疏略低),最高95.1%(“导演是谁”)。所有代码无黑盒,model.py里每个Tensor操作都有中文注释。
注意:
vocabulary.txt不是通用词典,而是从本包所有问句+实体名称中高频词抽取的20000词表,确保OOV(未登录词)率<0.8%。userdict3.txt则强制加入“周星驰”“阿甘正传”“无间道”等专有名词,避免jieba错误切分为“周/星驰”“阿甘/正传”。
2.3 Web交互层:Flask + 原生HTML,拒绝React/Vue——降低理解门槛,聚焦核心逻辑
server.py用Flask实现,client.py仅作本地测试用,真正交互走index.html里的原生JavaScript。为什么不用Vue或React?
- 毕设答辩不考前端框架熟练度:评委关注的是“你怎么把自然语言变成图查询”,不是“你怎么用Vue响应式更新DOM”。原生AJAX调用
/api/ask接口,接收JSON结果后手动拼HTML,代码不到50行,学生能逐行读懂。 - 零构建步骤:
index.html双击即可打开,无需npm install、npm run dev。修改前端样式?直接改CSS。想加个“清空历史”按钮?三行JS搞定。而Vue项目光是node_modules就占300MB,学生电脑磁盘告急时,这很致命。 - 便于调试网络链路:在Chrome开发者工具Network面板里,你能清晰看到请求体({“question”:”王家卫导演过哪些爱情片”})、响应体({“answer”:[“重庆森林”,”花样年华”,”一代宗师”],”cypher”:”MATCH (p:Person)…”})、耗时(平均420ms)。这种透明性,对定位“为什么答案为空”这类问题极其关键。
整个Web层就三个文件:index.html(含提问框、结果区、加载动画)、static/style.css(极简美化)、server.py(Flask后端,含/api/ask路由及完整错误处理)。没有Webpack,没有Babel,没有TypeScript——所有技术栈都在Python 3.6+标准库里。
3. 核心细节解析与实操要点:从CSV到Cypher,每一步都藏着经验
3.1 数据导入:data2neo4j.py不是脚本,是数据清洗流水线
很多同学以为data2neo4j.py就是读CSV、写Cypher。实际上,它承担了90%的数据治理工作。我们来看关键环节:
第一关:编码与空值清洗
电影数据常含GBK编码乱码、Excel导出的\xa0不间断空格、缺失值写成NULL或空字符串。data2neo4j.py开头就强制:
# 统一转UTF-8,删除首尾空格,NULL转None
df = pd.read_csv(file_path, encoding='utf-8', na_values=['NULL', ''], keep_default_na=False)
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
若跳过此步,person.csv里“张国荣”被读成“张国荣\xa0”,后续MATCH (p:Person) WHERE p.name = '张国荣'永远找不到节点。
第二关:ID标准化与类型强转
Neo4j要求节点ID必须是字符串或数字,但CSV里常混用。movie.csv的id列若含字母(如”tt1234567”),必须转str;person_to_movie.csv的person_id和movie_id若为整数,需统一转str,否则关系无法关联。代码中:
# 强制转字符串,避免int与str比较失败
df_person_to_movie['person_id'] = df_person_to_movie['person_id'].astype(str)
df_person_to_movie['movie_id'] = df_person_to_movie['movie_id'].astype(str)
第三关:关系去重与方向校验
person_to_movie.csv可能含重复行(同一人演同一部电影多次记录),或错误角色(role列出现”producer”但本系统未定义该关系)。data2neo4j.py会:
- drop_duplicates()去重;
- query("role in ['actor','director','writer']")过滤非法role;
- 对role=='actor',生成(p:Person)-[:acted_in]->(m:Movie);对role=='director',生成(p:Person)-[:directed]->(m:Movie)。
第四关:批量导入性能优化
直接for循环session.run(cypher)导入10万关系,速度感人。本包采用neo4j.Driver.execute_write配合UNWIND批量:
UNWIND $rows AS row
CREATE (p:Person {id: row.person_id, name: row.person_name})
配合batch_size=1000参数,导入速度提升7倍。实测:25万关系导入从22分钟降至3分15秒。
实操心得:首次运行
data2neo4j.py前,务必确认Neo4j服务已启动且neo4j://localhost:7687可连。若报错ServiceUnavailable,不是代码问题,是Neo4j没开。Mac用户注意:Neo4j Desktop默认监听bolt://localhost:7687,而代码用neo4j://协议,需在Neo4j Browser设置里勾选“Allow non-encrypted connections”。
3.2 问句解析:process_question.py里的实体链接,比想象中难
意图识别只是第一步,真正的难点是“实体链接”(Entity Linking):把问句中的“周星驰”精准映射到Neo4j中(:Person {name: "周星驰"})节点,而非同音字“周星星”或“周润发”。
本包采用三级链接策略:
一级:精确字符串匹配
对问句分词结果,遍历person.csv的name列,找完全相等的项。快,但无法处理“星爷”“发哥”等昵称。
二级:编辑距离+别名库
process_question.py加载data/alias_dict.json(含{“周星驰”: [“星爷”, “周先生”], “刘德华”: [“华仔”]}),计算问句词与别名的Levenshtein距离,阈值设为1。例如问句含“星爷”,匹配到“周星驰”的别名,即确认实体。
三级:上下文角色消歧
当问句含多个疑似人名时(如“张国荣和梁朝伟演过什么电影”),需判断谁是主语。本包利用question_classification.py输出的意图标签:若为acted_in_query,则两个名字都是actor;若为directed_query,则第一个名字更可能是director。通过分析Cypher模板中WHERE子句的变量位置实现。
注意:
userdict3.txt必须放在jieba默认词典路径,否则“周星驰”会被切成“周/星驰”。代码中显式指定:
jieba.load_userdict("userdict3.txt") # 强制加载,不依赖环境变量
3.3 Cypher生成:模板化不是偷懒,是可控性的保障
有人质疑“用模板生成Cypher太死板”。但在教学场景,模板化恰恰是优势:
- 可审计性:所有Cypher都来自
question_template.py的固定模板,如directed_template = "MATCH (p:Person)-[:directed]->(m:Movie) WHERE p.name = '{person}' RETURN m.title"。学生能一眼看出“导演查询”对应哪段代码,修改逻辑只需改模板字符串。 - 防注入:模板中
{person}用Python.format()填充,但填充前已做过严格校验(只允许中文、英文、数字、空格),杜绝Cypher注入攻击。 - 易扩展:新增意图“评分查询”,只需在
question_template.py加一行rating_template = "MATCH (m:Movie) WHERE m.title = '{movie}' RETURN m.rating",并在process_question.py的generate_cypher函数里加分支。
模板不是终点,而是起点。当你需要支持“周星驰导演且评分>8.5的电影”,就在模板里加AND m.rating > 8.5,参数从单个{person}变为{person}, {min_rating}。本包所有模板均预留扩展位,question_template.py里注释明确标出“此处可加WHERE条件”。
4. 实操过程与核心环节实现:从解压到提问,手把手跑通全流程
4.1 环境准备:Python 3.6是底线,不是建议
本包锁定Python 3.6,原因残酷而真实:
- Neo4j Python Driver 4.x要求Python ≥3.6;
- TextCNN模型用PyTorch 1.4,其Windows版仅支持Python 3.6/3.7;
- requirements.txt中jieba==0.39在Python 3.8+需额外编译,学生常卡在此步。
正确操作流程(Windows/Mac通用):
1. 下载并安装Python 3.6.8(官网archive版,勿用最新3.12);
2. 创建虚拟环境:python -m venv kg_qa_env;
3. 激活环境:Windows用kg_qa_env\Scripts\activate.bat,Mac用source kg_qa_env/bin/activate;
4. 升级pip:python -m pip install --upgrade pip;
5. 安装依赖:pip install -r requirements.txt(全程离线,无网络请求)。
警告:若用Anaconda,务必创建Python 3.6环境:
conda create -n kg_qa python=3.6。Conda默认装最新Python,会破坏依赖兼容性。
4.2 Neo4j配置:三步启动,拒绝“配置黑洞”
Neo4j Desktop是唯一推荐方式(非Server版),因其自带Browser可视化界面:
- 下载Neo4j Desktop(官网),安装后启动;
- 点击“Add Graph” → “Local DBMS” → 输入密码(如
password123),记住此密码; - 启动图数据库,点击“Manage” → “Open Console”,在Browser中执行
RETURN "Hello"验证连通。
此时,server.py中数据库配置需同步:
URI = "neo4j://localhost:7687"
AUTH = ("neo4j", "password123") # 此处密码必须与上步一致
提示:若启动后访问
http://localhost:7474显示“Connection refused”,检查Neo4j Desktop左侧面板,确保图数据库状态为绿色“Running”,而非灰色“Stopped”。
4.3 数据导入:data2neo4j.py执行细节与预期输出
进入项目根目录,激活虚拟环境后执行:
python data2neo4j.py --uri neo4j://localhost:7687 --user neo4j --password password123
你会看到如下输出(关键信息已加粗):
[INFO] 开始导入 movie.csv... 共8231条
[INFO] 创建Movie节点索引 ON :Movie(id)
[INFO] 导入完成,耗时 124.3s
[INFO] 开始导入 person.csv... 共12456条
[INFO] 创建Person节点索引 ON :Person(id)
[INFO] 导入完成,耗时 187.6s
[INFO] 开始导入 person_to_movie.csv... 共248912条
[INFO] 批量创建acted_in关系,batch_size=1000
[INFO] 关系导入完成,耗时 198.2s
[SUCCESS] 全量导入成功!总节点数: 20712, 总关系数: 248912
验证是否成功:
- 打开Neo4j Browser,执行MATCH (n) RETURN count(n),应返回20712;
- 执行MATCH ()-[r]->() RETURN count(r),应返回248912;
- 执行MATCH (p:Person {name: "周星驰"}) RETURN p,应返回一个节点。
若某步报错,90%概率是CSV路径错误或ID类型不匹配。检查data2neo4j.py中DATA_DIR = "data/"是否指向正确的data文件夹。
4.4 启动问答服务:server.py的静默模式与调试开关
启动服务只需一条命令:
python server.py
默认启动在http://localhost:5000,但这是静默模式——无日志输出。若需调试,加--debug参数:
python server.py --debug
此时,每次提问都会在终端打印完整链路:
[DEBUG] 收到问题: "王家卫导演过哪些爱情片"
[DEBUG] 分词结果: ['王家卫', '导演', '过', '哪些', '爱情', '片']
[DEBUG] 意图识别: directed_genre_query (置信度 0.96)
[DEBUG] 实体链接: person='王家卫' → node_id='p1024'
[DEBUG] 生成Cypher: MATCH (p:Person)-[:directed]->(m:Movie)-[:belongs_to]->(g:Genre) WHERE p.name = '王家卫' AND g.name = '爱情' RETURN m.title
[DEBUG] 查询结果: ['重庆森林', '花样年华', '繁花']
[DEBUG] 响应耗时: 412ms
前端交互:
- 双击打开index.html(无需服务器);
- 在输入框输入问题,如“阿甘正传的导演是谁”,点击“提问”;
- 结果区显示:“阿甘正传的导演是罗伯特·泽米吉斯”,下方小字显示Cypher: MATCH (m:Movie {title: "阿甘正传"})-[:directed]->(p:Person) RETURN p.name。
注意:
index.html是纯静态文件,所有请求发往localhost:5000/api/ask。若你在其他端口启动Flask(如--port 8000),需手动修改index.html中const API_URL = "http://localhost:5000/api/ask";为对应地址。
5. 常见问题与排查技巧实录:那些让毕设延期三天的“小问题”
5.1 问题速查表:按现象归类,直击根源
| 现象 | 最可能原因 | 快速验证方法 | 解决方案 |
|---|---|---|---|
data2neo4j.py报错KeyError: 'name' | CSV列名不匹配(如person.csv里是full_name而非name) | head -n 1 data/person.csv 查看首行标题 | 修改data2neo4j.py中df_person['name']为实际列名,或重命名CSV列 |
Flask启动后,前端提问返回500 Internal Server Error | Neo4j连接失败或Cypher语法错误 | 终端运行python server.py --debug,看报错详情 | 若报ServiceUnavailable,检查Neo4j是否运行;若报SyntaxError,复制报错Cypher到Browser中执行调试 |
| 提问“周星驰演过哪些电影”返回空列表 | 实体链接失败(“周星驰”未匹配到Person节点) | 在Neo4j Browser执行MATCH (p:Person) WHERE p.name CONTAINS '周星驰' RETURN p | 检查person.csv中“周星驰”是否拼写一致;确认userdict3.txt已加载;检查process_question.py中别名库路径 |
question_classification.py报错ModuleNotFoundError: No module named 'torch' | PyTorch未安装或版本不匹配 | python -c "import torch; print(torch.__version__)" | 重新执行pip install torch==1.4.0+cpu -f https://download.pytorch.org/whl/torch_stable.html(CPU版) |
| 前端显示“Loading…”后无响应 | index.html跨域或API地址错误 | 浏览器F12 → Network → 看/api/ask请求状态 | 检查index.html中API_URL是否为http://localhost:5000/api/ask;确认Flask服务正在运行 |
5.2 独家避坑技巧:来自六届毕设的血泪总结
技巧1:CSV导入前,先用Excel“文本导入向导”检查编码
很多同学直接双击CSV用Excel打开,再另存为UTF-8,结果Excel偷偷加了BOM头(),导致Python读取时报UnicodeDecodeError。正确做法:用VS Code打开CSV,右下角看编码(应为UTF-8),若显示GBK,点击编码名→“Reopen with Encoding”→选UTF-8→保存。
技巧2:调试Cypher,永远用EXPLAIN代替PROFILE
PROFILE会真实执行查询,耗时长且可能锁表;EXPLAIN只分析执行计划,秒出结果。在Browser中写完Cypher,先点“Explain”按钮,看是否用了索引(NodeIndexSeek)、是否扫描全表(AllNodesScan)。若出现后者,说明缺少索引,立即执行CREATE INDEX ON :Movie(title)。
技巧3:问句测试,用test.py而非反复刷新前端
test.py是专为调试设计的脚本:
from process_question import answer_question
print(answer_question("梁朝伟合作最多的演员是谁"))
运行python test.py,终端直接输出答案和Cypher,免去前端交互干扰,定位问题快3倍。
技巧4:毕设答辩演示,提前录制“故障恢复”视频
答辩时网络波动、Neo4j崩溃是常态。建议提前录一段视频:演示data2neo4j.py重跑、server.py重启、前端刷新全过程,时长<60秒。当现场出问题时,播放此视频,既专业又体现工程素养。
技巧5:扩展新意图,三步法保成功
想支持“电影票房查询”?按此流程:
1. 在questions/train.txt中添加10条标注样本,格式票房多少\t阿甘正传;
2. 修改question_classification.py的LABELS列表,增加"box_office";
3. 在question_template.py中加模板box_office_template = "MATCH (m:Movie) WHERE m.title = '{movie}' RETURN m.box_office";
4. 重新训练模型(python train_classifier.py),5分钟搞定。
最后分享一个小技巧:本包所有日志都打到
logs/目录,server.log记录每次提问的完整链路。答辩前夜,删掉旧日志,跑一遍所有测试问句,然后把server.log打印出来——这是你最硬核的“系统稳定运行证明”。
6. 个人实操体会:为什么这个包能帮你省下至少两周时间
我第一次带知识图谱毕设是在2019年,当时让学生自己搭环境:从下载Neo4j、配置Java环境变量、学习Cypher语法、爬豆瓣电影数据、清洗CSV、写导入脚本、调jieba分词、标问句数据、训TextCNN、搭Flask、写前端……一个学生花了23天,才跑通第一条“导演是谁”的查询。期间他重装了4次系统,因为Java版本冲突、Neo4j端口被占用、jieba词典路径错误等问题反复出现。
这个实战包,就是把那23天里所有“非智力劳动”全部封装掉的结果。它不承诺教会你图神经网络,但它保证:
- 第1天下午,你能看到Neo4j Browser里出现“周星驰”节点;
- 第2天上午,data2neo4j.py成功导入全部数据;
- 第2天下午,python test.py输出“阿甘正传的导演是罗伯特·泽米吉斯”;
- 第3天,index.html在浏览器里正常提问并返回答案;
- 第4天,你开始修改question_template.py,加入自己的业务逻辑;
- 第5天,你写完毕设报告的“系统实现”章节,附上5张Browser截图和3张前端交互图。
它存在的意义,不是替代你的思考,而是把思考聚焦在真正有价值的地方:如何设计更合理的实体关系?怎样优化Cypher让查询更快?如果用户问“周星驰和吴孟达合作过几次”,现有模板能否支持?这些才是知识图谱问答的核心挑战,而不是卡在“为什么jieba不识别周星驰”。
所以,别把它当一个下载即用的玩具。把它当作一把已经磨好的刀——刀刃锋利,握柄舒适,你只需决定砍向哪块木头。电影领域只是示例,把movie.csv换成你的电商商品表,把person.csv换成供应商表,把acted_in关系换成supplies,这套流程依然成立。知识图谱的本质,从来不是技术堆砌,而是用图的思维,重新组织你手头的数据。现在,刀给你了,木头,就在你桌上。
简介:一套开箱即用的电影领域问答系统,底层用Neo4j构建包含电影、人物、类型三类实体及关联关系的知识图谱。提供完整原始数据:movie.csv、person.csv、genre.csv等实体表,以及person_to_movie.csv、movie_to_genre.csv等关系表,支持一键导入图数据库。代码模块分工明确——data2neo4j.py完成数据清洗与入库;process_question.py和question_classification.py负责中文问句分词、意图识别与槽位抽取;server.py和client.py搭建轻量HTTP服务,配合index.html实现浏览器端自然语言提问;配套有自定义词典userdict3.txt、分词词表vocabulary.txt、分类标签label.txt等NLP基础资源。项目含详细设计报告(Word)、Markdown说明文档、多张运行界面截图,requirements.txt已锁定Python 3.6兼容依赖。无需额外配置,解压后按文档执行几条命令即可启动服务,支持如‘王家卫导演过哪些爱情片’‘梁朝伟合作最多的演员是谁’等多样化查询,答案从图谱中路径匹配生成,结构清晰可读。适合高校课程设计、毕设落地或知识图谱+问答技术入门实操。

1423

被折叠的 条评论
为什么被折叠?



