基于知识图谱的电影知识问答系统:训练TF-IDF 向量算法和朴素贝叶斯分类器、在 Neo4j 中查询

简介: 基于知识图谱的电影知识问答系统:训练TF-IDF 向量算法和朴素贝叶斯分类器、在 Neo4j 中查询

基于知识图谱的电影知识问答系统:训练TF-IDF 向量算法和朴素贝叶斯分类器、在 Neo4j 中查询

1.项目介绍

  • 训练 TF-IDF 向量算法和朴素贝叶斯分类器,预测用户文本所属的问题类别
  • 使用分词库解析用户文本词性,提取关键词
  • 结合关键词与问题类别,在 Neo4j 中查询问题的答案
  • 通过 Flask 对外提供 RESTful API
  • 前端交互与答案展示

2.项目实操教学

2.1 数据集简介

{
  "introduction_by_movie": [
    "nm简介",
    "nm剧情简介",
    "nm的内容是什么",
    "nm讲了什么",
    "nm讲了什么故事",
    "nm演了什么",
    "nm的故事梗概是什么",
    "nm的剧情简介是什么",
    "nm的内容简介是什么",
    "nm的剧情介绍是什么",
    "nm的情节是什么",
    "nm的主要情节是什么"
  ],
  "rating_by_movie": [
    "nm的评分是多少",
    "nm得了多少分",
    "nm的评分有多少",
    "nm的评分",
    "nm得分是多少",
    "nm的分数是",
    "nm电影分数是多少",
    "nm电影评分",
    "nm评分",
    "nm的分数是多少",
    "nm这部电影的评分是多少"
  ],
  "release_date_by_movie": [
    "nm上映时间",
    "nm定档时间",
    "nm的上映时间是什么时候",
    "nm的首映时间是什么时候",
    "nm什么时候上映",
    "nm什么时候首映",
    "最早什么时候能看到nm",
    "nm什么时候在影院上线",
    "什么时候可以在影院看到nm",
    "nm什么时候在影院放映",
    "nm什么时候首播"
  ],
AI 代码解读

2.2 用户词典

Forrest Gump nm
Kill Bill: Vol. 1 nm
英雄 nm
Miami Vice nm
Indiana Jones and the Temple of Doom nm
卧虎藏龙 nm
Pirates of the Caribbean: At World's End nm
Kill Bill: Vol. 2 nm
The Matrix Reloaded nm
The Matrix Revolutions nm
Harry Potter and the Chamber of Secrets nm
Harry Potter and the Prisoner of Azkaban nm
Harry Potter and the Goblet of Fire nm
Harry Potter and the Order of the Phoenix nm
The Last Emperor nm
Harry Potter and the Half-Blood Prince nm
花样年华 nm
2046 nm
Lethal Weapon 4 nm
Hannibal Rising nm
TMNT nm
무사 nm
Anna and the King nm
满城尽带黄金甲 nm
AI 代码解读

2.3 环境依赖

jieba
neo4j
python-dotenv
scikit-learn
flask
flask-cors
gunicorn
AI 代码解读

2.4 部分代码展示

import os

from neo4j import GraphDatabase


class Database:
    """
    Neo4j 数据库访问层。

    管理数据库连接的生命周期,并提供查询接口。
    """

    def __init__(self):
        uri = os.environ["DATABASE_URI"]
        user = os.environ["DATABASE_USER"]
        password = os.environ["DATABASE_PASSWORD"]

        try:
            self._driver = GraphDatabase.driver(uri, auth=(user, password))
            self._session = self._driver.session()
        except Exception as e:
            raise Exception("数据库连接失败") from e

    def close(self):
        try:
            self._session.close()
            self._driver.close()
        except Exception as e:
            raise Exception("数据库断开失败") from e

    def find_one(self, query: str, **parameters):
        result = self._session.run(query, parameters).single()
        return result.value() if result else None

    def find_many(self, query: str, **parameters):
        return self._session.run(query, parameters).value()


if __name__ == "__main__":
    import dotenv

    dotenv.load_dotenv()

    database = Database()
    genres = database.find_many(
        """
        MATCH (m:Movie)-[BELONGS_TO]->(g:Genre)
        WHERE m.name = $movie_name
        RETURN g.name
        """,
        movie_name="卧虎藏龙",
    )
    database.close()

    print(genres)
AI 代码解读
import json
import os

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB

TRAIN_DATASET_PATH = os.path.join("data", "train.json")

jieba.setLogLevel("ERROR")


def normalize(sentence: str):
    return " ".join(jieba.cut(sentence))


class BaseClassifier:
    """
    底层分类器。

    使用 TF-IDF 向量化文本,然后使用朴素贝叶斯预测标签。
    """

    def __init__(self):
        self._vectorizer = TfidfVectorizer()
        self._classifier = MultinomialNB(alpha=0.01)

    def _train(self, x: list, y: list):
        X = self._vectorizer.fit_transform(x).toarray()
        self._classifier.fit(X, y)

    def _predict(self, x: list):
        X = self._vectorizer.transform(x).toarray()
        return self._classifier.predict(X)


class Classifier(BaseClassifier):
    """
    问题分类器。

    根据问题中出现的关键词,将问题归于某一已知类别下。
    """

    def __init__(self):
        BaseClassifier.__init__(self)
        questions, labels = Classifier._read_train_dataset()
        self._train(questions, labels)

    def classify(self, sentence: str):
        question = normalize(sentence)
        return self._predict([question])[0]

    @staticmethod
    def _read_train_dataset():
        with open(TRAIN_DATASET_PATH, "r", encoding="utf-8") as fr:
            train_dataset: dict[str, list[str]] = json.load(fr)

        questions = []
        labels = []
        for label, sentences in train_dataset.items():
            questions.extend([normalize(sentence) for sentence in sentences])
            labels.extend([label for _ in sentences])

        return questions, labels


if __name__ == "__main__":
    classifier = Classifier()

    while True:
        sentence = input("请输入问题:").strip()
        label = classifier.classify(sentence)
        print(f"问题分类:{label}")
AI 代码解读

2.5 运行项目

backend 目录下添加环境变量文件 .env

# Neo4j 数据库地址
DATABASE_URI=

# Neo4j 用户名
DATABASE_USER=

# Neo4j 密码
DATABASE_PASSWORD=
AI 代码解读

启动后端服务。

cd backend
gunicorn app:app
AI 代码解读

frontend 目录下添加环境变量文件 .env

# 后端服务地址
VITE_API_BASE_URL=
AI 代码解读

启动前端服务。

cd frontend
npm build
npm preview
AI 代码解读

3.技术栈

3.1数据库

Neo4j

3.2核心 QA 模块

Python
Scikit-learn
Jieba

3.3后端

Python
Flask
Render

3.4前端

TypeScript
Preact
Tailwind CSS
pnpm
Vite
ESLint
Prettier

码源链接跳转见文末

码源链接跳转

更多优质内容请关注公号&知乎:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。

目录
打赏
0
0
0
0
2152
分享
相关文章
"揭秘TF-IDF算法的神奇力量:如何一招制胜,让自然语言处理焕发新生?"
【8月更文挑战第20天】自然语言处理(NLP)是AI的关键领域,旨在使计算机理解人类语言。TF-IDF是一种重要的文本特征提取方法,用于衡量词汇的重要性。算法结合词频(TF)与逆文档频(IDF),强调文档独有词汇。示例代码展示了如何利用Python的scikit-learn库实现TF-IDF,并应用于文本分类任务,通过朴素贝叶斯分类器实现高效分类。此方法广泛应用于信息检索、文本挖掘等领域。
142 0
NLP中TF-IDF算法
TF-IDF(词频-逆文档频率)是一种用于信息检索与数据挖掘的加权技术,通过评估词语在文档中的重要性来过滤常见词语,保留关键信息。本文介绍了TF-IDF的基本概念、公式及其在Python、NLTK、Sklearn和jieba中的实现方法,并讨论了其优缺点。TF-IWF是TF-IDF的优化版本,通过改进权重计算提高精度。
397 1
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
457 65
【人工智能】TF-IDF算法概述
TF-IDF算法,全称Term Frequency-Inverse Document Frequency(词频-逆文档频率),是一种在信息检索和文本挖掘领域广泛应用的加权技术。它通过评估一个词语在文档中的重要程度,来挖掘文章中的关键词,进而用于文本分析、搜索引擎优化等场景。其核心思想是:如果某个词或短语在一篇文章中出现的频率高(TF高),且在其他文章中很少出现(IDF也高),则认为这个词或短语具有很好的类别区分能力,适合用来代表这篇文章的内容。 具体而言,TF-IDF由两部分组成,即词频(TF)和逆文档频率(IDF)。词频(TF)指的是某一个给定的词在该文件中出现的频率。这个数值通常会被归一化
442 3
算法与数据结构高手养成:朴素的贪心法(中)构造法
算法与数据结构高手养成:朴素的贪心法(中)构造法
82 2
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
这篇内容介绍了编程中避免使用 for 循环的一些方法,特别是针对 Python 语言。它强调了 for 循环在处理大数据或复杂逻辑时可能导致的性能、可读性和复杂度问题。
125 6
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
推荐系统,推荐算法01,是首页频道推荐,一个是文章相似结果推荐,用户物品画像构建就是用户喜欢看什么样的文章,打标签,文章画像就是有那些重要的词,用权重和向量表示,推荐架构和业务流
推荐系统,推荐算法01,是首页频道推荐,一个是文章相似结果推荐,用户物品画像构建就是用户喜欢看什么样的文章,打标签,文章画像就是有那些重要的词,用权重和向量表示,推荐架构和业务流
算法与数据结构高手养成:朴素的贪心法(上)最优化策略
算法与数据结构高手养成:朴素的贪心法(上)最优化策略
131 1
算法与数据结构高手养成:朴素的贪心法(上)最优化策略

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问