[PYTHON] J'ai appliqué le classement SIF à un document japonais et essayé d'extraire des phrases clés

Au 18 août 2020, il n'y avait aucun article dans lequel j'essayais d'appliquer le classement SIF aux documents japonais, je vais donc l'écrire au point où j'extrais effectivement des phrases clés. Je pense qu'il y a des aspérités, alors j'apprécierais que vous le signaliez.

introduction

Le document qui proposait le classement SIF et le référentiel original sont ici. • SIFRank: A New Baseline for Unsupervised Keyphrase Extraction Based on Pre-trained Language Modelsunyilgdx/SIFRank

Le code utilisé cette fois est stocké dans le référentiel suivant. • tanajp/SIFRank_ja_model

environnement

• Google Colaboratory • Python 3.6.9 • allennlp 0.8.4 • nltk 3.4.3 • torch 1.2.0 • stanza 1.0.0

Réglage initial

Tout d'abord, clonez le référentiel here disponible. Ensuite, téléchargez la version japonaise d'ELMo à partir du site AllenNLP et placez-la sous auxiliaire_data dans le dossier SIF Rank_ja_model. (Ici, vous ne pouvez télécharger que des poids.)

Cette fois, nous placerons un dossier sous Mon Drive et continuerons. Placez le dossier que vous avez cloné précédemment sous Mon Drive sur Google Drive. Ensuite, pour le paramètre de Google Colab, sélectionnez «Modifier le type d'exécution» dans «Runtime» en haut à gauche pour modifier le GPU. Sélectionnez-le et enregistrez-le.

Monter sur Google Drive

from google.colab import drive
drive.mount('/content/drive')

Si la sortie est la suivante, elle réussit.

Enter your authorization code:
··········
Mounted at /content/drive

Installation

Installez les bibliothèques requises.

!pip install -r '/content/drive/My Drive/SIFRank_ja_model/requirements.txt'

Téléchargez wordnet et le modèle japonais de strophe.


import nltk
import stanza

nltk.download('wordnet')
stanza.download('ja')

Mise en œuvre du classement SIF

test.py



import sys
sys.path.append('/content/drive/My Drive/SIFRank_ja_model')
sys.path.append('/content/drive/My Drive/SIFRank_ja_model/embeddings')
import stanza
import sent_emb_sif, word_emb_elmo
from model.method import SIFRank, SIFRank_plus

#download from https://allennlp.org/elmo
options_file = "https://exawizardsallenlp.blob.core.windows.net/data/options.json"
weight_file = "/content/drive/My Drive/SIFRank_ja_model/auxiliary_data/weights.hdf5"

ELMO = word_emb_elmo.WordEmbeddings(options_file, weight_file, cuda_device=0)
SIF = sent_emb_sif.SentEmbeddings(ELMO, lamda=1.0)
ja_model = stanza.Pipeline(
    lang="ja", processors={}, use_gpu=True
)
elmo_layers_weight = [0.0, 1.0, 0.0]

text = "Veuillez saisir le texte ici."
keyphrases = SIFRank(text, SIF, ja_model, N=5,elmo_layers_weight=elmo_layers_weight)
keyphrases_ = SIFRank_plus(text, SIF, ja_model, N=5, elmo_layers_weight=elmo_layers_weight)

print(keyphrases)
print(keyphrases_)

Résultat d'exécution

A titre d'exemple, [ANA, 500 milliards de yens sur la levée de capitaux pourparlers-Wiki News](https://ja.wikinews.org/wiki/ANA%E3%80%815000%E5%84%84%E5%86%86 % E8% A6% 8F% E6% A8% A1% E3% 81% AE% E8% B3% 87% E6% 9C% AC% E8% AA% BF% E9% 81% 94% E5% 8D% 94% E8 J'ai essayé d'extraire la phrase clé en saisissant le texte de% AD% B0).

2020-08-17 17:21:13 INFO: Loading these models for language: ja (Japanese):
=======================
| Processor | Package |
-----------------------
| tokenize  | gsd     |
| pos       | gsd     |
| lemma     | gsd     |
| depparse  | gsd     |
=======================

2020-08-17 17:21:13 INFO: Use device: gpu
2020-08-17 17:21:13 INFO: Loading: tokenize
2020-08-17 17:21:13 INFO: Loading: pos
2020-08-17 17:21:14 INFO: Loading: lemma
2020-08-17 17:21:14 INFO: Loading: depparse
2020-08-17 17:21:15 INFO: Done loading processors!
(['Banque japonaise d'investissement politique', 'Levée de capitaux', 'ana Holdings', 'Prêt', 'Institution financière privée'], [0.8466373488741734, 0.8303728302151282, 0.7858931046897192, 0.7837600983935882, 0.7821878670623081])
(['Banque japonaise d'investissement politique', 'Nihon Keizai Shimbun', 'Tout le transport aérien au Japon', 'Levée de capitaux', 'ana Holdings'], [0.8480482653338678, 0.8232344465718657, 0.8218706097094447, 0.8100789955114978, 0.8053839380458278])

C'est le résultat de l'extraction avec N = 5. Le résultat final est les phrases clés et leurs scores. Le haut est le résultat de sortie de SIF Rank et le bas est le résultat de sortie de SIF Rank +. Comme c'est un article que l'ANA a entamé des discussions sur le financement avec la Japan Policy Investment Bank et des institutions financières privées, il semble que l'extraction de phrases clés soit réussie.

À propos, tokenize, pos, lemma et depparse font respectivement référence à la tokenisation, à l'affectation des balises POS, à la conversion des mots clés et à l'analyse de la structure des dépendances, et sont en cours de traitement en pipeline par strophe.

en conclusion

J'ai rendu le classement SIF applicable aux documents japonais et je l'ai effectivement utilisé. L'analyseur peut être tout ce qui a un modèle japonais, mais cette fois j'ai utilisé la strophe. De plus, le dictionnaire de mots vides japonais utilise Slothlib. .. Vous pouvez modifier les mots vides en réécrivant japanese_stopwords.txt sous auxiliaire_data dans le dossier SIFRank_ja_model.

Les références

SIFRank: A New Baseline for Unsupervised Keyphrase Extraction Based on Pre-trained Language Modelsunyilgdx/SIFRankAllenNLPIntroduction du modèle ELMo (utilisant MeCab) qui a appris le corpus d'actualités japonaises à grande échelleVérification par comparaison de l'utilisation et de la précision du modèle ELMo (utilisant MeCab) qui a appris le corpus d'actualités commerciales japonais à grande échelleCharger ELMo appris avec AllenNLP-Rittanzu! -Slothlib

Recommended Posts

J'ai appliqué le classement SIF à un document japonais et essayé d'extraire des phrases clés
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé d'extraire des noms de joueurs et de compétences d'articles sportifs
J'ai essayé de créer un linebot (implémentation)
J'ai essayé de créer un linebot (préparation)
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai créé une API Web
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
J'ai essayé de créer une méthode de super résolution / ESPCN
J'ai essayé de créer une méthode de super résolution / SRCNN ①
J'ai implémenté DCGAN et essayé de générer des pommes
J'ai essayé de générer une chaîne de caractères aléatoire
J'ai essayé de créer une méthode de super résolution / SRCNN ③
J'ai essayé de créer une méthode de super résolution / SRCNN ②
[Introduction au PID] J'ai essayé de contrôler et de jouer ♬
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé de faire un "putain de gros convertisseur de littérature"
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai fait une bibliothèque pour bien séparer les phrases japonaises
J'ai essayé d'ajouter un post-incrément à CPython. Présentation et résumé
J'ai essayé d'implémenter un pseudo pachislot en Python
J'ai essayé de générer ObjectId (clé primaire) avec pymongo
J'ai essayé d'ajouter des appels système et des planificateurs à Linux
[Go + Gin] J'ai essayé de créer un environnement Docker
J'ai créé une bibliothèque python qui fait rouler le rang
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
J'ai essayé Kaokore, un ensemble de données japonais classique, sur EfficientNet.
Python: j'ai essayé menteur et honnête
J'ai essayé d'installer scrapy sur Anaconda et je n'ai pas pu
J'ai essayé de dessiner un diagramme de configuration à l'aide de diagrammes
J'ai créé un outil qui facilite un peu la création et l'installation d'une clé publique.
Quand j'ai essayé d'installer PIL et matplotlib dans un environnement virtualenv, j'en étais accro.
Quand j'ai essayé de créer un environnement Rails sur WSL2 (Ubuntu 20.04LTS), j'ai trébuché et suis tombé.
J'ai essayé de créer une commande de recherche de documents slack à l'aide de Kendra annoncée immédiatement à re: Invent 2019
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
[Dessin graphique] J'ai essayé d'écrire un graphique à barres multi-séries avec matplotlib et seaborn
J'ai essayé de déboguer.
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
J'ai essayé de prédire et de soumettre les survivants du Titanic avec Kaggle
J'ai essayé d'extraire des caractères des sous-titres (OpenCV: édition tesseract-ocr)
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
J'ai essayé d'obtenir les informations du Web en utilisant "Requests" et "lxml"
[Chaîne de Markov] J'ai essayé de lire les citations en Python.
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
J'ai essayé "Comment obtenir une méthode décorée en Python"