[PYTHON] Package PyPI pour une utilisation super facile de Cotoha sur Google colab

2020/04/10 Le package PyPI est sorti!

Pour plus d'informations ici (je suis très heureux d'avoir une étoile!)

Si vous souhaitez l'utiliser rapidement, veuillez vous référer au code ci-dessous.

$ pip install cotoha_at_python

from cotohacall.main  import cotoha_call
import os

os.environ['CLIENT_ID'] = 'Your ID'
os.environ['CLIENT_SECRET'] = 'Ypur Secret'

sentence = 'Un service d'API qui réalise une analyse très précise du langage naturel du japonais. Vous pouvez facilement utiliser la technologie d'analyse du langage naturel qui utilise les résultats de recherche du groupe NTT depuis plus de 40 ans avec l'API COTOHA.'
cotoha_call('keyword', sentence)

# Return
"""
[{'form': 'Haute précision', 'score': 20.0},
 {'form': 'La concrétisation', 'score': 16.8278},
 {'form': 'Facile', 'score': 10.8133},
 {'form': 'résultat de la recherche', 'score': 10.0},
 {'form': 'cotoha api', 'score': 10.0}]
"""

Préface

Déjà une explication très simple sur la façon d'utiliser COTOHA (j'ai essayé d'utiliser l'API COTOHA qui aurait été facile à gérer le traitement du langage naturel en Python et "Mentos et Le résultat d'avoir COTOHA résumer "Memories of Go". Avec le tutoriel le plus rapide de COTOHA)

[Plan de présentation de l'API Qiita x COTOHA] Je l'ai écrit moi-même ・ Parce qu'il est difficile de créer un environnement, utilisez Google Colab! ・ Vous pouvez l'utiliser avec une seule copie sans penser à rien!

Je voulais quelque chose comme ça, alors je l'ai publié sous forme d'article.

Si vous lisez cet article, vous pourrez l'analyser instantanément avec un seul exemplaire ...! (Devrait).

Ce que vous pouvez faire avec cette copie + exemple d'implémentation

python


cotoha_call("ne", "Je veux manger du tonnerre noir")

Si vous entrez Le résultat de l'analyse "** Black Thunder veut manger **" (il s'agit d'une extraction d'expression unique) est renvoyé.

===> Extraction d'expression unique ===> {'message': '', 'result': [{'begin_pos': 0, 'class': 'ART', 'end_pos': 8, 'extended_class': 'Product_Other', 'form': 'Black Thunder', 'source': 'basic', 'std_form': 'Black Thunder'}], 'status': 0}

Le "ne" peut être changé en (il devrait couvrir tous les apis disponibles chez les développeurs)

Nom de l'API contribution
Analyse parse
Extraction d'expression unique ne
Extraction de mots-clés keyword
Analyse de correspondance coref
Calcul de similarité simi
Jugement de type de phrase sen_type
Estimation des attributs utilisateur(β) user_at
Suppression de la stagnation(β) filter
Détection d'erreur de reconnaissance vocale(β) detect
Analyse des émotions senti
emballer(β) summary

Quand j'essaye tout en utilisant l'instruction for, ça ressemble à ceci →

python


for api_type in ["ne", "parse", "coref", "keyword", "simi", "sen_type", "user_at", "filter", "detect", "senti", "summary"]:
    cotoha_call(api_type, "Je veux manger du tonnerre noir.")
    print("\n") #Des pauses pour rendre les résultats plus visibles
print("Analyse terminée!")

<détails>

Sortie </ summary>

===> Extraction d'expression unique ===> {'message': '', 'result': [{'begin_pos': 0, 'class': 'ART', 'end_pos': 8, 'extended_class': 'Product_Other', 'form': 'Black Thunder', 'source': 'basic', 'std_form': 'Black Thunder'}], 'status': 0}

===> Analyse ===> {'message': '', 'result': [{'chunk_info': {'chunk_func': 2, 'chunk_head': 1, 'dep': 'D', 'head': 1, 'id': 0, 'links': []}, 'tokens': [{'attributes': {}, 'features': [], 'form': 'noir', 'id': 0, 'kana': 'noir', 'lemma': 'noir', 'pos': 'nom'}, {'attributes': {}, 'dependency_labels': [{'label': 'compound', 'token_id': 0}, {'label': 'case', 'token_id': 2}], 'features': [], 'form': 'Tonnerre', 'id': 1, 'kana': 'Tonnerre', 'lemma': 'Tonnerre', 'pos': 'nom'}, {'attributes': {}, 'features': ['Utilisation continue'], 'form': 'à', 'id': 2, 'kana': 'wo', 'lemma': 'à', 'pos': 'assistant de cas'}]}, {'chunk_info': {'chunk_func': 1, 'chunk_head': 0, 'dep': 'O', 'head': -1, 'id': 1, 'links': [{'label': 'object', 'link': 0}], 'predicate': []}, 'tokens': [{'attributes': {}, 'dependency_labels': [{'label': 'dobj', 'token_id': 1}, {'label': 'aux', 'token_id': 4}, {'label': 'punct', 'token_id': 5}], 'features': ['A'], 'form': 'manger', 'id': 3, 'kana': 'Tabe', 'lemma': 'manger', 'pos': 'racine du verbe'}, {'attributes': {}, 'features': ['End'], 'forme': 'tai', 'id': 4, 'kana': 'Thaïlande', 'lemma': 'tai', 'pos': 'suffixe de verbe'}, {'attributes': {}, 'features': [], 'form': '。', 'id': 5, 'kana': '', 'lemma': '。', 'pos': 'Phrase'}]}], 'status': 0}

===> Analyse de correspondance ===> {'message': 'OK', 'result': {'coreference': [], 'jetons': [[['Black', 'Thunder', 'Eat', 'Want', '. ']]}, 'status': 0}

===> Extraction de mots-clés ===> {'message': '', 'result': [{'form': 'Black Thunder', 'score': 10.0}], 'status': 0}

===> Calcul de similarité ===> {'message': 'OK', 'result': {'score': 0.99846786}, 'status': 0}

===> Jugement de type de phrase ===> {'message': '', 'result': {'dialog_act': ['information-providing'], 'modality': 'declarative'}, 'status': 0}

===> Estimation des attributs utilisateur (β) ===> {'message': 'OK', 'result': {'état civil': 'marié', 'hobby': ['ANIMAL', 'COOKING', 'FISHING', 'FORTUNE', 'GYM', 'INTERNET', 'SHOPPING', 'STUDY']}, 'status': 0}

===> Élimination de la stagnation (β) ===> {'message': 'OK', 'result': [{'fillers': [], 'fixed_sentence': 'Je veux manger du tonnerre noir. ', 'normalized_sentence': 'Je veux manger du tonnerre noir. '}], 'status': 0}

===> Détection d'erreur de reconnaissance vocale (β) ===> {'message': 'OK', 'result': {'candidates': [{'begin_pos': 4, 'correction': [{'correct_score': 0.709220240165901, 'form': 'danseur'}, {'correct_score': 0.6137611877341953, 'form': 'bander'}, {'correct_score': 0.6054945064139393, 'form': 'thunder'}, {'correct_score': 0.5943849175403254, 'form': 'Sanda'}, {'correct_score': 0.5878497568567171, 'form': 'Zander'}], 'detect_score': 0.05464221591729093, 'end_pos': 8, 'form': 'Thunder'}], 'score': 0.05464221591729093}, 'status': 0}

===> Analyse des émotions ===> {'message': 'OK', 'result': {'emotional_phrase': [], 'score': 0.38033421036210907, 'sentiment': 'Neutral'}, 'status': 0}

===> Résumé (β) ===> {'result': 'Je veux manger du tonnerre noir. ',' état ': 0}

Analyse terminée!

Avant de copier

-Inscrivez-vous en tant qu'utilisateur depuis API COTOHA et obtenez client_id et client_secret (l'enregistrement de l'utilisateur était assez facile à comprendre).

・ Si vous êtes dans l'état "Python est quoi?" Mais que vous voulez l'essayer, c'est une explication très simple (j'ai essayé d'utiliser l'API COTOHA, qui est censée être capable de gérer facilement le traitement du langage naturel. Veuillez lire / gossy5454 / items / 83072418fb0c5f3e269f)).

Code à copier

Code à copier

Réécrire l'ID client et le secret client après la copie


# -*- coding:utf-8 -*-
#Référence: https://qiita.com/gossy5454/items/83072418fb0c5f3e269f#python%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F

import os
import urllib.request
import json
import configparser
import codecs
import sys

client_id = "identité du client"
client_secret = "Secret du client"

developer_api_base_url = "https://api.ce-cotoha.com/api/dev/nlp/"
access_token_publish_url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"

api_name_show_switch = 1 #Réglez sur 0 si vous ne voulez pas que le nom de l'API soit affiché dans le résultat de sortie

def cotoha_call(api_type, sentence_1, sentence_2 = "Je veux manger du tonnerre blanc", sent_len = 1, ):
    #Obtenez un jeton d'accès
    def getAccessToken():
        #Spécification d'URL d'acquisition de jeton d'accès
        url = 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": client_id,
            "clientSecret": 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
        access_token = res_body["access_token"]

        return access_token

    #Spécification d'URL de l'API
    if api_type == "parse":
        api_name = "Analyse"
        base_url_footer = "v1/" + api_type
        request_body_type = 1
    elif api_type == "ne":
        api_name = "Extraction d'expression unique"
        base_url_footer = "v1/" + api_type
        request_body_type = 1
    elif api_type == "keyword":
        api_name = "Extraction de mots-clés"
        base_url_footer = "v1/" + api_type
        request_body_type = 2
    elif api_type == "coref":
        api_name = "Analyse de correspondance"
        base_url_footer = "v1/coreference"
        request_body_type = 2
    elif api_type == "simi":
        api_name = "Calcul de similarité"
        base_url_footer = "v1/similarity"
        request_body_type = 3
    elif api_type == "sen_type":
        api_name = "Jugement de type de phrase"
        base_url_footer = "v1/sentence_type"
        request_body_type = 1
    elif api_type == "user_at":
        api_name = "Estimation des attributs utilisateur (β)"
        base_url_footer = "beta/user_attribute"
        request_body_type = 2
    elif api_type == "filter":
        api_name = "Élimination de la stagnation (β)"
        base_url_footer = "beta/remove_filler"
        request_body_type = 4
    elif api_type == "detect":
        api_name = "Détection d'erreur de reconnaissance vocale (β)"
        base_url_footer = "beta/detect_misrecognition"
        request_body_type = 1
    elif api_type == "senti":
        api_name = "Analyse des émotions"
        base_url_footer = "v1/sentiment"
        request_body_type = 1
    elif api_type == "summary":
        api_name = "Résumé (β)"
        base_url_footer = "beta/summary"
        request_body_type = 5
    else :
        print("Api Type Error.")
        sys.exit()

    if api_name_show_switch == 1:
        print("===>\n" + api_name + "\n===>")
    
    url = developer_api_base_url + base_url_footer

    #Spécification d'en-tête
    headers={
        "Authorization": "Bearer " + getAccessToken(), #access_token,
        "Content-Type": "application/json;charset=UTF-8",
    }
    #Demander les spécifications du corps
    if request_body_type == 1:
        data = {
            "sentence": sentence_1
        }
    elif request_body_type == 2:
        data = {
            "document": sentence_1
        }
    elif request_body_type == 3:
        data = {
            "s1": sentence_1,
            "s2": sentence_2
        }
    elif request_body_type == 4:
        data = {
            "text": sentence_1
        }
    elif request_body_type == 5:
        data = {
            "document": sentence_1,
            "sent_len": sent_len
        }

    #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:
            access_token = getAccessToken()
            headers["Authorization"] = "Bearer " + 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)
            #sys.exit()

    #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

plus tard

python


cotoha_call("contribution", "Le texte que vous souhaitez analyser")

L'analyse commence à!

Postscript

Ceux qui participent au projet Faisons de notre mieux!

référence

J'ai essayé d'utiliser l'API COTOHA, qui, selon la rumeur, serait facile à gérer le traitement du langage naturel, en Python

Recommended Posts

Package PyPI pour une utilisation super facile de Cotoha sur Google colab
Compréhension facile de Python pour les tableaux et (pour les super débutants)
Comment enregistrer un package dans PyPI (à partir de septembre 2017)
Utilisez music21 sur Google Colaboratory
Installation facile d'OpenCV sur RaspberryPi 3+
Enquête pour l'utilisation pratique de BlockChain
Utilisez ndb.tasklet avec Google App Engine
Enregistrez le package avec PyPI
Jouez avec Turtle sur Google Colab
Générer semi-automatiquement une description du package à enregistrer dans PyPI
Utilisez edump au lieu de var_dump pour un débogage facile et une compréhension efficace du contenu des données (PHP)
Obtenir la liste des packages de l'utilisateur spécifié à partir des packages enregistrés dans PyPI
Apprenez avec Shogi AI Deep Learning sur Mac et Google Colab Utilisez Google Colab