Neo4j、Django、PyTorch、py2neoを使用した映画知識グラフと質問応答システム

本プロジェクトは、映画に関する知識グラフを構築し、質問応答システムを実装するものです。主な機能には、エンティティ認識、エンティティ検索、関係検索、および質問応答のモジュールが含まれます。

使用データは公開データセットから取得しています。 フロントエンドのデザインは https://github.com/qq547276542/Agriculture_KnowledgeGraph を参考にさせていただきました。

完全なプロジェクトはこちらからご覧いただけます:https://github.com/jiangnanboy/movie_knowledge_graph_app

エンティティと関係の準備と構築

注:以下のデータインポートはNeo4jコンソール上で実行します。data/nodeとdata/relationをneo4jインストールディレクトリのimportフォルダに配置してください。

一. IDに対するユニーク制約の作成

1.CREATE CONSTRAINT ON (c:Country) ASSERT c.id IS UNIQUE

2.CREATE CONSTRAINT ON (m:Movie) ASSERT m.id IS UNIQUE

3.CREATE CONSTRAINT ON (p:Person) ASSERT p.id IS UNIQUE

二. nameに対するインデックスの作成

1.CREATE INDEX ON :Country(name)

2.CREATE INDEX ON :Movie(name)

3.CREATE INDEX ON :Person(name)

三. ノードの作成

1.Countryノード
CALL apoc.periodic.iterate(
    'CALL apoc.load.csv("node/Country.csv", {header:true, sep:",", ignore:["label"]}) YIELD map AS row RETURN row',
    'CREATE (p:Country) SET p=row',
    {batchSize:1000, iterateList:true, parallel:true})

2.Movieノード
CALL apoc.periodic.iterate(
    'CALL apoc.load.csv("node/Movie.csv", {header:true, sep:",", ignore:["label"]}) YIELD map AS row RETURN row',
    'CREATE (p:Movie) SET p=row',
    {batchSize:1000, iterateList:true, parallel:true})

3.Personノード
CALL apoc.periodic.iterate(
    'CALL apoc.load.csv("node/Person.csv", {header:true, sep:",", ignore:["label"]}) YIELD map AS row RETURN row',
    'CREATE (p:Person) SET p=row',
    {batchSize:1000, iterateList:true, parallel:true})

四. 関係の作成

1.関係:Movie-[:ACTOR]->Person
CALL apoc.periodic.iterate(
    'CALL apoc.load.csv("relation/actor.csv", {header:true, sep:","}) YIELD map AS row MATCH (start:Movie{id:row.start_id}), (end:Person{id:row.end_id}) RETURN start,end',
    'CREATE (start)-[:ACTOR]->(end)',
    {batchSize:1000, iterateList:true, parallel:false})

2.関係:Movie-[:COMPOSER]->Person
CALL apoc.periodic.iterate(
    'CALL apoc.load.csv("relation/composer.csv", {header:true, sep:","}) YIELD map AS row MATCH (start:Movie{id:row.start_id}), (end:Person{id:row.end_id}) RETURN start,end',
    'CREATE (start)-[:COMPOSER]->(end)',
    {batchSize:1000, iterateList:true, parallel:false})

3.関係:Movie-[:DIRECTOR]->Person
CALL apoc.periodic.iterate(
    'CALL apoc.load.csv("relation/director.csv", {header:true, sep:","}) YIELD map AS row MATCH (start:Movie{id:row.start_id}), (end:Person{id:row.end_id}) RETURN start,end',
    'CREATE (start)-[:DIRECTOR]->(end)',
    {batchSize:1000, iterateList:true, parallel:false})

4.関係:Movie-[:DISTRICT]->Country
CALL apoc.periodic.iterate(
    'CALL apoc.load.csv("relation/district.csv", {header:true, sep:","}) YIELD map AS row MATCH (start:Movie{id:row.start_id}), (end:Country{id:row.end_id}) RETURN start,end',
    'CREATE (start)-[:DISTRICT]->(end)',
    {batchSize:1000, iterateList:true, parallel:false})

五. 分野とエンティティ認識用のpyhanlpのインストール

1. HanLPモデルとjarファイルをAnaconda3\Lib\site-packages\pyhanlp\staticディレクトリに配置します。

2. カスタム辞書ファイル(data/custom_dict/俳優名.txt, data/custom_dict/映画名.txt, data/custom_dict/映画ジャンル.txt, data/custom_dict/other.txt)をAnaconda3\Lib\site-packages\pyhanlp\static\data\dictionary\customディレクトリに配置します。

3. カスタム辞書設定ファイルD:\Anaconda3\Lib\site-packages\pyhanlp\static\hanlp.propertiesを以下のように修正します:
    CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 現代中国語補足語彙.txt; 全国地名大全.txt ns; 人名辞書.txt; 企業名辞書.txt; 上海地名.txt ns; 映画ジャンル.txt ng; 映画名.txt nm; 俳優名.txt nnt; other.txt;data/dictionary/person/nrf.txt nrf;

プロジェクト構造

.
├── data
│   ├── custom_dict  // カスタム辞書
│   ├── node        // 映画ノードデータ
│   └── relation    // 映画関係データ
│
├── intent_classification
│   ├── classification_data  // 意図分類トレーニングデータ
│   ├── pytorch             // PyTorchニューラルネットワーク分類モデル
│   └── scikit_learn        // 伝統的機械学習モデル
│
├── movie_kg     // Djangoプロジェクトディレクトリ
│   ├── Model    // モデル層:Neo4jとのインタラクション、クエリなどのコア機能を実装
│   ├── movie_kg  // ページロジック(View)
│   ├── static   // 静的リソース
│   ├── templates // HTMLページ
│   └── util     // データとモデルの事前ロードを含む
.

機能モジュール

一. エンティティ認識

主に人物、場所、組織、映画名、スター名を認識します

二. エンティティ検索

映画名または俳優名を入力すると、直接の関係をグラフで表示します

三. 関係検索

4種類の主要なエンティティ関係:actor、composer、director、district
異なる関係タイプを選択し、映画名または俳優名を入力すると、グラフ表示が提供されます

四. 映画質問応答

1. 分類モデルを使用してユーザー入力の質問を意図認識します

(1). トレーニングデータはintent_classification\classification_data\classification_segment_data.txtにあります

(2). 合計16の意図カテゴリ:intent_classification\classification_data\question_classification.txtを参照

(3). 分類モデルは複数あり、ここではPyTorchのフィードフォワードネットワークを使用して分類トレーニングを行います
    トレーニングコード:intent_classification\pytorch\feedforward_network\train.ipynb
    
    予測コード:intent_classification\pytorch\feedforward_network\predict.ipynb

2. 認識された意図をCypher言語に変換し、Neo4jでクエリを実行して回答を取得します
    分類モデルを使用してユーザーの質問の意図カテゴリを予測し、異なる意図カテゴリを異なるCypher言語に変換して、Neo4jから回答を取得します。

今後の計画

1. PyTorchの深層モデルを使用したエンティティ認識の実装
2. より多くのトレーニングデータを追加し、TextCNN、BERTなどの他の深層モデルを試す
3. 映画に関するニュース記事をページに追加し、深層モデルを使用してエンティティと関係を自動抽出し、グラフ表示する
4. 多ラウンド対話機能の追加
5. 雑談機能の追加
...

タグ: Neo4j Django PyTorch 知識グラフ 質問応答システム

7月28日 23:56 投稿