本プロジェクトは、映画に関する知識グラフを構築し、質問応答システムを実装するものです。主な機能には、エンティティ認識、エンティティ検索、関係検索、および質問応答のモジュールが含まれます。
使用データは公開データセットから取得しています。 フロントエンドのデザインは 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. 雑談機能の追加
...