[PYTHON] J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE

La complémentation des graphes de connaissances a été réalisée à l'aide d'un framework open source appelé OpenKE. Comme mémo pour moi-même, je transcrirai le résultat.

Flux d'articles

  1. [Cible de cet article](https://qiita.com/yuta0919/private/b49b5a8120bd3336d1d3#%E6%9C%AC%E8%A8%98%E4%BA%8B%E3%81%AE%E5% AF% BE% E8% B1% A1)
  2. [Qu'est-ce qu'un graphe de connaissances](https://qiita.com/yuta0919/private/b49b5a8120bd3336d1d3#%E7%9F%A5%E8%AD%98%E3%82%B0%E3%83%A9%E3% 83% 95% E3% 81% A8% E3% 81% FA)
  3. Qu'est-ce qu'OpenKE
  4. [Programme à utiliser](https://qiita.com/yuta0919/private/b49b5a8120bd3336d1d3#%E5%AE%9F%E8%A1%8C%E3%83%97%E3%83%AD%E3%82 % B0% E3% 83% A9% E3% 83% A0% E3% 81% AE% E4% BD% 9C% E6% 88% 90)
  5. Résultat de l'exécution
  6. [Comparaison / Évaluation avec GitHub](https://qiita.com/yuta0919/private/b49b5a8120bd3336d1d3#%E8%AB%96%E6%96%87%E3%81%A8%E3%81%AE% E6% AF% 94% E8% BC% 83% E8% A9% 95% E4% BE% A1)
  7. Résumé

Objet de cet article

Cet article s'applique aux personnes qui relèvent de l'une des conditions suivantes.

Qu'est-ce qu'un graphe de connaissances?

Le graphe de connaissances montre la connexion de diverses connaissances en tant que structure.

** Exemple) ** (obama, born-in, Hawaii)

Données qui ont un sujet, la forme de relations et des relations d'objet telles que l'on appelle un graphe de connaissance

Si le sujet, la forme des relations et l'objet sont respectivement $ s, r et o $, ils restent de la relation entre $ s $ et $ r $ ou $ o $ et $ r $. Le but de ce temps est de deviner $ o et s $.

Qu'est-ce qu'OpenKE

OpenKE est une source ouverte créée par THUNLP](http://nlp.csai.tsinghua.edu.cn/site2/index.php/zh). C'est un cadre.

C'est un framework dédié aux graphes de connaissances écrits en C ++ et python, et semble actuellement prendre en charge pytorch et tensorflow.

Pour plus de détails, reportez-vous au lien github ci-dessous ou à la page d'accueil d'OpenKE. Page d'accueil d'OpenKE OpenKE github

Programme à utiliser

Ensuite, le programme à exécuter réellement est indiqué ci-dessous. Cette fois, nous utiliserons train_distmult_WN18.py dans les exemples.

import openke
from openke.config import Trainer, Tester
from openke.module.model import DistMult
from openke.module.loss import SoftplusLoss
from openke.module.strategy import NegativeSampling
from openke.data import TrainDataLoader, TestDataLoader

# dataloader for training
train_dataloader = TrainDataLoader(
	in_path = "./benchmarks/WN18RR/",
	nbatches = 100,
	threads = 8,
	sampling_mode = "normal",
	bern_flag = 1,
	filter_flag = 1,
	neg_ent = 25,
	neg_rel = 0
)

# dataloader for test
test_dataloader = TestDataLoader("./benchmarks/WN18RR/", "link")

# define the model
distmult = DistMult(
	ent_tot = train_dataloader.get_ent_tot(),
	rel_tot = train_dataloader.get_rel_tot(),
	dim = 200
)

# define the loss function
model = NegativeSampling(
	model = distmult,
	loss = SoftplusLoss(),
	batch_size = train_dataloader.get_batch_size(),
	regul_rate = 1.0
)


# train the model
trainer = Trainer(model = model, data_loader = train_dataloader, train_times = 2000, alpha = 0.5, use_gpu = True, opt_method = "adagrad")
trainer.run()
distmult.save_checkpoint('./checkpoint/distmult.ckpt')

# test the model
distmult.load_checkpoint('./checkpoint/distmult.ckpt')
tester = Tester(model = distmult, data_loader = test_dataloader, use_gpu = True)
tester.run_link_prediction(type_constrain = False)

test_dataloader est "./benchmarks/WN18RR/" le modèle est distmult La fonction de perte est SoftplusLoss () Je vais le laisser. dim prend la forme 200. Tous sont les mêmes que lors du téléchargement.

Il existe plusieurs autres types de programmes exécutables dans les exemples.

Concernant les paramètres

Trois parties peuvent être modifiées: le jeu de données, le modèle et la perte.

Assurez-vous que "./benchmarks/WN18RR/" dans train_dataloader et test_dataloader sont identiques. Vous pouvez utiliser l'ensemble de données dans le lien ci-dessous pour ces benchmarks. benchmarks

Les variables de TrainDataLoader peuvent être modifiées librement. En plus du nomal, cross peut être sélectionné pour sampling_mode. (Le réglage croisé peut nécessiter une légère modification du réglage plus profond.)

Pour le modèle, veuillez vous référer au lien ci-dessous. Modèles disponibles

En plus de Softplus Loss, la perte de marge et la perte sigmoïde peuvent être utilisées pour la perte.

Résultat d'exécution

Le résultat de l'exécution est le suivant. Je n'ai pas de machine GPU, je l'ai donc exécutée avec google colaboratory. スクリーンショット 2020-05-27 19.13.33.png

Comparaison / évaluation avec GitHub

Nous allons le comparer avec le tableau Expériences sur GitHub. Le tableau semble être la valeur à Hits @ 10 (filtre). スクリーンショット 2020-05-28 13.14.24.png

La moyenne des résultats expérimentaux était de 0,463306, donc la précision était de 0,015 inférieure à la valeur de Dist Mult sur GitHub.

L'amélioration consiste à adopter une autre fonction de perte. De plus, je pense qu'une façon est de changer les valeurs de neg_ent, neg_rel et alpha.

Résumé

Cette fois, j'ai essayé de compléter le graphe de connaissances en utilisant OpenKE. En conséquence, nous n'avons pas obtenu les résultats escomptés, mais il y avait place à l'amélioration, nous aimerions donc commencer les points d'amélioration indiqués ci-dessus.

Merci d'avoir lu jusqu'au bout.

Recommended Posts

J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
J'ai essayé d'approcher la fonction sin en utilisant le chainer
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'estimer la section.
J'ai essayé de simuler l'optimisation des publicités à l'aide de l'algorithme Bandit
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
J'ai essayé d'approcher la fonction sin en utilisant chainer (re-challenge)
J'ai essayé de sortir le journal d'accès au serveur en utilisant Node.js
J'ai essayé d'utiliser Azure Speech to Text.
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé de résumer la modélisation graphique.
J'ai essayé de numériser le tampon estampé sur papier en utilisant OpenCV
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé d'utiliser l'API BigQuery Storage
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé d'analyser la carte du Nouvel An par moi-même en utilisant python
vprof - J'ai essayé d'utiliser le profileur pour Python
J'ai essayé d'optimiser le séchage du linge
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de synthétiser des fichiers WAV en utilisant Pydub.
J'ai essayé d'utiliser PyCaret à la vitesse la plus rapide
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'utiliser le module Datetime de Python
Qiita Job J'ai essayé d'analyser le travail
J'ai essayé d'utiliser le filtre d'image d'OpenCV
LeetCode j'ai essayé de résumer les plus simples
J'ai essayé d'utiliser la bibliothèque de programmation fonctionnelle toolz
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser anytree
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser coturn
J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser "Anvil".
J'ai essayé d'utiliser Hubot
J'ai essayé d'utiliser ESPCN
J'ai essayé d'utiliser openpyxl
J'ai essayé d'utiliser Ipython
J'ai essayé de déboguer.
J'ai essayé d'utiliser ngrok