[PYTHON] Aux personnes qui «recrutent mais ne recrutent pas»

** Twitter présente l'intelligence artificielle et des articles écrits dans d'autres médias **, donc si vous voulez en savoir plus sur l'intelligence artificielle, etc. ** N'hésitez pas à suivre! ** **

<! - <Mis à jour le 25/02 (mar.)> ** Ajout de la syntaxe Shinjiro Koizumi [https://qiita.com/omiita/items/0f811f15e569bf2539b8#6-%E7%95%AA%E5%A4% 96% E7% B7% A8% E5% B0% 8F% E6% B3% 89% E9% 80% B2% E6% AC% A1% E9% 83% 8E% E6% A7% 8B% E6% 96% 87) Fait. ** ->

1. J'enseigne, mais je n'explique pas

Au Premier ministre Abe ** "Je recrute, mais je ne recrute pas" ** remarque Inspiré par **, j'ai créé un programme qui convertit automatiquement les phrases saisies en phrases qui sont "recruter mais pas recruter" **!

Si vous entrez «Recruter des personnes», la phrase sera convertie en «Nous recrutons des personnes, mais nous ne recrutons pas».

Exemple de voir des fleurs de cerisier


$ python abe.py "Voir les fleurs de cerisier"
Je vois les fleurs de cerisier, mais je ne les ai pas vues

2. Je l'utilise, mais je ne l'utilise pas

Ce que j'ai utilisé Utilisation
Python 3.7.0 code
COTOHA API Analyse morphologique et calcul de similarité
WordNet Synonymes
Dictionnaire IPA Formulaire d'utilisation verbale

3. Je vous enseigne le mécanisme en détail, mais je ne l'explique pas en détail.

目的

3.1 Extrait de la nomenclature et des verbes

ステップ1

3.2 Liste des synonymes

ステップ2

3.3 Extraire uniquement la nomenclature

ステップ3

3.4 Mesure de la similitude entre le texte original et les synonymes

ステップ4

Conversion en connexion continue 3,5

ステップ5

3.6 Combiner

ステップ6

4. Affiche le code mais ne montre pas

<détails>

Code (cliquez) </ summary>

Import

abe.py


# -*- coding:utf-8 -*-

import os
import urllib.request
import json
import configparser
import codecs
import csv
import sys
import sqlite3
from collections import namedtuple
import types

COTOHA

abe.py


#/_/_/_/_/_/_/_/_/_/_/_/_/COTOHA_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#Le code de cette partie est tiré d'ici.
# https://qiita.com/gossy5454/items/83072418fb0c5f3e269f

class CotohaApi:
    #Initialisation
    def __init__(self, client_id, client_secret, developer_api_base_url, access_token_publish_url):
        self.client_id = client_id
        self.client_secret = client_secret
        self.developer_api_base_url = developer_api_base_url
        self.access_token_publish_url = access_token_publish_url
        self.getAccessToken()

    #Obtenez un jeton d'accès
    def getAccessToken(self):
        #Spécification d'URL d'acquisition de jeton d'accès
        url = self.access_token_publish_url

        #Spécification d'en-tête
        headers={
            "Content-Type": "application/json;charset=UTF-8"
        }

        #Demander les spécifications du corps
        data = {
            "grantType": "client_credentials",
            "clientId": self.client_id,
            "clientSecret": self.client_secret
        }
        #Encoder la spécification du corps de la requête en JSON
        data = json.dumps(data).encode()

        #Demande de génération
        req = urllib.request.Request(url, data, headers)

        #Envoyez une demande et recevez une réponse
        res = urllib.request.urlopen(req)

        #Obtenir le corps de la réponse
        res_body = res.read()

        #Décoder le corps de la réponse à partir de JSON
        res_body = json.loads(res_body)

        #Obtenir un jeton d'accès à partir du corps de la réponse
        self.access_token = res_body["access_token"]


    #API d'analyse syntaxique
    def parse(self, sentence):
        #Spécification de l'URL de l'API d'analyse syntaxique
        url = self.developer_api_base_url + "v1/parse"
        #Spécification d'en-tête
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        #Demander les spécifications du corps
        data = {
            "sentence": sentence
        }
        #Encoder la spécification du corps de la requête en JSON
        data = json.dumps(data).encode()
        #Demande de génération
        req = urllib.request.Request(url, data, headers)
        #Envoyez une demande et recevez une réponse
        try:
            res = urllib.request.urlopen(req)
        #Que faire si une erreur se produit dans la demande
        except urllib.request.HTTPError as e:
            #Si le code d'état est 401 Non autorisé, réacquérir le jeton d'accès et demander à nouveau
            if e.code == 401:
                print ("get access token")
                self.access_token = getAccessToken(self.client_id, self.client_secret)
                headers["Authorization"] = "Bearer " + self.access_token
                req = urllib.request.Request(url, data, headers)
                res = urllib.request.urlopen(req)
            #Si l'erreur est différente de 401, la cause est affichée.
            else:
                print ("<Error> " + e.reason)

        #Obtenir le corps de la réponse
        res_body = res.read()
        #Décoder le corps de la réponse à partir de JSON
        res_body = json.loads(res_body)
        #Obtenir le résultat de l'analyse à partir du corps de la réponse
        return res_body


    #API de calcul de similarité
    def similarity(self, s1, s2):
        #Spécification de l'URL de l'API de calcul de similarité
        url = self.developer_api_base_url + "v1/similarity"
        #Spécification d'en-tête
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        #Demander les spécifications du corps
        data = {
            "s1": s1,
            "s2": s2
        }
        #Encoder la spécification du corps de la requête en JSON
        data = json.dumps(data).encode()
        #Demande de génération
        req = urllib.request.Request(url, data, headers)
        #Envoyez une demande et recevez une réponse
        try:
            res = urllib.request.urlopen(req)
        #Que faire si une erreur se produit dans la demande
        except urllib.request.HTTPError as e:
            #Si le code d'état est 401 Non autorisé, réacquérir le jeton d'accès et demander à nouveau
            if e.code == 401:
                print ("get access token")
                self.access_token = getAccessToken(self.client_id, self.client_secret)
                headers["Authorization"] = "Bearer " + self.access_token
                req = urllib.request.Request(url, data, headers)
                res = urllib.request.urlopen(req)
            #Si l'erreur est différente de 401, la cause est affichée.
            else:
                print ("<Error> " + e.reason)

        #Obtenir le corps de la réponse
        res_body = res.read()
        #Décoder le corps de la réponse à partir de JSON
        res_body = json.loads(res_body)
        #Obtenir le résultat de l'analyse à partir du corps de la réponse
        return res_body

Convertir en connexion continue

abe.py


#/_/_/_/_/_/_/_/_/_/_/_/_/CONVERSION_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

def convert(word):
    file_name = "./data/Verb.csv"
    with open(file_name,"r") as f:
        handler = csv.reader(f)
        for row in handler:
            if word == row[10]: #Découverte des paroles de la partie
                if "Connexion continue" in row[9]: #Découverte de l'utilisation
                    return row[0]
    return None

Synonymes

abe.py


#/_/_/_/_/_/_/_/_/_/_/_/_/SYNONYM_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#Le code de cette partie est tiré d'ici.
# https://www.yoheim.net/blog.php?q=20160201

conn = sqlite3.connect("./data/wnjpn.db")

Word = namedtuple('Word', 'wordid lang lemma pron pos')

def getWords(lemma):
  cur = conn.execute("select * from word where lemma=?", (lemma,))
  return [Word(*row) for row in cur]


Sense = namedtuple('Sense', 'synset wordid lang rank lexid freq src')

def getSenses(word):
  cur = conn.execute("select * from sense where wordid=?", (word.wordid,))
  return [Sense(*row) for row in cur]

Synset = namedtuple('Synset', 'synset pos name src')

def getSynset(synset):
  cur = conn.execute("select * from synset where synset=?", (synset,))
  return Synset(*cur.fetchone())

def getWordsFromSynset(synset, lang):
  cur = conn.execute("select word.* from sense, word where synset=? and word.lang=? and sense.wordid = word.wordid;", (synset,lang))
  return [Word(*row) for row in cur]

def getWordsFromSenses(sense, lang="jpn"):
  synonym = {}
  for s in sense:
    lemmas = []
    syns = getWordsFromSynset(s.synset, lang)
    for sy in syns:
      lemmas.append(sy.lemma)
    synonym[getSynset(s.synset).name] = lemmas
  return synonym

def getSynonym (word):
    synonym = {}
    words = getWords(word)
    if words:
        for w in words:
            sense = getSenses(w)
            s = getWordsFromSenses(sense)
            synonym = dict(list(synonym.items()) + list(s.items()))
    return synonym

Main

abe.py


#/_/_/_/_/_/_/_/_/_/_/_/_/MAIN_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
if __name__ == '__main__':
    #Obtenez l'emplacement du fichier source
    APP_ROOT = os.path.dirname(os.path.abspath( __file__)) + "/"

    #Obtenir la valeur définie
    config = configparser.ConfigParser()
    config.read(APP_ROOT + "config.ini")
    CLIENT_ID = config.get("COTOHA API", "Developer Client id")
    CLIENT_SECRET = config.get("COTOHA API", "Developer Client secret")
    DEVELOPER_API_BASE_URL = config.get("COTOHA API", "Developer API Base URL")
    ACCESS_TOKEN_PUBLISH_URL = config.get("COTOHA API", "Access Token Publish URL")

    #Instanciation de l'API COTOHA
    cotoha_api = CotohaApi(CLIENT_ID, CLIENT_SECRET, DEVELOPER_API_BASE_URL, ACCESS_TOKEN_PUBLISH_URL)

    #Déclaration à analyser
    if len(sys.argv) >= 2:
        sentence = sys.argv[1]
    else:
        raise TypeError

    #Prenez un verbe de la phrase originale et convertissez-le en une connexion de forme continue
    result = cotoha_api.parse(sentence)
    ret = ""
    verb = ""
    for chunk in result["result"]:
        for token in chunk["tokens"]:
            if token["pos"] == "Tronc de verbe":
                verb = token["lemma"]
                form = token["form"]
                conv_verb = convert(verb)
                if conv_verb==None:
                    ret += form
                else:
                    ret += conv_verb

                if ret[-1] == "Hmm":
                    ret += "Mais"
                else:
                    ret += "Oui mais"
                break
            else:
                ret += token["form"]

    #Prendre des synonymes pour les verbes
    synonym = getSynonym(verb)
    noun = ""
    sim = 0.

    #Extraire les synonymes de la nomenclature la plus similaire
    for syns in synonym.values():
        for syn in syns:
            result = cotoha_api.parse(syn)['result'][0]['tokens'][0]
            if result['pos'] == 'nom':
                cand = result['form']
                cand_sim = cotoha_api.similarity(sentence, cand+'Faire')['result']['score']
                if cand_sim > sim:
                    noun = result['form']
                    sim = cand_sim
    ret += noun
    ret += "Pas fini"

    #Sortie finale
    print(ret)

config.ini

config.ini


#Pour utiliser l'API COTOHA, inscrivez-vous auprès de l'API COTOHA pour obtenir un ID et SECRET,
# config.Vous devez créer un fichier ini.
# https://api.ce-cotoha.com/contents/index.html

[COTOHA API]
Developer API Base URL: https://api.ce-cotoha.com/api/dev/nlp/
Developer Client id: IDIDIDIDIDIDIDIDIDIDIDIDIDIDIDI
Developer Client secret: SECRETSECRETSECRETSECRET
Access Token Publish URL: https://api.ce-cotoha.com/v1/oauth/accesstokens

5. Je l'ai essayé, mais je ne l'ai pas fait.

$ python abe.py "boire de l'alcool"
Je bois, mais je ne le suis pas
$ python abe.py "Rentrer à la maison"
Je suis à la maison, mais je ne suis pas à la maison
$ python abe.py "Voir les fleurs de cerisier"
Je vois les fleurs de cerisier, mais je ne les ai pas vues
$ python abe.py "Manger des sushis"
Je mange des sushis, mais je ne mange pas
$ python abe.py "Invitez à la veille"
J'ai été invité à la veille, mais je ne l'ai pas fait.
** Autres choses que j'ai essayées ** (cliquez)
$ python abe.py "Reste à l'hotel"
Je reste à l'hôtel, mais je ne reste pas
$ python abe.py "répondez aux questions"
A répondu à la question mais pas de réponse
$ python abe.py "Dormir la nuit"
Je dors la nuit, mais je ne dors pas
$ python abe.py "Faire un tour dehors"
Je marche dehors, mais je ne marche pas
$ python abe.py "Voir le net"
Je regarde le net, mais je n'ai pas vérifié
$ python abe.py "Acheter de la viande"
J'achète de la viande, mais pas
$ python abe.py "Brûle le feu"
Feu brûlant, mais pas brûlant

6. <Édition supplémentaire> Syntaxe de Shinjiro Koizumi

Inspiré par M. Shinjiro Koizumi ** "J'ai dit que j'y réfléchissais, mais j'y réfléchis." ** Remarque ** J'ai créé un programme qui convertit automatiquement la phrase saisie dans la syntaxe Shinjiro Koizumi! ** **

** Si ce qui précède est appelé syntaxe Abe Shinzo **, la syntaxe Abe Shinzo est appelée "phrase affirmative + phrase négative similaire".

安倍晋三構文

D'un autre côté, ** la syntaxe de Shinjiro Koizumi est simplement "phrase affirmative + phrase affirmative similaire" **, et j'ai dit qu'elle est similaire à la syntaxe de ** Shinzo Abe, mais elle est similaire **. (Cela change simplement la manière de rejoindre l'étape 3.6.)

小泉進次郎構文

6.1 J'ai dit que j'essayais, mais j'essayais

$ python sexy.py 'Je tiens une promesse'
J'ai dit que je tenais ma promesse, mais je la tenais.
$ python sexy.py 'Hospitalité aux étrangers'
J'ai dit que je recevais des étrangers, mais je leur souhaite la bienvenue.
$ python sexy.py 'Faites une pause dans l'entreprise'
J'ai dit que j'étais absent du travail, mais je me reposais.
$ python sexy.py 'Résoudre les problèmes environnementaux'
J'ai dit que je travaillais sur les questions environnementales, mais j'y suis confronté.
$ python sexy.py 'Détruire NHK'
J'ai dit que vous détruisez nhk, mais vous le détruisez.

7. Résumé mais non résumé

Nous avons créé un programme qui convertit automatiquement une phrase en une phrase qui dit "nous recrutons mais ne recrutons pas"! ** Nous sollicitons des "likes" et des "commentaires", mais pas **. (S'il y a une phrase qui vous intéresse, quelle sera la sortie, je vais l'essayer, alors n'hésitez pas à commenter!)

8. Je le vois, mais je n'y fais pas référence

Recommended Posts

Aux personnes qui «recrutent mais ne recrutent pas»
Les personnes familiarisées avec les programmes Android essaient le traitement multi-thread avec Python
Liens vers des personnes qui commencent tout juste l'analyse de données avec python
[YOLO v5] Détection d'objets pour les personnes masquées et celles qui ne le sont pas
Ansible, un outil d'automatisation d'infrastructure pour les personnes qui ne sont pas douées pour Ruby
Développement d'une application de calcul de table simple pour les personnes qui ne sont pas douées d'Excel
Pour ceux qui débutent en programmation mais qui ont décidé d'analyser les données avec Python
Suivez tous les utilisateurs qui ne suivent pas sur Twitter
Apprentissage automatique Une histoire sur des personnes qui ne sont pas familiarisées avec GBDT utilisant GBDT en Python
Procédure d'étude vraiment nécessaire pour ceux qui veulent étudier l'orme
[AWS IoT] Supprimer les certificats qui ne sont pas associés à des objets
Présentation de l'utilisation d'argparse pour les personnes décontractées avec le moins d'effort possible