[PYTHON] Une histoire d'essayer de LT pour effectuer le codage en direct du traitement du langage naturel et de l'analyse des dépendances en un instant à partir d'un endroit vide

emballer

GiNZA, qui effectue un traitement du langage naturel de très haute précision et une analyse des dépendances, est incroyable. Avec Colaboratory, vous n'avez pas besoin de créer un environnement et vous pouvez l'utiliser rapidement avec un simple navigateur.

Pendant LT (Lightning Talk) pour souligner cette netteté Construction de l'environnement et rédaction de code sur place, traitement du langage naturel, De plus, j'ai essayé un "tour de magie" qui disait qu'il pouvait être très précis et hautement fonctionnel. À première vue, il y a une graine dans le "tour de magie" ... Parler.

Si vous lisez jusqu'au bout, vous comprendrez les deux savoir-faire suivants ・ Comment traiter le langage naturel de haute précision de zéro à 3 minutes avec GiNZA ・ Graines d'astuces pour le codage en direct avec LT

Contexte ①: GiNZA est incroyable!

"GiNZA" annoncé en avril 2019, Si vous essayez d'exécuter la bibliothèque open source de traitement en langage naturel japonais, Facile et très précis (très important), y compris la dépendance et la vectorisation, J'ai été surpris de pouvoir effectuer tout le traitement du langage naturel.

Référence: https://www.recruit.co.jp/newsroom/2019/0402_18331.html

Le grand point 1 de GiNZA: construction d'environnement facile mais haute précision par défaut

Dans le traitement du langage naturel, il est souvent assez difficile de créer un environnement. (Mecab) Ou il est difficile d'installer un dictionnaire, etc. Cependant, avec "GiNZA", ** Installation avec dictionnaire haute précision avec un pip **. De plus, en utilisant ** Colaboratory **, ** Même si vous partez d'un état complètement nul, vous pouvez facilement le déplacer avec un simple navigateur **.

Le grand point 2 de GiNZA: toutes les fonctions principales sont incluses en un seul coup

Ce n'est pas seulement une analyse morphologique. Analyse de dépendance, extraction de noms et de lieux de personnes, modèles formés pour vectoriser des phrases, etc. Une grande variété de fonctions principales peut être utilisée en une seule fois (explications diverses)

Le problème de GiNZA: je ne sais pas comment l'utiliser car il y a peu d'informations

Peut-être parce que c'est relativement nouveau, il y a encore peu d'informations et il semble difficile de les trouver. ⇒ ★ Je pensais résumer l'utilisation principale dans cet article ★

・ Les paroles des parties sont difficiles à comprendre sur la base des normes UD (Universal Dependencies) telles que "PROPN". (Vous pouvez également mettre des expressions familières telles que la nomenclature, les verbes, etc.) -Comme le résultat de l'analyse a différents attributs, lequel voulez-vous? Statut (Un sentiment qu'il a d'abondantes fonctions et n'est pas maîtrisé) ・ Un peu de savoir-faire est nécessaire pour opérer avec Colaboratory (Un peu de recherche était nécessaire pour chacune des méthodes de démarrage, méthode d'affichage des graphiques, etc.) C'est facile à comprendre en général, mais j'ai l'impression de vouloir la première introduction.

Contexte (2): astuces de codage en direct

J'ai eu l'occasion d'assister à une session d'étude LT (Lightning Talk). Je voulais vous dire la grandeur de "GiNZA", mais je voudrais le présenter normalement. ** Je ne peux pas transmettre le "sentiment rapide et facile" ** ** Surtout, cela manque d '"intérêt" **. (Toutes les personnes ne sont pas intéressées par le traitement du langage naturel)

Donc, à partir de la ** ardoise vierge ** qui vient de lancer le navigateur, Avec " ** Live Coding ** </ font>", papa sur place Je suis venu avec un ** spectacle ** qui implémente une analyse du langage naturel de haute précision. ** On a le sentiment que cela peut être fait rapidement et facilement ** ** Eh bien, cela seul peut faire une si bonne analyse! ?? Je suis surpris que ** ** La valeur à voir sur place augmentera et ce sera intéressant comme événement **.

** dans le temps en parallèle avec le discours </ font> ** ** Je n'ai pas les compétences pour coder sans erreurs! </ font> **

C'est tout! ** Laisser Python live code (mystère) ** </ font> ⇒Enfin, cela a été fait automatiquement, et ** Ochi ** a été ajouté comme histoire.

Alors L'histoire du développement d'une astuce qui la fait ressembler à du codage en direct **.

Le code sera décrit plus tard, donc si vous remplacez la pièce GiNZA, ** Comme tout le monde peut facilement vivre du code en LT ** ** Vous pouvez faire semblant! !! ** ** ~~ Quel terrifiant savoir-faire ~~

Résumé du savoir-faire de GiNZA (première histoire sérieuse)

Tout d'abord, en tant que savoir-faire de GiNZA, Aucune connaissance / environnement requis, super facile avec juste un navigateur Décrit une méthode de traitement du langage naturel haute précision et hautes performances.

Pour ce faire, recherchez «Colaboratoire» dans votre navigateur et Ouvrez "Le nouveau carnet de notes de PYTHON 3" et Exécutez simplement les 100 lignes de code suivantes ou moins dans l'ordre (Maj + Entrée). Bien sûr, c'est gratuit. Veuillez essayer cela.

De l'installation de GiNZA à un exemple d'implémentation de fonctionnalités clés J'ai fait un code qui comprend tout. (* Au moment du codage en direct, il a été réalisé avec une version simplifiée de celui-ci)

Comment installer GiNZA:

L'installation est pip uniquement. Facile avec tous les modules connexes et les données de dictionnaire.

!pip install ginza
# ★2020-01-Depuis la sortie de 15 v3, il semble qu'il ne puisse être saisi qu'avec pip comme celui-ci
#La méthode d'installation conventionnelle est la suivante. (Cela se fait à LT)
# !pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz"

En raison des caractéristiques de Colaboratory et du parcours du module, Il est nécessaire d'exécuter la commande suivante après avoir exécuté pip (magic)

import pkg_resources, imp
imp.reload(pkg_resources)

Comment utiliser GiNZA (utilisation unique des fonctions principales)

Tout d'abord, le résultat de l'exécution est affiché. De cette manière, l'analyse morphologique susceptible d'être utilisée, Analyse de la structure des dépendances (dépendance), analyse de la classification abstraite telle que le nom de la personne et le nom de lieu, Et fait un exemple de code pour afficher la visualisation en un seul coup.

ginza01.PNG

Voici la fonction qui produit ce qui précède.

#Une fonction qui affiche les principaux éléments du résultat de l'analyse de la structure de dépendance
#Charger le modèle en dehors de la fonction
#import spacy
#nlp = spacy.load('ja_ginza')
#easy_display_nlp(nlp, "Texte de test")
def easy_display_nlp(my_nlp, input_str):
  doc = my_nlp(input_str)

  ###Affichage tabulaire des résultats de l'analyse syntaxique dépendante
  result_list = []
  for sent in doc.sents:
    #Affichage des sauts de ligne pour chaque phrase (affichage délimité par les phrases)
    print(sent)

    #Analysez chaque phrase et mettez le résultat dans la liste (même s'il y a plusieurs phrases, elles sont combinées en une seule)
    for token in sent:
      #https://spacy.io/api/token
      #print(dir(token))
      #Les commentaires ne sont pas écrits sur le site officiel, mais sont interprétés, ils sont donc à titre indicatif uniquement.
      info_dict = {}
      info_dict[".i"]             = token.i             #Numéro de jeton (même s'il y a plusieurs phrases, il ne revient pas à 0 et devient un numéro de série)
      info_dict[".orth_"]         = token.orth_         #Texte original
      info_dict["._.reading"]     = token._.reading     #Lecture de pseudonyme
      info_dict[".pos_"]          = token.pos_          #Partie(UD)
      info_dict[".tag_"]          = token.tag_          #Partie(Japonais)
      info_dict[".lemma_"]        = token.lemma_        #Forme de base (après identification du nom)
      info_dict["._.inf"]         = token._.inf         #Informations d'utilisation
      info_dict[".rank"]          = token.rank          #Peut être traité comme une fréquence
      info_dict[".norm_"]         = token.norm_         #prototype
      info_dict[".is_oov"]        = token.is_oov        #Est-ce un mot non enregistré?
      info_dict[".is_stop"]       = token.is_stop       #Est-ce un mot d'arrêt?
      info_dict[".has_vector"]    = token.has_vector    #Avez-vous des informations word2vec?
      info_dict["list(.lefts)"]   = list(token.lefts)   #Résumé des mots associés(la gauche)
      info_dict["list(.rights)"]  = list(token.rights)  #Résumé des mots associés(droite)
      info_dict[".dep_"]          = token.dep_          #Relation de dépendance
      info_dict[".head.i"]        = token.head.i        #Numéro de jeton du partenaire dépendant
      info_dict[".head.text"]     = token.head.text     #Texte dépendant
      result_list.append(info_dict)
  
  #Affichez la liste des dictionnaires créés au format DataFrame sur Jupyter.
  import pandas as pd
  #pd.set_option('display.max_columns', 100)
  df = pd.DataFrame(result_list)
  from IPython.display import display
  display(df)

  ###Affichage des dépendances
  #Illustrer le format graphique de la dépendance
  #Un peu d'ingéniosité est nécessaire pour afficher directement sur le Colaboratoire
  #https://stackoverflow.com/questions/58892382/displacy-from-spacy-in-google-colab
  from spacy import displacy
  displacy.render(doc, style='dep', jupyter=True, options={'distance': 90})

  ###Visualisation de la classification abstraite
  #S'il n'y a pas de nom de lieu, etc. dans le texte saisi,
  #UserWarning: [W006]Aucune entité à visualiser trouvée dans l'avertissement d'objet Doc
  #Affichage de la classification abstraite
  ent_result_list = []
  for ent in doc.ents:
    ent_dict = {}
    ent_dict[".text"]=ent.text
    ent_dict[".start_char"]=ent.start_char
    ent_dict[".end_cahr"]=ent.end_char
    ent_dict[".label_"]=ent.label_
    ent_result_list.append(ent_dict)
  #Affichage tabulaire de DataFrame
  display(pd.DataFrame(ent_result_list))
  #Affichage au format de marquage
  displacy.render(doc, style='ent', jupyter=True, options={'distance': 90})
  
  ###Énumération des mots-clés
  #préfixe/Il sera servi sous forme de résidus, etc.
  for chunks in doc.noun_chunks:
    print(chunks,end=", ")

Cliquez ici pour savoir comment exécuter

#Exemple d'utilisation
import spacy
nlp = spacy.load('ja_ginza')

target_str = "Le bébé de Gonbei a attrapé un rhume. Bureau d'approbation des brevets de Tokyo."
easy_display_nlp(nlp, target_str)

Les résultats de l'analyse morphologique et les principaux attributs sont affichés sous forme de tableau. De plus, la dépendance et l'extraction du nom de la personne et du nom de lieu sont illustrées. Quel type d'analyse sera effectué à l'aide de cette fonction? Il est censé être utilisé lors de la première recherche.

GiNZA peut également effectuer des opérations vectorielles pour les mots / phrases

Vous pouvez également calculer la similitude en vectorisant les phrases comme indiqué ci-dessous. (Modèle formé intégré)

doc1 = nlp('Ce ramen est délicieux')
doc2 = nlp('Allons manger du curry')
doc3 = nlp('Je suis désolé de ne pas pouvoir aller à l'association des anciens')

print(doc1.similarity(doc2))
print(doc2.similarity(doc3))
print(doc3.similarity(doc1))

> 0.8385934558551319
> 0.6690503605367146
> 0.5515445470506148
> #Les deux systèmes alimentaires sont les plus similaires.

Il semble que la vectorisation des mots puisse être réalisée de la même manière. Vérifiez si vous avez des informations vectorielles avec token.has_vector Il vaut peut-être mieux envisager de revenir à la forme de base avec `` token.lemma_ ''. Pour les modèles formés au GiNZA Je ne l'ai pas encore bien vu, alors j'aimerais le vérifier plus tard.

C'est tout pour le savoir-faire de GiNZA. Aucune connaissance préalable / environnement préalable requis. Ouvrez simplement Colaboratory dans votre navigateur et exécutez le code ci-dessus dans l'ordre. ** Tout le monde peut réaliser très facilement une analyse du langage naturel de haute précision et multifonctionnelle! ** </ font>

(Exemple d'utilisation) Analyse unique de la syntaxe du parti qui protège les gens de la NHK

"La syntaxe du parti pour protéger le peuple de la NHK" Je ne peux pas vraiment comprendre ce que vous protégez de quoi. Mais ne t'inquiète pas. Vous pouvez le voir d'un seul coup. ** Oui, avec GiNZA **

target_str = "Du parti qui protège le peuple de NHK Du parti qui protège NHK Du parti qui protège le peuple de NHK Du parti qui protège le peuple de NHK Du parti qui protège le peuple du parti qui protège NHK"
easy_display_nlp(nlp, target_str)

nhkkoubun.PNG

  • Pour ceux qui veulent comprendre la syntaxe du parti qui protège le peuple de la NHK en tant qu'être humain Voir le grand article ci-dessous. https://qiita.com/MirrgieRiana/items/da7dade622770a04d8f7

(Bonus) Notez que j'étais confus avant de faire l'échantillon ci-dessus

Je ne sais pas comment l'utiliser sur Colaboratory

La simple installation de pip entraînera une erreur lors de l'exécution. Pour certains renseignements sur les aînés, redémarrez Colaboratory, Il existe des méthodes telles que, et avant d'arriver à la méthode ci-dessus, j'ai fait des allers-retours. Cependant, si vous regardez de plus près, le code ci-dessus a également été écrit sur le site officiel de GiNZA.

Au départ, je ne savais pas comment faire cela, et je vous expliquerai plus tard. nlp = spacy.load ('ja_ginza') partie, nlp = spacy.load(r'/usr/local/lib/python3.6/dist-packages/ja_ginza/ja_ginza-2.2.0') Je l'ai changé comme ça et j'ai conçu une méthode pour passer le chemin directement. Je voudrais signaler que cela fonctionne même avec cela sans avoir besoin d'exécuter du code supplémentaire. !find / | grep spacy | grep data Découvrez le chemin d'installation sur le colaboratoire de GiNZA à C'est une méthode pour spécifier le chemin absolu directement lorsque spacy.load.

Je suis confus même si les paroles des parties sont des normes UD telles que "PROPN"

Dans quelques exemples, "Vous voyez, ce mot pourrait être analysé comme PROPN!" Parce qu'il semble que l'explication était terminée. (Je ne sais pas du tout sauf si je dis «nom» ou «verbe»)

Ces classifications appelées dépendances universelles Cela semble être une norme internationale, et je n'ai tout simplement pas étudié, J'ai également rédigé des classifications japonaises et étudié la correspondance.

De plus, comme il y avait trop d'informations sur les attributs pouvant être utilisées après l'analyse, Le format tabulaire du dataframe facilite la visualisation.

Je suis confus car "déplacy.render" n'est pas affiché dans Colabo

Si vous utilisez normalement l'affichage graphique (déplacy.render) de l'extraction des dépendances et des noms de personnes Serving on http://0.0.0.0:5000 ... Et ainsi de suite, le serveur d'affichage démarre, Il semble que le flux consiste à accéder au serveur et à voir la figure, J'ai paramétré l'option pour afficher directement dans le Colaboratoire.

C'est tout pour le savoir-faire de GiNZA.

Tout le monde peut facilement le faire ressembler à du codage en direct </ font>

Au fait, je ne veux pas vraiment vous présenter d'ici ** Le monde des mauvais garçons **. Tout d'abord, j'ai démontré un codage en direct comme celui-ci, S'il vous plaît voir la vidéo gif.

Astuces de codage en direct (partie pip de la construction de l'environnement omise) ginza_demo_itibu.gif

Résultat de l'événement

Malgré le fait de le déclarer «magique» "On dirait que je fais vraiment du codage en direct."

Je m'attends à un tsukkomi comme "Non, je ne l'ai pas vraiment frappé" Bien que je mette un mensonge que j'ai coupé un peu, "Il est facile de s'en débarrasser ..." Parce que j'ai mis trop de Kodawari en plus. Il semble que cela ressemblait à un super-enji de manière inattendue (contrairement à) ~~ Normalement, personne n'a une implémentation aussi stupide ~~

Avec GiNZA, vous pouvez facilement faire des choses avancées en quelques lignes. L'effet synergique du ** codage automatique en direct ** est incroyable!

J'ai essayé de créer un mécanisme de codage automatique en direct. </ font>

La politique de mise en œuvre est un bon mélange d'automatique et manuel

La politique principale est la saisie automatique à l'aide de pyautogui ''. Veuillez vous référer à l'article ci-dessous pour plus de détails sur l'automatisation par pyautogui ''. J'ai essayé de créer un mécanisme pour automatiser "Shakyo" et accumuler automatiquement les mérites.

Cependant, c'est "entièrement automatisé", ** Il n'y a pas du tout de sensation en direct. ** ** Il suffit d'écrire le code de manière entièrement automatique Ad-lib ne fonctionne pas, et il y a un manque de conversation.

Donc, comme une autre politique, ** La gestion des événements du clavier est importante **.

Chaque fois que j'appuie sur une commande spéciale (cette fois je la règle sur ctrl + Q) Tapez automatiquement le code d'une cellule. En d'autres termes, la sensation manuelle momentanée en commençant à écrire chaque cellule, Surtout, ** Il est important de "manuellement" uniquement "exécuter" chaque cellule! </ font> **

Avec ce mélange modéré automatique et manuel, Le codage / saisie devient automatique, tandis que ** La raison pour laquelle seul "le plaisir d'appuyer sur la touche ENTER" reste manuellement **. Afin de mener à bien tout en expliquant etc. dans la conférence Il est également parfait pour la progression d'événements tels que LT.

Comment implémenter la gestion des événements clavier

Utilisez une bibliothèque appelée clavier.

  • Ce n'est pas un laboratoire Notez qu'il est implémenté / exécuté côté PC pour la présentation.
pip install keyboard

Voir ci-dessous pour plus de détails sur les spécifications de cette bibliothèque. https://github.com/boppreh/keyboard#keyboardon_press_keykey-callback-suppressfalse

Utilisation de base de la bibliothèque de claviers

Les points les plus importants sont les suivants. (Voir tous les codes ci-dessous pour plus de détails)

keyboard.add_hotkey('ctrl+q', my_auto_func, args=(1, ) )

Ajouter des raccourcis clavier comme celui-ci Chaque fois que ctrl + q est pressé Exécutez la fonction de saisie automatique (my_auto_func) créée à l'aide de pyautogui.

Répertoriez le contenu que vous souhaitez saisir à l'avance sous forme de chaîne de caractères Dans my_auto_func, vous pouvez les afficher dans l'ordre. (La première exécution est une chaîne de caractères pour la première cellule et la deuxième fois est une chaîne de caractères pour la deuxième cellule.)

Problèmes avec la bibliothèque de claviers

Il semble que ce sera bogué si vous appuyez sur la touche "demi-largeur / pleine largeur". Il semble que la touche de raccourci soit relâchée.

Au départ, les phrases à analyser dans le traitement du langage naturel sont Je pensais le saisir manuellement. Cependant, ce problème n'a pas pu être résolu, et pour le moment, J'ai décidé de tout taper automatiquement. (Seul shift + enter de l'exécution est manuel ♪)

Points à craindre / points compliqués avec Pyautogui

Si vous essayez de saisir ":" sur autre chose qu'un clavier américain, La touche "Shift +:" est envoyée et "*" est entré. Référence: https://teratail.com/questions/79973

Bien que j'ai pris des mesures en me référant au lien ci-dessus, au final, Arrêtez de taper caractère par caractère avec la commande typewrite comme indiqué ci-dessous.

Mise en œuvre arrêtée = saisie des chaînes de caractères individuellement


pyautogui.typewrite("abcdefg", interval = 0.1)

Utilisez / via le presse-papiers comme indiqué ci-dessous Je l'ai implémenté en le collant avec juste ctrl + v.

Implémentation adoptée = toute la sortie via le presse-papiers


#Copiez les caractères dans le presse-papiers
pyperclip.copy(cp_str)
#Toutes les chaînes de caractères sont collées et enregistrées
pyautogui.hotkey('ctrl', 'v')

Si vous souhaitez entrer le japonais en raison du problème de clé "demi-largeur / pleine largeur", C'est un problème de faire un Giji Henkan comme ~~ Auto Copying ~~ C'est parce qu'il est plus facile de créer via le presse-papiers. Il est acceptable cette fois que le japonais sort directement sans passer par la conversion et n'est pas naturel.

Aussi, en colaboratoire Si vous appuyez sur "ligne de rupture", elle sera automatiquement mise en retrait, donc Pour les méthodes émulées par clé autres que le presse-papiers, Si vous ne traitez pas la chaîne de code à saisir, le retrait se déplacera. Sans le considérer dans la méthode via le presse-papier, C'est un grand mérite que vous puissiez copier et coller le code original tel quel en argument ♪

Maintenant, n'importe qui peut vivre du code en LT! ??

J'ai pensé, mais une fois que je l'ai fait et que j'ai regardé la saisie automatique, ** La plus grande erreur de calcul </ font> **.

Parce qu'il apparaît caractère par caractère à intervalles complètement égaux ** Je ne ressens pas du tout l'humanité! </ font> **

** La saisie progresse au même rythme que par le passé. </ font> ** ~~ Je n'ai pas remarqué du tout quand je faisais les sutras ~~

Même si vous visez uke en partant du principe qu'il sortira (enfin démontez-vous) ** Ce n'est pas amusant de s'en débarrasser très facilement. </ font> **

J'ai donc pensé au réglage pour créer une atmosphère naturelle.

Réglage automatique du type (exemple d'échec)

La méthode à laquelle j'ai pensé à l'origine était De pyautogui.hotkey et pyautogui.typewrite Pour rendre l'intervalle de frappe aléatoire Comment définir l'intervalle et entrer dans le sommeil avec des nombres aléatoires.

Cependant, le problème était que le type était trop lent. Il semble y avoir un "intervalle de fonctionnement minimum" dans pyautogui, Il y a toujours un certain temps d'attente pour chaque opération. Si vous actionnez chaque caractère, le type sera trop lent.

Comment attendre, comme l'intervalle et le sommeil, Comment frapper comme raccourci clavier et dactylo Plage de réglage des nombres aléatoires du temps d'attente, etc. J'en ai combiné, mais ça n'a pas l'air naturel.

Réglage automatique du type (exemple d'adoption)

En regardant le processus de saisie automatique, Plutôt que de taper à des intervalles appropriés Il semble plus naturel que plusieurs personnages apparaissent ensemble, J'ai remarqué ça. On a l'impression que les humains frappent toutes les quelques lettres en un instant.

Alors, combinez plusieurs caractères pour chaque probabilité appropriée (Autrement dit, stockez la chaîne de sortie dans le clip avant d'exécuter ctrl + v) Il a été implémenté pour produire tout à la fois. Voir tout le code ci-dessous pour une implémentation détaillée.

Même à des vitesses qui ne sont pas possibles dans la réalité (plusieurs entrées clés sont sorties à la fois) Cela avait l'air plus naturel. (C'est une impression individuelle) Avec ça, c'est comme une frappe humaine, J'ai pu implémenter la saisie automatique.

~~ J'ai commencé à travailler plus dur sur le typage naturel que sur le traitement original du langage naturel ~~ ~~ C'était un signe dangereux car c'était il y a trois jours quand le thème a été décidé ~~

Tout le code du mécanisme de codage automatique en direct

Après ces diverses études, le code suivant a été complété. Si vous remplacez la partie de la chaîne de caractères à saisir, Avec cela, n'importe qui peut réaliser une démo de style de codage en direct avec LT!

~~ J'écris que les abus sont strictement interdits, mais il semble que seuls les abus peuvent être commis ~~

Tout le code pour le codage automatique en direct


import pyautogui
import pyperclip
import time

import random

#Ajouter un événement de clavier
import keyboard
#https://github.com/boppreh/keyboard#keyboardon_press_keykey-callback-suppressfalse

#'''Il devient une chaîne de caractères telle quelle avec des guillemets triples et des sauts de ligne.
#Si vous écrivez un groupe de codes ici,
#Chaque fois que vous appuyez sur une touche de raccourci, le texte est répertorié
#La pseudo-conversion du japonais n'est pas prise en charge (car elle est facile mais gênante)

my_str_list = [

'''!pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz"
''',

'''import pkg_resources, imp
imp.reload(pkg_resources)
''',

'''import spacy
nlp = spacy.load('ja_ginza')
''',

'''
doc = nlp("Aujourd'hui, c'est une soirée pizza à Tokyo. Le bébé de Gonbei a attrapé un rhume.")
''',

'''for s in doc.sents:
  for t in s:
    info = [t.orth_, t._.reading, t.tag_]
    print(info)
''',

'''from spacy import displacy
displacy.render(doc, style='dep', jupyter=True, options={'distance': 90})
''',

'''
displacy.render(doc, style='ent', jupyter=True, options={'distance': 90})
''',

'''doc = nlp("Un parti qui protège le peuple du parti qui protège le peuple de la NHK")
displacy.render(doc, style='dep', jupyter=True, options={'distance': 90})
''',

'''doc1 = nlp('Ce ramen est délicieux')
doc2 = nlp('Allons manger du curry')
doc3 = nlp('Je suis désolé de ne pas pouvoir aller à l'association des anciens')
''',

'''print(doc1.similarity(doc2))
print(doc2.similarity(doc3))
print(doc3.similarity(doc1))
''',

]

#Variables globales
now_counter = 0

#Fonction d'exécution principale (aucun argument utilisé)
def my_auto_func(arg_val):
  global now_counter
  #Empêche le processus de se poursuivre tant que la touche utilisée pour le réglage des touches d'accès rapide est maintenue enfoncée. Attendre un peu
  #En particulier, si vous maintenez la touche de contrôle enfoncée, etc., il est facile d'entrer une autre opération, alors soyez prudent
  time.sleep(1.5)
  
  print("called: "+str(now_counter))

  #Lorsque la touche est enfoncée et qu'il n'y a rien à sortir ensuite, le processus se termine
  if now_counter >= len(my_str_list):
    print("END: finish")
    exit()
  
  cp_str = ""
  #Copier la version
  for my_char in my_str_list[now_counter]:
    #Afin d'ajuster la vitesse, j'avais l'habitude de coller plusieurs caractères en même temps dans des conditions spécifiques.
    sl_time = random.uniform(-0.03, 0.10)
    cp_str += my_char
    if sl_time < 0 :
      #Continuer sans coller
      continue
    else :
      #Copiez les caractères dans le presse-papiers
      pyperclip.copy(cp_str)
      #Toutes les chaînes de caractères sont collées et enregistrées
      pyautogui.hotkey('ctrl', 'v')
      #Celui utilisé pour coller est clair
      cp_str = ""
      #Sommeil causé par des nombres aléatoires
      time.sleep(sl_time)
  #Après avoir quitté la boucle, collez s'il en reste
  if len(cp_str) > 0 :
      #Copiez les caractères dans le presse-papiers
      pyperclip.copy(cp_str)
      #Toutes les chaînes de caractères sont collées et enregistrées
      pyautogui.hotkey('ctrl', 'v')
      #Celui utilisé pour coller est clair
      cp_str = ""
  
  
  now_counter += 1
  print("END: my_auto_func : "+str(now_counter))

#Prime. Une fonction pour gérer les erreurs lors de la démonstration
#Remettez le compteur au précédent et réécrivez le même code ou terminez-le.
def my_sub_func(arg_val):
  global now_counter
  print("called: "+"for_before")
  now_counter -=1
  
  #Si la touche est enfoncée et que la sortie est négative, le processus se termine.
  if now_counter < 0:
    print("END: finish")
    exit()
  
  print("END: my_sub_func : "+str(now_counter))

#Ci-dessous, la routine principale
#Si vous passez en pleine largeur et en demi-largeur en cours de route, il semble que l'ajout de raccourcis clavier sera bogué, alors ne le touchez pas.
#(Exécuter en mode demi-largeur)
#Lors de l'arrêt, "ctrl+Vous pouvez forcer la terminaison de ce côté Python avec "c".
if __name__ == "__main__":

  try:
    #Ajoutez un raccourci clavier et son événement une seule fois.
    #Paramètres principaux des raccourcis clavier: ne dupliquez pas d'autres raccourcis dans votre application
    keyboard.add_hotkey('ctrl+q', my_auto_func, args=(1, ) )
    
    #Paramètres des sous-raccourcis clavier: ne dupliquez pas d'autres raccourcis dans votre application
    keyboard.add_hotkey('ctrl+i', my_sub_func, args=(1, ) )

    print("Press ESC to stop.")

    keyboard.wait('esc')
    print("esc-END")

  except:
    import traceback
    print(traceback.format_exc())
    exit()

  exit()

Quel est l'attrait du codage automatique en direct?

En raison du temps limité de LT Même si vous faites une démonstration de Colaboratory Même si vous y réfléchissez, il est plus approprié de préparer le code depuis le début, C'est fou de coder en direct. Mais, ** Intéressant comme fou ** (par Akagi)

Mais en fait, le code est préparé à l'avance et cela semble dangereux ** Plaisir nommé sécurité, plaisir nommé sécurité ** (par Tonegawa) Un mécanisme à déguster.

N'importe qui avec ça ** Il peut être possible de prétendre être "superenji à première vue" **.

  • A l'origine, s'il s'agit d'une implémentation de ce niveau, s'il s'agit de Windows, Il est probablement plus facile d'utiliser un outil automatisé tel que "UWSC". Je l'ai implémenté en Python afin qu'il puisse être utilisé plus tard sur Mac. (Pas essayé sur Mac)

(Bonus) Méthode de mauvaise direction en agissant comme une astuce

La mauvaise direction est principalement utilisée pour les trucs, Un phénomène ou une technique qui dirige l'attention du public vers un autre lieu qui n'est pas prévu.

Pour lui donner un aspect "live", il est bon de "faire" les croyances du public.

・ Osez lancer manuellement le premier Colaboratoire Recherchez en tapant Colaboratory dans votre navigateur. ・ Augmentez le mouvement de shift + enter au moment de l'exécution pour accentuer la sensation manuelle ・ Lors de la saisie automatique, votre main est sur le clavier (naturellement) ・ Plutôt que d'entrer soudainement du codage en direct Si c'est ce gars-là, il pourrait être étrange de le mettre en œuvre à grande vitesse. Ça me fait réfléchir Faire semblant de créer une atmosphère de faire quelque chose d'extraordinaire, etc.

Épilogue

Traitement du langage naturel désagréable qui est très facile à faire

Avec GiNZA Très facile (navigateur uniquement / environnement non requis) Nasty (haute précision / multifonction) Être capable de traiter le langage naturel J'ai pu l'exprimer ~ Applaudissons le tonnerre ~~ Le flou du monde ~~ (Par Red Hot Chili Pepper)

Cette fois, on l'appelle en fait LT, mais le temps est assez long, 15 minutes, ~~ N'est-il pas déjà dans la gamme appelée LT? ~~ "Comment trouver des idées intéressantes" "Méthode d'apprentissage pour gérer avec la technologie" J'ai parlé de deux choses.

Je l'ai mentionné comme "une méthode d'apprentissage pour faire quelque chose avec la technologie" Pour illustrer la "méthode du crayon HB" Nous avons fait une démonstration de codage en direct cette fois.

Quelle est la méthode du crayon HB?

** Tout comme plier un crayon HB en un clin d'œil ** ** Méthode d'apprentissage que vous pouvez tenir pour acquise ** ** L'important est de "reconnaître" **

Par exemple, le traitement du langage naturel est facile, Une méthode d'apprentissage dont il suffit de reconnaître qu'il est naturel de pouvoir le faire.

Pour quelque chose (pour avoir une idée) En parlant de cela, je pense simplement que si vous le recherchez dans GiNZA, vous pouvez le faire. Si vous voulez vraiment savoir, après avoir pensé à le faire Vous pouvez revoir cet article ou vérifier GiNZA. Rien qu'en regardant ce LT, l'apprentissage est déjà terminé! ~~ Quand je pense à ce mot dans mon esprit ~~ ~~ Parce que c'est déjà fini ~~ ~~ Vous pouvez l'utiliser si vous avez "appris"! ~~

● Méthodes d'apprentissage telles que livres d'introduction / programme d'études / examens de qualification ⇒La personne qui le fait est bonne, mais je m'endors en chemin, donc je ne peux pas. C'est dur.

● Apprendre à bouger ses mains et à fabriquer soi-même quelque chose ⇒ C'est peut-être cela à la fin. Cependant, tant que le temps humain est fini, tout est impossible. Quelle est la motivation à faire?

● Méthode d'étude d'évaluation des retards ⇒ Faites-le quand vous en avez besoin, ce qui est similaire à la méthode du crayon HB, Sans l'information "Que puis-je faire si j'apprends?" Je ne peux pas trouver une idée quand j'y pense. De plus, "quand vous en avez besoin" est Personnellement, je n'aime pas l'expression parce que j'ai l'impression que c'est fait.

● Méthode du crayon HB ⇒ Dans cet article, vous ne devriez le savoir qu'en regardant l'image du résultat de l'exécution de GiNZA. Une méthode d'apprentissage du diplôme. Je me rends juste compte que cela peut être fait en 3 minutes environ. Le mérite est que c'est facile. Même si vous n'avez pas le temps de voir les détails, vous pouvez vaguement comprendre ce que vous pouvez faire, Cela a pour effet de faciliter la recherche d'idées, y compris des techniques non apprises. Vais-je l'apprendre à une date ultérieure? La motivation est susceptible de se produire.

~~ Comme l'inhalation et l'expiration de l'air! ~~ ~~ Manipuler le stand est un pouvoir mental naturel! ~~ ~~ Exactement la méthode d'apprentissage qui domine le monde ~~

Résumé

Alors cette fois, "Reconnaissons que l'analyse du langage naturel de haute précision peut être effectuée avec un simple navigateur!" "Reconnaissons que le codage en direct semi-automatique peut être démontré dans LT!" J'ai présenté deux exemples.

Quand vous avez une révélation d'idée Si cet article fonctionne un peu positivement, je ne serais pas si heureux.

Enfin, avec les développeurs GiNZA Nous tenons à exprimer notre gratitude à toutes les personnes impliquées dans l'événement.

c'est tout.