[PYTHON] Essayons COTOHA et recevons un joli message de Pokemon ▼

Bienvenue au Sekai de COTOHA! ▼

Comment est ce Kiji?
J'ai vu un projet
               ▼
J'essaye d'essayer
C'est Kiji
               ▼

[Plan actuel de l'API Qiita x COTOHA] Analysons le texte avec l'API COTOHA!

Qu'est-ce qu'un gentil message Pokemon? ▼

Il s'agit de l'affichage de message utilisé sur l'écran du célèbre jeu "Pocket Monster" (sorti de Pokemon Co., Ltd.) (L'image ci-dessous est Pocket Monster Red / Green) Depuis l'écran de jeu de). Animation de l'image de l'écran Le fait est que je veux reproduire ceci (pourquoi voulez-vous faire cela? Juste parce que j'aime Pokemon. Félicitations pour le 24e anniversaire du 27 février 2020!).

Pour cet affichage de message de type Pokémon

--Kanji n'est pas utilisé (à quelques exceptions près) --Séparé par "espace"

Il existe une fonction [^ 1]. Cette fois, nous visons à utiliser COTOHA pour convertir des phrases japonaises arbitraires en messages avec ce genre d'atmosphère. [^ 1]: Dans les travaux récents, les kanji peuvent être affichés, mais dans cet article, je vais essayer de faire correspondre les spécifications de "Pokemon Rouge / Vert" qui est la soi-disant "1ère génération".

Exemple de résultat

$ python3 poke_msg.py "Monstre de poche, Pokémon raccourci. La créature mystérieuse et mystérieuse de cette étoile. Vous pouvez voir des Pokémon dans le ciel, les montagnes et la mer partout." 
Pokémon
               ▼
Petit Pokémon
               ▼
Ce hoshino mystérieux mystérieux
êtres vivants
               ▼
Sora ni Yamani Umi
Pokemon est partout
               ▼
Tu peux voir ça
ça peut
               ▼

Je vais faire quelque chose comme ça.

Code source

Le code source est répertorié dans le référentiel GitHub ci-dessous. mkuriki1990/poke_msg - GitHub La licence est une licence MIT.

Qu'est-ce que l'API COTOHA?

L'API COTOHA est une API de traitement du langage naturel et de reconnaissance vocale qui utilise des dictionnaires japonais, développés par NTT Communications. https://api.ce-cotoha.com/ C'est un gars formidable qui peut analyser le japonais et effectuer des analyses de syntaxe, l'extraction de mots-clés, l'extraction d'émotions, la reconnaissance vocale, etc. cotoha.png Il est limité par le "For Developer Plan", mais vous pouvez l'utiliser gratuitement. Ici, je l'ai rendu disponible en Python en me référant à l'article suivant. J'ai essayé d'utiliser l'API COTOHA, qui, selon la rumeur, serait facile à gérer le traitement du langage naturel, en Python --Qiita

Chez COTOHA, tout d'abord, Kaiseki ▼

Je me suis référé à l'article sur COTOHA dans Qiita Ore Program Ugokas Omae Genshijin Naru --Qiita.

Cet article était un code qui sortait la chaîne de caractères donnée à l'argument après avoir soumis la phrase d'entrée à une analyse syntaxique afin qu'elle devienne un mot humain primitif (?), En omettant les mots auxiliaires, etc. J'ai essayé d'effacer la partie qui omet des mots tels que les mots auxiliaires. De plus, si la sortie est uniquement katakana, il n'y aura pas d'atmosphère, alors utilisez la bibliothèque `` jaconv '' pour la convertir de force en hiragana.

Environnement d'exécution

Premier code

Code qui est un peu falsifié avec le code de l'article d'origine (cliquez pour agrandir)

pokemon_msg.py



import requests
import json
import sys
import jaconv

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "Entrez l'ID client COTOHA"
CLIENT_SECRET = "Insérer le secret du client COTOHA"


def auth(client_id, client_secret):
    token_url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8"
    }
    
    data = {
        "grantType": "client_credentials",
        "clientId": client_id,
        "clientSecret": client_secret
    }
    r = requests.post(token_url,
                      headers=headers,
                      data=json.dumps(data))
    return r.json()["access_token"]


def parse(sentence, access_token):
    base_url = BASE_URL
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8",
        "Authorization": "Bearer {}".format(access_token)
    }
    data = {
        "sentence": sentence,
        "type": "default"
    }
    r = requests.post(base_url + "v1/parse",
                      headers=headers,
                      data=json.dumps(data))
    return r.json()


if __name__ == "__main__":
    document = "Vous avez maintenant fait le premier pas dans la région de Can Tho!"
    args = sys.argv
    if len(args) >= 2:
        document = str(args[1])
   
    access_token = auth(CLIENT_ID, CLIENT_SECRET)
    parse_document = parse(document, access_token)
    result_list = list()
    for chunks in parse_document['result']:
        for token in chunks["tokens"]:
            result_list.append(jaconv.kata2hira(token["kana"]))

    print(' '.join(result_list))

résultat

$ python3 pokemon_msg.py "Vous avez maintenant fait le premier pas dans la région de Can Tho!"
Vous êtes maintenant Fumida, une bonne chance à Kanto Chiho.

Quelque chose comme ça est sorti.

Plus de Pokémon, très amusant, ▼

Cependant, le message texte Pokemon actuel n'a pas autant de délimiteurs d'espace. Je veux que les mots des parties ne soient pas tellement divisés et que le dernier "Fumida" ne soit qu'un bloc, "Fumida". Vous pouvez également afficher Katakana, donc vous voulez afficher "Can Tho" etc. écrit à l'origine en Katakana tel quel.

Changer l'emplacement de l'espace délimiteur

Comme mentionné ci-dessus, il y a trop de délimiteurs pour le moment. Dans le jeu, il semble qu'il y ait essentiellement un espace délimiteur pour chaque phrase, et il semble qu'il y ait de nombreux cas où il y a un espace délimiteur après la nomenclature appropriée. Si vous regardez la Référence API, heureusement l'API COTOHA peut lire chaque phrase comme chunk_info, vous pouvez donc lire la chaîne de caractères pour chaque phrase. Peut être lié. De plus, si vous regardez les «fonctionnalités» dans les «jetons», vous pouvez identifier la «nomenclature propriétaire» comme un «sous-participant», donc je l'ai changé pour qu'un espace pleine largeur soit ajouté seulement après cela.

result_list = list()
for chunks in parse_document['result']:
    text = "" #Préparez un texte vide
    for token in chunks["tokens"]:
        word = jaconv.kata2hira(token["kana"]
        if "Unique" in token["features"]:
            text += word + " " #Ajouter un espace pleine largeur
        else:
            text += word
    result_list.append(text)

Convertir uniquement les mots autres que katakana en hiragana

Aussi, je veux utiliser le mot Katakana tel quel, j'ai donc défini la fonction suivante. Dans COTOHA, «form» dans «tokens» est le mot original, et son pseudonyme de lecture est en «kana». En comparant cela, si «form» et «kana» correspondent, c'est un mot katakana, sinon c'est une fonction qui retourne en hiragana. En mettant cela entre les deux, le mot Katakana est utilisé tel quel.

def conv_kana(token):
    if token["form"] != token["kana"]:
        word = jaconv.kata2hira(token["kana"])
    else:
        word = token["kana"]
    return word

Code jusqu'à ici pour le moment

Le code entier jusqu'à présent (cliquez pour développer)

pokemon_msg.py



import requests
import json
import sys
import jaconv

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "Entrez l'ID client COTOHA"
CLIENT_SECRET = "Insérer le secret du client COTOHA"


def auth(client_id, client_secret):
    token_url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8"
    }

    data = {
        "grantType": "client_credentials",
        "clientId": client_id,
        "clientSecret": client_secret
    }
    r = requests.post(token_url,
                      headers=headers,
                      data=json.dumps(data))
    return r.json()["access_token"]


def parse(sentence, access_token):
    base_url = BASE_URL
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8",
        "Authorization": "Bearer {}".format(access_token)
    }
    data = {
        "sentence": sentence,
        "type": "default"
    }
    r = requests.post(base_url + "v1/parse",
                      headers=headers,
                      data=json.dumps(data))
    return r.json()

#Convertir uniquement les mots autres que katakana en hiragana
def conv_kana(token):
    if token["form"] != token["kana"]:
        word = jaconv.kata2hira(token["kana"])
    else:
        word = token["kana"]
    return word


if __name__ == "__main__":
    document = "Vous avez maintenant fait le premier pas dans la région de Can Tho!" #Exemple de texte
    args = sys.argv
    if len(args) >= 2:
        document = str(args[1]) #Remplacer par un échantillon s'il y a un argument

    access_token = auth(CLIENT_ID, CLIENT_SECRET)
    parse_document = parse(document, access_token)
    result_list = list()
    for chunks in parse_document['result']:
        text = "" #Préparez un texte vide
        for token in chunks["tokens"]:

            word = conv_kana(token)
            if token["pos"] == "nom":
                text += word + " "
            else:
                text += word

        result_list.append(text)

    print(' '.join(result_list))

résultat

$ python3 pokemon_msg.py "Vous avez maintenant fait le premier pas dans la région de Can Tho!"
Vous avez maintenant créé une bonne idée pour Can Tho Chiho

C'est devenu tout à fait comme ça.

Faites un long chignon un beau message pour Pokemon ▼

Les mots d'un personnage dans le jeu original sont les suivants (la conversion et la ponctuation Kanji sont ajoutées sans autorisation).

Pokémon fort, Pokémon faible, l'égoïsme d'une telle personne. Si vous êtes un entraîneur vraiment fort, vous devriez faire de votre mieux pour gagner avec votre Pokémon préféré.

Lorsque cela est converti, cela devient comme suit.

$ python3 pokemon_msg.py "Pokémon fort, Pokémon faible, l'égoïsme d'une telle personne. Si vous êtes un entraîneur vraiment fort, vous devriez faire de votre mieux pour gagner avec votre Pokémon préféré."
Pokémon fort Pokémon Yowai Si vous êtes une telle personne, vous devriez faire de votre mieux pour être un Pokémon préféré si vous êtes un entraîneur vraiment fort

C'est un affichage assez redondant. Dans le jeu Pokemon, en raison de problèmes de largeur d'écran, le texte est enveloppé à la longueur appropriée (16 caractères pour les versions rouge et verte). De plus, là où il y a des signes de ponctuation, il semble y avoir une pause. Ajustez autour de cela.

Gestion de la ponctuation

La ponctuation peut également être trouvée en regardant à l'intérieur des «jetons». S'il y a un «signe de ponctuation» ou un «point de lecture» dans «pos», insérez un saut de ligne. En outre, le message peut contenir des "points d'exclamation" et des "points d'interrogation" tels que "!" Et "?". Contrairement à "." Et ",", ceux-ci sont affichés sous forme de messages dans Pokemon, donc en cochant "features", je les insérerai comme un ensemble avec des sauts de ligne, le cas échéant.

result_list = list()
for chunks in parse_document['result']:
    text = "" #Préparez un texte vide
    for token in chunks["tokens"]:
        word = jaconv.kata2hira(token["kana"]
        if "Unique" in token["features"]:
            text += word + " " #Ajouter un espace pleine largeur
        elif token["pos"] == "Phrase" or token["pos"] == "Point de lecture":
            if "point d'interrogation" in token["features"]:
                text += "?\n"
            elif "Point d'exclamation" in token["features"]:
                text += "!\n"
            else:
                text += "\n"
        else:
            text += word
    result_list.append(text)

Emballage de la chaîne de caractères

Le premier Pokémon a utilisé GAMEBOY comme matériel de jeu. La résolution de l'écran n'est que de 160x144 points et il semble que Pokemon ne puisse afficher que 16 caractères horizontalement. Par conséquent, s'il dépasse 16 caractères, il sera affiché avec un saut de ligne. Réécrivez la dernière liste_résultats à rejoindre comme suit.

# print(' '.join(result_list))
line = ""
for word in result_list:
    if len(line) == 0:
        line = word
        newLine = line
    else:
        newLine = line + ' ' + word

    if '\n' in newLine:
        if len(newLine) > 16:
            print(line)
            print(word)
        else:
            print(newLine)
        line = ""
    elif len(newLine) <= 16:
        line = newLine
    else:
        print(line)
        line = word

print(line, end='') #Excluant le dernier saut de ligne

Coder jusqu'à ce point

Le code entier jusqu'à présent (cliquez pour développer)

pokemon_msg.py



import requests
import json
import sys
import jaconv

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "Entrez l'ID client COTOHA"
CLIENT_SECRET = "Insérer le secret du client COTOHA"


def auth(client_id, client_secret):
    token_url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8"
    }

    data = {
        "grantType": "client_credentials",
        "clientId": client_id,
        "clientSecret": client_secret
    }
    r = requests.post(token_url,
                      headers=headers,
                      data=json.dumps(data))
    return r.json()["access_token"]


def parse(sentence, access_token):
    base_url = BASE_URL
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8",
        "Authorization": "Bearer {}".format(access_token)
    }
    data = {
        "sentence": sentence,
        "type": "default"
    }
    r = requests.post(base_url + "v1/parse",
                      headers=headers,
                      data=json.dumps(data))
    return r.json()

#Convertir uniquement les mots autres que katakana en hiragana
def conv_kana(token):
    if token["form"] != token["kana"]:
        word = jaconv.kata2hira(token["kana"])
    else:
        word = token["kana"]
    return word


if __name__ == "__main__":
    document = "Vous avez maintenant fait le premier pas dans la région de Can Tho!" #Exemple de texte
    document = "Pokémon fort, Pokémon faible, l'égoïsme d'une telle personne. Si vous êtes un entraîneur vraiment fort, vous devriez faire de votre mieux pour gagner avec votre Pokémon préféré." #Exemple de texte
    args = sys.argv
    if len(args) >= 2:
        document = str(args[1]) #Remplacer par un échantillon s'il y a un argument

    access_token = auth(CLIENT_ID, CLIENT_SECRET)
    parse_document = parse(document, access_token)
    result_list = list()
    for chunks in parse_document['result']:
        text = "" #Préparez un texte vide
        for token in chunks["tokens"]:

            word = conv_kana(token)
            if "Unique" in token["features"]:
                text += word + " " #Ajouter un espace pleine largeur
            elif token["pos"] == "Phrase" or token["pos"] == "Point de lecture":
                if "point d'interrogation" in token["features"]:
                    text += "?\n"
                elif "Point d'exclamation" in token["features"]:
                    text += "!\n"
                else:
                    text += "\n"
            else:
                text += word

        result_list.append(text)

    line = ""
    for word in result_list:
        if len(line) == 0:
            line = word
            newLine = line
        else:
            newLine = line + ' ' + word

        if '\n' in newLine:
            if len(newLine) > 16:
                print(line)
                print(word)
            else:
                print(newLine)
            line = ""
        elif len(newLine) <= 16:
            line = newLine
        else:
            print(line)
            line = word

    print(line, end='') #Excluant le dernier saut de ligne

résultat

$ python3 pokemon_msg.py "Pokémon fort, Pokémon faible, l'égoïsme d'une telle personne. Si vous êtes un entraîneur vraiment fort, vous devriez faire de votre mieux pour gagner avec votre Pokémon préféré."
Pokémon fort

Pokémon Yowai

Ce genre de personne

Vraiment fort
Si vous êtes entraîneur

J'aime pokemon
Tu devrais faire de ton mieux

Oups!

D'une certaine manière, ça ressemble à ça C'est devenu un message!

Vous permet d'envoyer des messages

Jusqu'à présent, il est possible d'afficher quelque chose comme ça. Dans le jeu original, au lieu d'afficher tout le texte à l'écran à la fois, il est affiché sur environ deux lignes et vous pouvez envoyer un message en appuyant sur un bouton. Je vais essayer de reproduire cela. Aussi, modifiez-le pour que puisse être affiché à la fin du message pour indiquer que le message peut être envoyé. J'ai décidé de mettre ʻinput () `et d'attendre la touche Entrée pour envoyer le message.

line = ""
lineCounter = 0
for word in result_list:
    if len(line) == 0:
        line = word
        newLine = line
    else:
        newLine = line + ' ' + word

    if '\n' in newLine:
        if len(newLine) > 16:
            print(line)
            print(word)
        else:
            print(newLine);
        lineCounter = 2
        line = ""
    elif len(newLine) <= 16:
        line = newLine
    else:
        print(line); lineCounter += 1
        line = word

    if lineCounter >= 2:
        print("               ▼"); input()
        lineCounter = 0

print(line, end='') #Excluant le dernier saut de ligne

Coder jusqu'à ce point

Le code entier jusqu'à présent (cliquez pour développer)

pokemon_msg.py



import requests
import json
import sys
import jaconv

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "Entrez l'ID client COTOHA"
CLIENT_SECRET = "Insérer le secret du client COTOHA"

def auth(client_id, client_secret):
    token_url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8"
    }

    data = {
        "grantType": "client_credentials",
        "clientId": client_id,
        "clientSecret": client_secret
    }
    r = requests.post(token_url,
                      headers=headers,
                      data=json.dumps(data))
    return r.json()["access_token"]


def parse(sentence, access_token):
    base_url = BASE_URL
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8",
        "Authorization": "Bearer {}".format(access_token)
    }
    data = {
        "sentence": sentence,
        "type": "default"
    }
    r = requests.post(base_url + "v1/parse",
                      headers=headers,
                      data=json.dumps(data))
    return r.json()

#Convertir uniquement les mots autres que katakana en hiragana
def conv_kana(token):
    if token["form"] != token["kana"]:
        word = jaconv.kata2hira(token["kana"])
    else:
        word = token["kana"]
    return word


if __name__ == "__main__":
    document = "Vous avez maintenant fait le premier pas dans la région de Can Tho!" #Exemple de texte
    document = "Pokémon fort, Pokémon faible, l'égoïsme d'une telle personne. Si vous êtes un entraîneur vraiment fort, vous devriez faire de votre mieux pour gagner avec votre Pokémon préféré." #Exemple de texte
    args = sys.argv
    if len(args) >= 2:
        document = str(args[1]) #Remplacer par un échantillon s'il y a un argument

    access_token = auth(CLIENT_ID, CLIENT_SECRET)
    parse_document = parse(document, access_token)
    result_list = list()
    for chunks in parse_document['result']:
        text = "" #Préparez un texte vide
        for token in chunks["tokens"]:

            word = conv_kana(token)
            if "Unique" in token["features"]:
                text += word + " " #Ajouter un espace pleine largeur
            elif token["pos"] == "Phrase" or token["pos"] == "Point de lecture":
                if "point d'interrogation" in token["features"]:
                    text += "?\n"
                elif "Point d'exclamation" in token["features"]:
                    text += "!\n"
                else:
                    text += "\n"
            else:
                text += word

        result_list.append(text)

    line = ""
    lineCounter = 0
    for word in result_list:
        if len(line) == 0:
            line = word
            newLine = line
        else:
            newLine = line + ' ' + word

        if '\n' in newLine:
            if len(newLine) > 16:
                print(line)
                print(word)
            else:
                print(newLine);
            lineCounter = 2
            line = ""
        elif len(newLine) <= 16:
            line = newLine
        else:
            print(line); lineCounter += 1
            line = word

        if lineCounter >= 2:
            print("               ▼"); input()
            lineCounter = 0


    print(line, end='') #Excluant le dernier saut de ligne

résultat

$ python3 pokemon_msg.py "Pokémon fort, Pokémon faible, l'égoïsme d'une telle personne. Si vous êtes un entraîneur vraiment fort, vous devriez faire de votre mieux pour gagner avec votre Pokémon préféré."
Pokémon fort
               ▼
Pokémon Yowai
               ▼
Ce genre de personne
               ▼
Vraiment fort
Si vous êtes entraîneur
               ▼
J'aime pokemon
Tu devrais faire de ton mieux
               ▼

Ceci est plus atmosphérique lorsque vous l'exécutez sur la ligne de commande, car vous pouvez envoyer des messages un par un avec la touche Entrée.

Reigaishori ▼

Comme je l'ai écrit au début, dans l'affichage de message de type Pokémon

--Kanji n'est pas utilisé (à quelques exceptions près)

Cependant, il y a quelques exceptions, qui sont le «yen» dans l'affichage des prix. Le kanji n'est utilisé qu'ici. Si vous essayez de remplacer le caractère «yen» tel quel, tous les mots composés tels que «procéder en douceur» changeront, ce qui pose problème. Cependant, l'API COTOHA peut distinguer les «mots auxiliaires» d'une partie du mot, j'ai donc décidé de l'utiliser pour distinguer.

Si vous souhaitez utiliser le numéro auxiliaire pour juger 〇〇 yen ……?

Cependant, ce n'était pas bon. Si vous lancez le mot «500 yens» suivant la référence de l'API COTOHA, les informations suivantes seront renvoyées.

$ curl -X POST -H "Content-Type:application/json;charset=UTF-8" -H "Authorization:Bearer [Access Token]" -d '{"sentence":"500 yens","type": "default"}' "[API Base URL]/nlp/v1/parse"
{
  "result" : [ {
    "chunk_info" : {
      "id" : 0,
      "head" : -1,
      "dep" : "O",
      "chunk_head" : 0,
      "chunk_func" : 0,
      "links" : [ ]
    },
    "tokens" : [ {
      "id" : 0,
      "form" : "500 yens",
      "kana" : "Gohyakun",
      "lemma" : "500 yens",
      "pos" : "nom",
      "features" : [ ],
      "dependency_labels" : [ ],
      "attributes" : { }
    } ]
  } ],
  "status" : 0,
  "message" : ""
}

Ce nez ...?

On s'attendait à ce que le "pos" du "cercle" devienne le "nombre auxiliaire", divisé en "500" et "cercle". Dans le cas de "151 animaux" ou "10 ans", "animaux" et "âges" sont correctement séparés en tant que "mots auxiliaires", mais le prix semble devenir une "nomenclature" en un seul bloc. Je ne connais pas très bien la linguistique, donc je ne connais pas très bien ces classifications, mais apparemment j'ai été déçu.

$ python3 pokemon_msg.py "Le Pokémon secret, Koi King, ne coûte que 500 yens! Comment l'acheter?"
Pokémon secret
               ▼
Roi Koi
Quel enfer!
               ▼
Comment c'est?
               ▼

~~ Malheureusement, j'abandonnerai le montant. ~~ Eh bien, n'est-ce pas trop étrange pour le texte du jeu?

Utiliser l'extraction d'expressions propres

(Ajouté le 12/03/2020) Dans le commentaire, j'ai reçu le conseil suivant: "Extraire l'expression unique doit être utilisé" (Merci à @hanamizuno). .. Certes, il semble que l'on puisse juger si la "classe" de ce résultat est "MNY".

$ curl -X POST -H "Content-Type:application/json;charset=UTF-8" -H "Authorization:Bearer [Access Token]" -d '{"sentence":"Le Pokémon secret, Koi King, ne coûte que 500 yens! Comment l'acheter?","type": "default"}' "[API Base URL]/nlp/v1/ne"
{
  "result" : [ {
    "begin_pos" : 3,
    "end_pos" : 7,
    "form" : "Pokémon",
    "std_form" : "Pokémon",
    "class" : "ART",
    "extended_class" : "",
    "source" : "basic"
  }, {
    "begin_pos" : 8,
    "end_pos" : 13,
    "form" : "Roi Koi",
    "std_form" : "Roi Koi",
    "class" : "ART",
    "extended_class" : "",
    "source" : "basic"
  }, {
    "begin_pos" : 21,
    "end_pos" : 25,
    "form" : "500 yens",
    "std_form" : "500 yens",
    "class" : "MNY",
    "extended_class" : "",
    "source" : "basic"
  } ],
  "status" : 0,
  "message" : ""
}

Tout d'abord, stockez tous les éléments «MNY» qui sont «l'expression monétaire» contenue dans le texte de la liste.

#Répertorier les mots contenant des expressions monétaires
def make_pricelist(ne_document):

    pricelist = list()

    for result in ne_document['result']:
        if result['class'] == 'MNY':
            pricelist.append(result['form'])

    return pricelist

La fonction conv_kana qui convertit le katakana créé ci-dessus en hiragana est faite pour correspondre à l'expression monétaire de sorte que les chaînes de caractères stockées dans cette liste soient scannées dans l'ordre et le mot d'origine est retourné dans le cas de l'expression monétaire. Réécrit en tant que conv_word. Cependant, si vous renvoyez l'expression monétaire avec des nombres chinois tels quels, tels que "50 yens", l'atmosphère sera ruinée, donc je vais la convertir en caractères arabes dans chaque cas. J'ai utilisé la bibliothèque kanjize` introduite dans Numbers for Python <-> Bibliothèque de conversion mutuelle Kanjize" Kanjize "--Qiita. .. De plus, nous afficherons des nombres pleine largeur au lieu de nombres demi-largeur.

#Seuls les mots autres que katakana sont convertis en hiragana,
#Si la représentation monétaire est incluse"Cercle"Convertir en ne laissant que les kanji de
def conv_word(token, pricelist):

    if len(pricelist) > 0:
        price = pricelist[0]
        if token["form"] == price:
            price = pricelist.pop(0)
            #S'il est exprimé en chiffres chinois, changez-le en caractères arabes.
            if not re.search('[0-9].+', price):
                price = str(kanji2int(price.replace("Cercle", ""))) + "Cercle"

            #Renvoie les nombres demi-largeur aux nombres pleine largeur
            return jaconv.h2z(price, digit=True, ascii=True)

    if token["form"] != token["kana"]:
        word = jaconv.kata2hira(token["kana"])
    else:
        word = token["kana"]
    return word

Coder jusqu'à ce point

Le code entier jusqu'à présent (cliquez pour développer)

pokemon_msg.py


import requests
import json
import sys
import jaconv
import re
from kanjize import int2kanji, kanji2int

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "Entrez l'ID client COTOHA"
CLIENT_SECRET = "Insérer le secret du client COTOHA"


def auth(client_id, client_secret):
    token_url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8"
    }

    data = {
        "grantType": "client_credentials",
        "clientId": client_id,
        "clientSecret": client_secret
    }
    r = requests.post(token_url,
                      headers=headers,
                      data=json.dumps(data))
    return r.json()["access_token"]


def parse(sentence, access_token):
    base_url = BASE_URL
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8",
        "Authorization": "Bearer {}".format(access_token)
    }
    data = {
        "sentence": sentence,
        "type": "default"
    }
    r = requests.post(base_url + "v1/parse",
                      headers=headers,
                      data=json.dumps(data))
    return r.json()

def ne(sentence, access_token):
    base_url = BASE_URL
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8",
        "Authorization": "Bearer {}".format(access_token)
    }
    data = {
        "sentence": sentence,
        "type": "default"
    }
    r = requests.post(base_url + "v1/ne",
                      headers=headers,
                      data=json.dumps(data))
    return r.json()

#Seuls les mots autres que katakana sont convertis en hiragana,
#Si la représentation monétaire est incluse"Cercle"Convertir en ne laissant que les kanji de
def conv_word(token, pricelist):

    if len(pricelist) > 0:
        price = pricelist[0]
        if token["form"] == price:
            price = pricelist.pop(0)
            #S'il est exprimé en chiffres chinois, changez-le en caractères arabes.
            if not re.search('[0-9].+', price):
                price = str(kanji2int(price.replace("Cercle", ""))) + "Cercle"

            #Renvoie les nombres demi-largeur aux nombres pleine largeur
            return jaconv.h2z(price, digit=True, ascii=True)

    if token["form"] != token["kana"]:
        word = jaconv.kata2hira(token["kana"])
    else:
        word = token["kana"]
    return word

#Répertorier les mots contenant des expressions monétaires
def make_pricelist(ne_document):

    pricelist = list()

    for result in ne_document['result']:
        if result['class'] == 'MNY':
            pricelist.append(result['form'])

    return pricelist
    

if __name__ == "__main__":
    document = "Vous avez maintenant fait le premier pas dans la région de Can Tho!" #Exemple de texte
    document = "Pokémon fort, Pokémon faible, l'égoïsme d'une telle personne. Si vous êtes un entraîneur vraiment fort, vous devriez faire de votre mieux pour gagner avec votre Pokémon préféré." #Exemple de texte
    document = "Le Pokémon secret, Koi King, ne coûte que 500 yens! Comment l'acheter?" #Exemple de texte
    args = sys.argv
    if len(args) >= 2:
        document = str(args[1]) #Remplacer par un échantillon s'il y a un argument

    access_token = auth(CLIENT_ID, CLIENT_SECRET)
    parse_document = parse(document, access_token)
    ne_document = ne(document, access_token)
    pricelist = make_pricelist(ne_document)
    result_list = list()
    for chunks in parse_document['result']:
        text = "" #Préparez un texte vide
        for token in chunks["tokens"]:

            word = conv_word(token, pricelist)
            if "Unique" in token["features"]:
                text += word + " " #Ajouter un espace pleine largeur
            elif token["pos"] == "Phrase" or token["pos"] == "Point de lecture":
                if "point d'interrogation" in token["features"]:
                    text += "?\n"
                elif "Point d'exclamation" in token["features"]:
                    text += "!\n"
                else:
                    text += "\n"
            else:
                text += word

        result_list.append(text)

    line = ""
    lineCounter = 0
    for word in result_list:
        if len(line) == 0:
            line = word
            newLine = line
        else:
            newLine = line + ' ' + word

        if '\n' in newLine:
            if len(newLine) > 16:
                print(line)
                print(word)
            else:
                print(newLine);
            lineCounter = 2
            line = ""
        elif len(newLine) <= 16:
            line = newLine
        else:
            print(line); lineCounter += 1
            line = word

        if lineCounter >= 2:
            print("               ▼"); input()
            lineCounter = 0


    print(line, end='') #Excluant le dernier saut de ligne

résultat

$ python3 pokemon_msg.py "Le Pokémon secret, Koi King, ne coûte que 500 yens! Comment l'acheter?"
Pokémon secret
               ▼
Roi Koi
Quel simple 500 yens!
               ▼
Comment c'est?
               ▼

C'est fait.

Résumé ▼

La puissance de Kagaku est incroyable!
               ▼
Maintenant avec la communication par ordinateur personnel
Envoyer un japonais
               ▼
Le résultat de l'analyse est
Tu peux le voir
               ▼

Pour en faire plus comme ça

Cela ressemble à ça, mais il y avait quelque chose que je voulais faire plus.

Traitement du numéro auxiliaire "yen"

~~ Comme mentionné ci-dessus. Je pense que cela peut être jugé par branchement conditionnel en combinaison avec des nombres, mais j'ai abandonné pour le moment. ~~ (Ajouté le 2020/03/12): Il est désormais possible de traiter en utilisant la fonction d'extraction d'expression unique.

Traitement de l'alphabet

L'API COTOHA est excellente, donc tout est facile à gérer en japonais. Par exemple, "COTOHA" doit être "ooeeeeeecchi" et "151 animaux" doit être "hyakugoju ippiki" (et non "hyakugoju" ichihiki "). Je vais. Mais si quoi que ce soit, je pense qu'il est préférable d'afficher les lettres et les chiffres arabes tels quels.

Katsuyohoho ▼

Si vous l'utilisez en combinaison avec la reconnaissance vocale, il semble que vous puissiez convertir le contenu parlé en un style de texte de jeu rétro et l'afficher en le superposant à la vidéo. Fondamentalement, il devient hiragana et katakana, il peut donc être utilisé pour les programmes pour enfants (?)

Lien ▼

Licence ▼

Cette phrase

Ce Kiji no Inyobubunto
Le jeu de Boyto, ce sont les hommes
               ▼
Nozoku est vraiment
Kantori-Kurabubaiyonten Zerode
Autorisé
               ▼

(Le texte excluant la partie citée de cet article et l'écran de jeu au début est sous licence CC BY 4.0.) [^ 2] [^ 2]: Dans l'API COTOHA, "CC" semble devenir un "country club". Bien entendu, «CC» signifie ici «Creative Commons».

Code source

Le code source est concédé sous la licence MIT comme décrit dans le référentiel GitHub. mkuriki1990/poke_msg - GitHub