[PYTHON] Erstellen Sie mit COTOHA "Typogrisemia" -Sätze

Ich werde diesen quetschen

Bitte werfen Sie plötzlich einen kurzen Blick auf die folgenden Sätze.

Hallo, was ist Misa? Ich bin Genki. Dies ist der Kebunriji von Irigisu, aber es ist der Keikinu von Iku. Wenn Sie das Ei drücken

Wenn Sie die gleiche Zeit haben Jiban-n ist ein Chaos, aber es ist auch eine Fortsetzung zu lesen Ich habe absichtlich zu viel in die Buchstaben Jinban geschrieben. Wie geht es dir? Chinya und Yachimeu richtig?

Wie ist das? Ist es nicht überraschend leicht zu lesen? Dieser Satz ist (persönlich) ein relativ berühmtes Copy & Paste und heißt offiziell [Typogrisemia](https://ja.wikipedia.org/wiki/%E3%82%BF%E3%82%A4%E3% 83% 9D% E3% 82% B0% E3% 83% AA% E3% 82% BB% E3% 83% 9F% E3% 82% A2).

Grob gesagt verstehen Menschen beim Erkennen eines Wortes es nicht Zeichen für Zeichen, sondern erkennen es visuell als eine Reihe von Zeichen **. Zu diesem Zeitpunkt werden die Wörter sofort im Gehirn verstanden und vorhergesagt. Selbst wenn die Zeichen, aus denen die Wörter bestehen, leicht ersetzt werden, können sie korrigiert und gelesen werden **. *** * Diese Korrekturen hängen vom individuellen Wissen und Vokabular ab, daher gibt es individuelle Unterschiede. *** ***

Diesmal die Syntaxanalyse-API, die von der [COTOHA-API] bereitgestellt wird (https://api.ce-cotoha.com/contents/index.html). (reference / apireference.html # parsing) wird verwendet, um den Eingabetext zu analysieren und als Typoglisämie-Text auszugeben.

Es ist so.

before :
Post Typogrisemia Textausgabe mit Python und COTOHA an Qiita
after :
Lass uns Pothyn und Choota spielen. Lass uns das Taposei Miriguabushon an Qiita schicken.

Was für ein Ergebnis! !!

Was für eine API ist CHOOTA?

COTOHA ist eine ** Plattform für die Verarbeitung natürlicher Sprache / Sprachverarbeitung **, die von NTT Communications bereitgestellt wird. Zusätzlich zu der in diesem Artikel vorgestellten "Syntaxanalyse", "eindeutige Ausdrucksextraktion", "Korrespondenzanalyse", "Schlüsselwortextraktion", "Ähnlichkeitsberechnung", "Satztypbeurteilung", "Benutzerattributschätzung" und "Emotionsanalyse" Verschiedene Funktionen wie "Zusammenfassung" werden bereitgestellt.

Die Benutzerregistrierung ist einfach und jede API kann sogar innerhalb der kostenlosen Ebene verwendet werden ** 1000 Anrufe / Tag **, sodass Sie damit herumspielen können. Jetzt arbeite ich mit Qiita zusammen und mache diese Art von Projekt, also mach bitte mit. Bitte gib mir! !!

Die kostenlose Benutzerregistrierung kann über das COTOHA API Portal erfolgen. Nach Eingabe einiger grundlegender Elemente werden eine Benutzer-ID und ein Geheimnis für die Verwendung der API ausgegeben. Notieren Sie sich diese, wenn Sie die folgenden Skripte ausprobieren möchten.

Ich werde Pothyn quetschen

Ich habe auf den folgenden Artikel verwiesen. Beide Artikel sind sehr leicht zu verstehen und sehr zu empfehlen!

Die Basis basiert auf dem obigen Artikel, aber ich habe den Endpunktteil der API ein wenig optimiert. Ursprünglich enthielt BASE_URL`` nlp, wird aber gemäß dem offiziellen COTOHA-Format weggelassen.

Hauptprogramm

cotoha_api.py


import os
import urllib.request
import json
import configparser
import codecs
import re
import jaconv
import random


#COTOHA API-Operationsklasse
class CotohaApi:
    #Initialisieren
    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()

    #Zugriffstoken erhalten
    def getAccessToken(self):
        #Zugriff auf die URL-Angabe für die Token-Erfassung
        url = self.access_token_publish_url

        #Header-Spezifikation
        headers={
            "Content-Type": "application/json;charset=UTF-8"
        }

        #Körperspezifikation anfordern
        data = {
            "grantType": "client_credentials",
            "clientId": self.client_id,
            "clientSecret": self.client_secret
        }
        #Codieren Sie die Anforderungshauptteilspezifikation in JSON
        data = json.dumps(data).encode()

        #Anforderungsgenerierung
        req = urllib.request.Request(url, data, headers)

        #Senden Sie eine Anfrage und erhalten Sie eine Antwort
        res = urllib.request.urlopen(req)

        #Antwortkörper erhalten
        res_body = res.read()

        #Dekodieren Sie den Antworttext von JSON
        res_body = json.loads(res_body)

        #Holen Sie sich das Zugriffstoken vom Antworttext
        self.access_token = res_body["access_token"]


    #Syntax-Parsing-API
    def parse(self, sentence):
        #Syntax-Parsing-API-URL-Spezifikation
        url = self.developer_api_base_url + "nlp/v1/parse"
        #Header-Spezifikation
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        #Körperspezifikation anfordern
        data = {
            "sentence": sentence
        }
        #Codieren Sie die Anforderungshauptteilspezifikation in JSON
        data = json.dumps(data).encode()
        #Anforderungsgenerierung
        req = urllib.request.Request(url, data, headers)
        #Senden Sie eine Anfrage und erhalten Sie eine Antwort
        try:
            res = urllib.request.urlopen(req)
        #Was tun, wenn in der Anforderung ein Fehler auftritt?
        except urllib.request.HTTPError as e:
            #Wenn der Statuscode 401 Unauthorized lautet, fordern Sie das Zugriffstoken erneut an und fordern Sie es erneut an
            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)
            #Wenn der Fehler nicht 401 ist, wird die Ursache angezeigt.
            else:
                print ("<Error> " + e.reason)

        #Antwortkörper erhalten
        res_body = res.read()
        #Dekodieren Sie den Antworttext von JSON
        res_body = json.loads(res_body)
        #Holen Sie sich das Analyseergebnis vom Antworttext
        return res_body


    #Einzigartige Ausdrucksextraktions-API
    def ne(self, sentence):
        #API-URL-Spezifikation für die eindeutige Expressionsextraktion
        url = self.developer_api_base_url + "nlp/v1/ne"
        #Header-Spezifikation
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        #Körperspezifikation anfordern
        data = {
            "sentence": sentence
        }
        #Codieren Sie die Anforderungshauptteilspezifikation in JSON
        data = json.dumps(data).encode()
        #Anforderungsgenerierung
        req = urllib.request.Request(url, data, headers)
        #Senden Sie eine Anfrage und erhalten Sie eine Antwort
        try:
            res = urllib.request.urlopen(req)
        #Was tun, wenn in der Anforderung ein Fehler auftritt?
        except urllib.request.HTTPError as e:
            #Wenn der Statuscode 401 Unauthorized lautet, fordern Sie das Zugriffstoken erneut an und fordern Sie es erneut an
            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)
            #Wenn der Fehler nicht 401 ist, wird die Ursache angezeigt.
            else:
                print ("<Error> " + e.reason)

        #Antwortkörper erhalten
        res_body = res.read()
        #Dekodieren Sie den Antworttext von JSON
        res_body = json.loads(res_body)
        #Holen Sie sich das Analyseergebnis vom Antworttext
        return res_body


    #Korrespondenzanalyse-API
    def coreference(self, document):
        #URL-Angabe der API für die Korrespondenzanalyse-Erfassung
        url = self.developer_api_base_url + "beta/coreference"
        #Header-Spezifikation
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        #Körperspezifikation anfordern
        data = {
            "document": document
        }
        #Codieren Sie die Anforderungshauptteilspezifikation in JSON
        data = json.dumps(data).encode()
        #Anforderungsgenerierung
        req = urllib.request.Request(url, data, headers)
        #Senden Sie eine Anfrage und erhalten Sie eine Antwort
        try:
            res = urllib.request.urlopen(req)
        #Was tun, wenn in der Anforderung ein Fehler auftritt?
        except urllib.request.HTTPError as e:
            #Wenn der Statuscode 401 Unauthorized lautet, fordern Sie das Zugriffstoken erneut an und fordern Sie es erneut an
            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)
            #Wenn der Fehler nicht 401 ist, wird die Ursache angezeigt.
            else:
                print ("<Error> " + e.reason)

        #Antwortkörper erhalten
        res_body = res.read()
        #Dekodieren Sie den Antworttext von JSON
        res_body = json.loads(res_body)
        #Holen Sie sich das Analyseergebnis vom Antworttext
        return res_body


    #Keyword-Extraktions-API
    def keyword(self, document):
        #API-URL-Spezifikation für die Keyword-Extraktion
        url = self.developer_api_base_url + "nlp/v1/keyword"
        #Header-Spezifikation
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        #Körperspezifikation anfordern
        data = {
            "document": document
        }
        #Codieren Sie die Anforderungshauptteilspezifikation in JSON
        data = json.dumps(data).encode()
        #Anforderungsgenerierung
        req = urllib.request.Request(url, data, headers)
        #Senden Sie eine Anfrage und erhalten Sie eine Antwort
        try:
            res = urllib.request.urlopen(req)
        #Was tun, wenn in der Anforderung ein Fehler auftritt?
        except urllib.request.HTTPError as e:
            #Wenn der Statuscode 401 Unauthorized lautet, fordern Sie das Zugriffstoken erneut an und fordern Sie es erneut an
            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)
            #Wenn der Fehler nicht 401 ist, wird die Ursache angezeigt.
            else:
                print ("<Error> " + e.reason)

        #Antwortkörper erhalten
        res_body = res.read()
        #Dekodieren Sie den Antworttext von JSON
        res_body = json.loads(res_body)
        #Holen Sie sich das Analyseergebnis vom Antworttext
        return res_body


    #API zur Ähnlichkeitsberechnung
    def similarity(self, s1, s2):
        #API-URL-Spezifikation für die Ähnlichkeitsberechnung
        url = self.developer_api_base_url + "nlp/v1/similarity"
        #Header-Spezifikation
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        #Körperspezifikation anfordern
        data = {
            "s1": s1,
            "s2": s2
        }
        #Codieren Sie die Anforderungshauptteilspezifikation in JSON
        data = json.dumps(data).encode()
        #Anforderungsgenerierung
        req = urllib.request.Request(url, data, headers)
        #Senden Sie eine Anfrage und erhalten Sie eine Antwort
        try:
            res = urllib.request.urlopen(req)
        #Was tun, wenn in der Anforderung ein Fehler auftritt?
        except urllib.request.HTTPError as e:
            #Wenn der Statuscode 401 Unauthorized lautet, fordern Sie das Zugriffstoken erneut an und fordern Sie es erneut an
            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)
            #Wenn der Fehler nicht 401 ist, wird die Ursache angezeigt.
            else:
                print ("<Error> " + e.reason)

        #Antwortkörper erhalten
        res_body = res.read()
        #Dekodieren Sie den Antworttext von JSON
        res_body = json.loads(res_body)
        #Holen Sie sich das Analyseergebnis vom Antworttext
        return res_body


    #API zur Bestimmung des Anweisungstyps
    def sentenceType(self, sentence):
        #API-URL-Spezifikation zur Bestimmung des Anweisungstyps
        url = self.developer_api_base_url + "nlp/v1/sentence_type"
        #Header-Spezifikation
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        #Körperspezifikation anfordern
        data = {
            "sentence": sentence
        }
        #Codieren Sie die Anforderungshauptteilspezifikation in JSON
        data = json.dumps(data).encode()
        #Anforderungsgenerierung
        req = urllib.request.Request(url, data, headers)
        #Senden Sie eine Anfrage und erhalten Sie eine Antwort
        try:
            res = urllib.request.urlopen(req)
        #Was tun, wenn in der Anforderung ein Fehler auftritt?
        except urllib.request.HTTPError as e:
            #Wenn der Statuscode 401 Unauthorized lautet, fordern Sie das Zugriffstoken erneut an und fordern Sie es erneut an
            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)
            #Wenn der Fehler nicht 401 ist, wird die Ursache angezeigt.
            else:
                print ("<Error> " + e.reason)

        #Antwortkörper erhalten
        res_body = res.read()
        #Dekodieren Sie den Antworttext von JSON
        res_body = json.loads(res_body)
        #Holen Sie sich das Analyseergebnis vom Antworttext
        return res_body


    #API zur Schätzung von Benutzerattributen
    def userAttribute(self, document):
        #API-URL-Spezifikation zur Schätzung von Benutzerattributen
        url = self.developer_api_base_url + "beta/user_attribute"
        #Header-Spezifikation
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        #Körperspezifikation anfordern
        data = {
            "document": document
        }
        #Codieren Sie die Anforderungshauptteilspezifikation in JSON
        data = json.dumps(data).encode()
        #Anforderungsgenerierung
        req = urllib.request.Request(url, data, headers)
        #Senden Sie eine Anfrage und erhalten Sie eine Antwort
        try:
            res = urllib.request.urlopen(req)
        #Was tun, wenn in der Anforderung ein Fehler auftritt?
        except urllib.request.HTTPError as e:
            #Wenn der Statuscode 401 Unauthorized lautet, fordern Sie das Zugriffstoken erneut an und fordern Sie es erneut an
            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)
            #Wenn der Fehler nicht 401 ist, wird die Ursache angezeigt.
            else:
                print ("<Error> " + e.reason)

        #Antwortkörper erhalten
        res_body = res.read()
        #Dekodieren Sie den Antworttext von JSON
        res_body = json.loads(res_body)
        #Holen Sie sich das Analyseergebnis vom Antworttext
        return res_body



if __name__ == '__main__':
    #Rufen Sie den Speicherort der Quelldatei ab
    APP_ROOT = os.path.dirname(os.path.abspath( __file__)) + "/"

    #Stellen Sie den eingestellten Wert ein
    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")

    #COTOHA API-Instanziierung
    cotoha_api = CotohaApi(CLIENT_ID, CLIENT_SECRET, DEVELOPER_API_BASE_URL, ACCESS_TOKEN_PUBLISH_URL)

    #Zu analysierende Aussage
    sentence = "Post Typogrisemia Textausgabe mit Python und COTOHA an Qiita"

    #Vor dem Formen anzeigen
    print('before :')
    print(sentence)

    #Ausführung der Syntax-Parsing-API
    result_json = cotoha_api.parse(sentence)

    #Zeichenfolgenliste vor dem Formatieren
    word_list_base = []
    #Liste der formatierten Zeichen
    word_list = []

    #Regulärer Ausdruck für alphanumerisches Urteilsvermögen
    alnumReg = re.compile(r'^[a-zA-Z0-9 ]+$')

    #Schleifenverarbeitung von Analyseergebnissen
    for i in range(len(result_json['result'])):
        for j in range(len(result_json['result'][i]['tokens'])):
            #Für alphanumerische Zeichen'form'Für Japaner ist der Wert von'kana'Verwenden Sie den Wert von
            word = result_json['result'][i]['tokens'][j]['form']
            kana = result_json['result'][i]['tokens'][j]['kana']
            #Beurteilung, ob es sich um alphanumerische Zeichen halber Breite handelt
            if alnumReg.match(word) is not None:
                #Bestimmen Sie, ob es sich um ein Wort handelt oder nicht
                if ' ' in word:
                    #Wenn später mehr als eine konfiguriert wird, zerlegen Sie sie weiter
                    word_list_base.extend(word.split(' '))
                else :
                    word_list_base.append(word)
            #japanisch
            else :
                #Konvertiere Katakana in Hiragana und füge es der Liste hinzu
                word_list_base.append(jaconv.kata2hira(kana))
            
    #Analysieren Sie jedes Wort und ersetzen Sie die anderen Zeichen als den Anfang und das Ende von 4 oder mehr Zeichen
    for i in range(len(word_list_base)):
        #4 Zeichen oder mehr
        if len(word_list_base[i]) > 3:
            #Zerlegen Sie zuerst in eine zeichenweise Liste
            wl_all = list(word_list_base[i])
            #Behalten Sie das erste und das letzte Zeichen
            first_word = wl_all[0]
            last_word = wl_all[len(wl_all) - 1]
            #Holen Sie sich die Zeichen im Listenformat
            wl = wl_all[1:len(wl_all) - 1]
            #Mischen
            random.shuffle(wl)
            word_list.append(first_word + ''.join(wl) + last_word)
        #Wenn es weniger als 4 Zeichen sind, lassen Sie es wie es ist
        else :
            word_list.append(word_list_base[i])

    #Zeigen Sie das Formatierungsergebnis an
    print('after :')
    print(' '.join(word_list))
Konfigurationsdatei

config.ini


[COTOHA API]
Developer API Base URL: https://api.ce-cotoha.com/api/dev/
Developer Client id:[Kunden ID]
Developer Client secret:【Geheimnis】
Access Token Publish URL: https://api.ce-cotoha.com/v1/oauth/accesstokens

Um es zu verwenden, geben Sie die Client-ID und das Geheimnis in config.ini ein und platzieren Sie es in derselben Hierarchie wie cotoha_api.py. Die Ausführung ist wie folgt.

python cotoha_api.py

Ausführungsergebnis


before :
Post Typogrisemia Textausgabe mit Python und COTOHA an Qiita
after :
Lass uns Pothyn und Choota spielen. Lass uns das Taposei Miriguabushon an Qiita schicken.

Zusammenfassung

Obwohl ich keine Kenntnisse über "Python" oder "Verarbeitung natürlicher Sprache" hatte, implementierte ich es weiter (** fast menschliches Skript **). Aber selbst in einem solchen Zustand habe ich persönlich zufriedenstellende Ergebnisse erzielt, so dass "COTOHA" sehr einfach zu handhaben ist und ich denke, es ist die beste Einführung.

Wir hoffen, dass Sie sich auch nach dem Lesen dieses Artikels für "COTOHA" interessieren.

Sakonbubuken

Wann

Nebenbei bemerkt bedeutet ** "Tippfehler" ** "Tippfehler" ** und ** "Hypoglykämie" ** bedeutet Hypoglykämie [Beutelsprache](https: //ja.wikipedia) .org / wiki /% E3% 81% 8B% E3% 81% B0% E3% 82% 93% E8% AA% 9E). Kaban ist ein Wort, das aus mehreren Wörtern besteht, wie "Netsusama-to" und "Nespresso".

Das? Dies scheint interessant zu sein, wenn Sie mit "COTOHA" umgehen ...

Wenn ich es tun würde, wäre es ** "Ich habe versucht, mit COTOHA eine jetzt Tintenfischsprache zu erstellen" ** (lacht)

Recommended Posts

Erstellen Sie mit COTOHA "Typogrisemia" -Sätze
Erstellen Sie JIRA-Tickets mit Python
Erstellen Sie mit tkinter eine Python-GUI
Erstellen Sie ein verschachteltes Wörterbuch mit defaultdict
Suchen Sie mit COTOHA nach profitablen Marken
Erstellen Sie eine API mit hug mit mod_wsgi
Erstellen Sie die CRUD-API mit der Fast API
Erstellen Sie mit Boost.Python einen C-Sprach-Wrapper