[PYTHON] Génération automatique de quiz avec COTOHA

1. Au début

Qiita a fait ses débuts avec des choses lol. Auparavant, j'essayais de générer automatiquement un QA quiz à l'aide de API de traitement du langage naturel / COTOHA fourni par NTT Communications. Chaque fois, un projet cadeau avec M. Qiita a eu lieu, donc je suis vraiment déçu. C'est pourquoi j'écrirai sur la génération automatique de quiz QA à l'aide d'articles de presse.

2. Environnement de développement

*Google Colaboratory *Python3

3. 3. Aperçu

Ce que je veux faire, par exemple

Une manifestation du mouvement Yellow Best en France pour protester contre l'administration Macron a eu lieu le 18 pendant 27 semaines consécutives. Selon le ministère de l'Intérieur ...

Si vous pouvez lire des informations telles que "qui" et "où" bien quand il y a un article comme

Question: Où le Mouvement Yellow Best a-t-il protesté contre l'administration Macron la 18e et la 27e semaine consécutive? Réponse: France

La motivation est que vous pouvez créer automatiquement des phrases de questions et des réponses. Laissez COTOHA prendre en charge cette «bonne» partie.

Quatre. Analyse des phrases

Jetons l'article d'exemple de phrase de plus tôt dans l'analyse syntaxique de COTOHA.

curl -H "Content-Type:application/json;charset=UTF-8" -H "Authorization:Bearer **Propre jeton**" -X POST -d '{"sentence":"Une manifestation du mouvement Yellow Best protestant contre l'administration Macron en France a eu lieu le 18 pendant 27 semaines consécutives."}' "https://api.ce-cotoha.com/api/dev/nlp/v1/parse"

La réponse ressemble à ceci. L'analyse morphologique a été menée fermement, et il a été possible d'extraire que la "France" est "[" unique "," terre "]".

{
  "result" : [ {
    "chunk_info" : {
      "id" : 0,
      "head" : 8,
      "dep" : "D",
      "chunk_head" : 0,
      "chunk_func" : 1,
      "links" : [ ]
    },
    "tokens" : [ {
      "id" : 0,
      "form" : "France",
      "kana" : "France",
      "lemma" : "France",
      "pos" : "nom",
      "features" : [ "Unique", "Sol" ],
      "dependency_labels" : [ {
        "token_id" : 1,
        "label" : "case"
      } ],
      "attributes" : { }
    }, {
      "id" : 1,
      "form" : "alors",
      "kana" : "De",
      "lemma" : "alors",
      "pos" : "Assistant de cas",
      "features" : [ "Utilisation continue" ],
      "attributes" : { }
    } ]
  }, {
    "chunk_info" : {
      "id" : 1,
      "head" : 2,
      "dep" : "D",
      "chunk_head" : 1,
      "chunk_func" : 2,
      "links" : [ ]
    },
    "tokens" : [ {
      "id" : 2,
      "form" : "Macron",
      "kana" : "Macron",
      "lemma" : "Macron",
      "pos" : "nom",
      "features" : [ ],
      "attributes" : { }
    }, {
      "id" : 3,
      "form" : "administration",
      "kana" : "Seiken",
      "lemma" : "administration",
      "pos" : "Suffixe de nomenclature",
      "features" : [ "nom" ],
      "dependency_labels" : [ {
        "token_id" : 2,
        "label" : "compound"
      }, {
        "token_id" : 4,
        "label" : "case"
      } ],
      "attributes" : { }
    }, {
      "id" : 4,
      "form" : "À",
      "kana" : "ré",
      "lemma" : "À",
      "pos" : "Assistant de cas",
      "features" : [ "Utilisation continue" ],
      "attributes" : { }
    } ]
  }

D'un autre côté, cela semble difficile à l'heure actuelle jusqu'à ce que Macron soit le nom d'une personne. De plus, étant donné que les informations sur la phrase sont prises dans un bloc appelé "chunk_info" (super !!), si une certaine phrase contient un nom de lieu, etc., réécrivez l'article original pour que la phrase (nom de lieu) soit la réponse. Si tel est le cas, cela ressemble à un quiz.

5. la mise en oeuvre

Cette fois, j'ai essayé de saisir deux modèles de nom de lieu et de personne.

import collections
import requests
import json

#Déclaration d'entrée
sentence = 'Une manifestation du mouvement Yellow Best protestant contre l'administration Macron en France a eu lieu le 18 pendant 27 semaines consécutives.'
url = 'https://api.ce-cotoha.com/api/dev/nlp/v1/parse'
headers = {'Content-Type':'application/json;charset=UTF-8','Authorization':'Bearer **Token**'}
payload={'sentence':sentence}

#Demande à COTOHA
r = requests.post(url, data=json.dumps(payload), headers=headers)

#Stocker les résultats de l'analyse de la syntaxe
data = r.json()
j = json.dumps(data["result"])
chunk_dic = json.loads(j, object_pairs_hook=collections.OrderedDict)

quiz_flug = 100
chunk_dic_len = len(chunk_dic)
token = ""

#Jugez si le nom ou le nom d'une personne est inclus pour chaque clause. Si trouvé, faites-en un candidat au quiz
for i in range(chunk_dic_len):
    dic = chunk_dic[i]
    dic_len = len(dic["tokens"])
    for j in range(dic_len):
      if "Nom" in dic["tokens"][j]["features"] and "Nom de famille" in dic["tokens"][j]["features"] and "Unique" in dic["tokens"][j]["features"]:
        #Répondez au quiz
        key_word = dic["tokens"][j]["form"]
        #Variables utilisées pour extraire les clauses de l'article d'origine
        for s in range(dic_len):
          token = token + dic["tokens"][s]["form"]
        quiz_flug = "0"

      elif "Sol" in dic["tokens"][j]["features"] and "Unique" in dic["tokens"][j]["features"]:
        key_word = dic["tokens"][j]["form"]
        for s in range(dic_len):
          token = token + dic["tokens"][s]["form"]
        quiz_flug = "1"
          
question_sentence = sentence[sentence.find(token):]
question_sentence = question_sentence.replace(token, '')

#Changer la phrase du quiz pour chaque nomenclature extraite
if quiz_flug == "0":
  question_sentence = question_sentence[:-1] + "Qui est"
elif quiz_flug == "1":
  question_sentence = question_sentence[:-1] + "Où est-ce?"
  
print("problème:",question_sentence)
print("répondre:",key_word)

Résultat d'exécution

Question: Où le Mouvement Yellow Best a-t-il protesté contre l'administration Macron la 18e et la 27e semaine consécutive?
Réponse: France

Pour le moment, l'objectif est terminé.

6. tester

Expérimentez avec divers articles.

・ Article original ①
###
#Ancienne fille du matin. Dans Talent Private, "Maman de 4 enfants" Nozomi Tsuji a annoncé le 17 qu'elle ouvrirait "Tsuji-chan Nell" et ferait ses débuts sur YouTube."
###
Question: Le 17, qui a ouvert "Tsuji-chan Nell" et a annoncé qu'il ferait ses débuts sur YouTube?
Réponse: Nozomi Tsuji
・ Article original ②
###
#Un grand journal a rapporté que le président Trump n'a pas été informé à l'avance et a exprimé sa colère à propos du retour de 14 passagers américains sur un bateau de croisière confirmé infecté par le nouveau virus corona par avion charter. C'était.
###
Question: Où le principal journal a-t-il rapporté que le président Trump était en colère sans être informé à l'avance qu'il avait renvoyé 14 personnes dans un avion charter?
Réponse: Amérique
・ Article original ③
###
#En ce qui concerne le château de Gifu, connu comme un château de montagne que Nobunaga Oda a capturé pendant la période des Royaumes combattants, la ville de Gifu a annoncé le 7 qu'elle avait découvert le mur de pierre de la tour du château (la base de la tour du château) que Nobunaga croyait avoir été construite par fouille.
###
Question: Le 7, où avez-vous annoncé que vous aviez découvert pour la première fois le mur de pierre de la tour du château (la base de la tour du château) que Nobunaga semble avoir construit lors de l'enquête de fouille?
Réponse: Gifu City

Il est difficile de dire que c'est une sortie parfaite, mais c'est un résultat qui semble possible! J'aimerais améliorer la précision tout en scrutant un peu plus les règles! !!

7. Citation

Démonstration française d'une demi-année, réduction (Kyodo News) Nozomi Tsuji annonce ses débuts sur YouTube "Utiliser ma propre expérience" pour fournir des informations et des informations sur la beauté aux mamans (Oricon News) M. Trump se met en colère sans que la personne infectée ne soit rentrée au Japon (Nippon Television (NNN)) Caractéristiques construites par Nobunaga: Ishigaki, la base de la tour du château qui a été confirmée pour la première fois au château de Gifu (Asahi Shimbun)

Recommended Posts

Génération automatique de quiz avec COTOHA
Génération automatique de documents à partir de docstring avec sphinx
Essayez facilement la génération automatique d'images avec DCGAN-tensor flow
Génération automatique de mosaïques
Génération automatique Powerpo avec python-pptx (mémo personnel)
Génération automatique de modèles de collage
Génération artificielle de données avec numpy
Génération de phrases avec GRU (keras)
Génération automatique du code de test PyCharm
Génération de légende d'image avec Chainer
[Jouons avec Python] Viser la génération automatique de phrases ~ Achèvement de la génération automatique de phrases ~
Génération de requêtes plus rapide avec SQLAlchemy ORM
Générer un mot de passe pour le manuel avec python
Génération de jetons de contre-mesure CSRF avec Python
Génération automatique de Sadamasashi Kawayanagi
J'ai essayé la génération de phrases avec GPT-2
Génération de fonctionnalités avec pandas group par
Génération d'images dégradées avec Python [1] | np.linspace
[Jouons avec Python] Viser la génération automatique de phrases ~ Effectuer une analyse morphologique ~