[PYTHON] Versuchen wir es mit COTOHA und erhalten eine nette Nachricht von Pokemon ▼

Willkommen bei COTOHA's Sekai! ▼

Wie ist das Kiji?
Ich habe ein Projekt gesehen
               ▼
Ich versuche es zu versuchen
Es ist Kiji
               ▼

[Qiita x COTOHA API präsentieren Plan] Lassen Sie uns den Text mit COTOHA API analysieren!

Was ist eine nette Pokemon-Nachricht? ▼

Dies ist die Nachrichtenanzeige, die auf dem Bildschirm des berühmten Spiels "Pocket Monster" (veröffentlicht von Pokemon Co., Ltd.) verwendet wird. (Das folgende Bild zeigt Pocket Monster Rot / Grün.) Vom Spielbildschirm von). Animation des Bildschirmbildes Der Punkt ist, dass ich das reproduzieren möchte (warum willst du das tun? Nur weil ich Pokemon mag. Herzlichen Glückwunsch zum 24. Jahrestag des 27. Februar 2020!).

Für diese Pokemon-ähnliche Meldungsanzeige

--Kanji wird nicht verwendet (mit einigen Ausnahmen)

Es gibt eine Funktion [^ 1]. Dieses Mal möchten wir COTOHA verwenden, um beliebige japanische Sätze in Nachrichten mit dieser Atmosphäre umzuwandeln. [^ 1]: In neueren Arbeiten wird möglicherweise Kanji angezeigt, aber in diesem Artikel werde ich versuchen, die Spezifikationen von "Pokemon Red / Green", der sogenannten "1. Generation", zu erfüllen.

Ergebnisprobe

$ python3 poke_msg.py "Taschenmonster, verkürztes Pokémon. Die mysteriöse und mysteriöse Kreatur dieses Sterns. Sie können Pokemon überall am Himmel, in den Bergen und im Meer sehen." 
Pokémon
               ▼
Kleines Pokémon
               ▼
Dieser Hoshino geheimnisvoll geheimnisvoll
Lebewesen
               ▼
Sora ni Yamani Umi
Pokemon ist überall
               ▼
Sie können sehen, dass
es kann
               ▼

Ich werde so etwas machen.

Quellcode

Der Quellcode ist unten im GitHub-Repository aufgeführt. mkuriki1990/poke_msg - GitHub Die Lizenz ist MIT-Lizenz.

Was ist die COTOHA-API?

Die COTOHA-API ist eine API zur Verarbeitung natürlicher Sprache und Spracherkennung, die japanische Wörterbücher verwendet, die von NTT Communications entwickelt wurden. https://api.ce-cotoha.com/ Es ist ein großartiger Typ, der Japanisch analysieren und Syntaxanalysen, Keyword-Extraktion, Emotionsextraktion, Spracherkennung usw. durchführen kann. cotoha.png Es ist durch den "for Developer Plan" begrenzt, aber Sie können es kostenlos verwenden. Hier habe ich es in Python unter Bezugnahme auf den folgenden Artikel verfügbar gemacht. Ich habe versucht, die COTOHA-API in Python - Qiita zu verwenden, die angeblich einfach in der Verarbeitung natürlicher Sprache zu handhaben ist

Bei COTOHA zunächst Kaiseki ▼

Ich bezog mich auf den Artikel über COTOHA in Qiita Erzprogramm Ugokas Omae Genshijin Naru - Qiita.

Dieser Artikel war ein Code, der die Zeichenfolge ausgibt, die dem Argument ohne die Hilfswörter usw. gegeben wurde, nachdem der Eingabesatz einer syntaktischen Analyse unterzogen wurde, so dass er zu einem primitiven menschlichen (?) Wort wird Ich habe versucht, den Teil zu löschen, in dem Wörter wie Hilfswörter weggelassen werden. Wenn die Ausgabe nur Katakana ist, gibt es keine Atmosphäre. Verwenden Sie daher die jaconv-Bibliothek, um sie zwangsweise in Hiragana umzuwandeln.

Ausführungsumgebung

Erster Code

Code, der den Code des Originalartikels ein wenig manipuliert (zum Vergrößern anklicken)

pokemon_msg.py



import requests
import json
import sys
import jaconv

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "Geben Sie die COTOHA-Client-ID ein"
CLIENT_SECRET = "Fügen Sie COTOHA Client Secret ein"


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 = "Sie haben jetzt den ersten Schritt in die Region Can Tho gemacht!"
    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))

Ergebnis

$ python3 pokemon_msg.py "Sie haben jetzt den ersten Schritt in die Region Can Tho gemacht!"
Sie sind jetzt Fumida, ein Glück für Kanto Chiho.

So etwas kam heraus.

Mehr Pokemon, viel Spaß, ▼

Die eigentliche Pokemon-Textnachricht enthält jedoch nicht so viele Leerzeichen. Ich möchte, dass die Teilwörter nicht so stark geteilt werden und das letzte "Fumida" ein einzelner Block ist, "Fumida". Sie können auch Katakana anzeigen, daher möchte ich "Can Tho" usw. anzeigen, das ursprünglich in Katakana geschrieben wurde.

Ändern Sie die Position des Trennzeichens

Wie oben erwähnt, gibt es derzeit zu viele Begrenzer. Im Spiel scheint es für jede Klausel ein Trennzeichen zu geben, und es scheint, dass es viele Fälle gibt, in denen nach der richtigen Nomenklatur ein Trennzeichen steht. Wenn Sie sich die API-Referenz ansehen, kann die COTOHA-API glücklicherweise jede Phrase als "chunk_info" lesen, sodass Sie die Zeichenfolge für jede Phrase lesen können. Kann verlinkt werden. Wenn Sie sich "Features" in "Token" ansehen, können Sie die "proprietäre Nomenklatur" als "Subteilnehmer" identifizieren. Daher habe ich sie so geändert, dass erst danach ein Leerzeichen in voller Breite hinzugefügt wird.

result_list = list()
for chunks in parse_document['result']:
    text = "" #Halten Sie einen leeren Text bereit
    for token in chunks["tokens"]:
        word = jaconv.kata2hira(token["kana"]
        if "Einzigartig" in token["features"]:
            text += word + " " #Fügen Sie Platz in voller Breite hinzu
        else:
            text += word
    result_list.append(text)

Konvertieren Sie nur andere Wörter als Katakana in Hiragana

Außerdem möchte ich das Katakana-Wort so verwenden, wie es ist, also habe ich die folgende Funktion definiert. In COTOHA ist "Form" in "Token" das ursprüngliche Wort, und sein Lesepseudonym ist in "Kana". Wenn man dies vergleicht, ist es ein Katakana-Wort, wenn "Form" und "Kana" übereinstimmen, andernfalls ist es eine Funktion, die in Hiragana zurückkehrt. Indem man dies dazwischen legt, wird das Wort Katakana so verwendet, wie es ist.

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

Code vorerst bis hierher

Der gesamte bisherige Code (zum Vergrößern anklicken)

pokemon_msg.py



import requests
import json
import sys
import jaconv

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "Geben Sie die COTOHA-Client-ID ein"
CLIENT_SECRET = "Fügen Sie COTOHA Client Secret ein"


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()

#Konvertieren Sie nur andere Wörter als Katakana in 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 = "Sie haben jetzt den ersten Schritt in die Region Can Tho gemacht!" #Beispieltext
    args = sys.argv
    if len(args) >= 2:
        document = str(args[1]) #Durch Beispiel ersetzen, wenn ein Argument vorliegt

    access_token = auth(CLIENT_ID, CLIENT_SECRET)
    parse_document = parse(document, access_token)
    result_list = list()
    for chunks in parse_document['result']:
        text = "" #Halten Sie einen leeren Text bereit
        for token in chunks["tokens"]:

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

        result_list.append(text)

    print(' '.join(result_list))

Ergebnis

$ python3 pokemon_msg.py "Sie haben jetzt den ersten Schritt in die Region Can Tho gemacht!"
Sie haben gerade angefangen, Can Tho Chiho eine gute Idee zu geben

Es ist ganz so geworden.

Machen Sie aus einem langen Bunsho eine nette Nachricht für Pokemon ▼

Die Wörter eines Charakters im ursprünglichen Spiel lauten wie folgt (Kanji-Konvertierung und Interpunktion werden ohne Erlaubnis hinzugefügt).

Starkes Pokémon, schwaches Pokémon, die Selbstsucht einer solchen Person. Wenn Sie ein wirklich starker Trainer sind, sollten Sie Ihr Bestes geben, um mit Ihrem Lieblingspokemon zu gewinnen.

Wenn dies konvertiert wird, wird es wie folgt.

$ python3 pokemon_msg.py "Starkes Pokémon, schwaches Pokémon, die Selbstsucht einer solchen Person. Wenn Sie ein wirklich starker Trainer sind, sollten Sie Ihr Bestes geben, um mit Ihrem Lieblingspokemon zu gewinnen."
Starkes Pokemon Yowai Pokemon Wenn Sie eine solche Person sind, sollten Sie Ihr Bestes geben, um ein Lieblingspokemon zu sein, wenn Sie ein wirklich starker Trainer sind

Es ist eine ziemlich redundante Anzeige. Im Pokemon-Spiel wird der Text aufgrund von Problemen mit der Bildschirmbreite auf eine angemessene Länge umbrochen (16 Zeichen für die rote und grüne Version). Auch wenn es Satzzeichen gibt, sieht es so aus, als ob es eine Unterbrechung gibt. Passen Sie das an.

Umgang mit Interpunktion

Interpunktion kann auch gefunden werden, indem man in "Token" schaut. Wenn es in "pos" ein "Interpunktionszeichen" oder einen "Lesepunkt" gibt, fügen Sie einen Zeilenumbruch ein. Darüber hinaus kann die Nachricht "Ausrufezeichen" und "Fragezeichen" wie "!" Und "?" Enthalten. Im Gegensatz zu "." Und "," werden diese in Pokemon als Nachrichten angezeigt. Wenn Sie also "Features" aktivieren, füge ich sie als Satz mit entsprechenden Zeilenumbrüchen ein.

result_list = list()
for chunks in parse_document['result']:
    text = "" #Halten Sie einen leeren Text bereit
    for token in chunks["tokens"]:
        word = jaconv.kata2hira(token["kana"]
        if "Einzigartig" in token["features"]:
            text += word + " " #Fügen Sie Platz in voller Breite hinzu
        elif token["pos"] == "Phrase" or token["pos"] == "Lesepunkt":
            if "Fragezeichen" in token["features"]:
                text += "?\n"
            elif "Ausrufezeichen" in token["features"]:
                text += "!\n"
            else:
                text += "\n"
        else:
            text += word
    result_list.append(text)

Umbrechen der Zeichenkette

Das erste Pokemon verwendete GAMEBOY als Spielhardware. Die Bildschirmauflösung beträgt nur 160 x 144 Punkte, und Pokemon kann anscheinend nur bis zu 16 Zeichen horizontal anzeigen. Wenn es 16 Zeichen überschreitet, wird es daher mit einem Zeilenumbruch angezeigt. Schreiben Sie die letzte "Ergebnisliste" wie folgt um, um "beizutreten".

# 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='') #Ohne den letzten Zeilenumbruch

Code bis zu diesem Punkt

Der gesamte bisherige Code (zum Vergrößern anklicken)

pokemon_msg.py



import requests
import json
import sys
import jaconv

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "Geben Sie die COTOHA-Client-ID ein"
CLIENT_SECRET = "Fügen Sie COTOHA Client Secret ein"


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()

#Konvertieren Sie nur andere Wörter als Katakana in 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 = "Sie haben jetzt den ersten Schritt in die Region Can Tho gemacht!" #Beispieltext
    document = "Starkes Pokémon, schwaches Pokémon, die Selbstsucht einer solchen Person. Wenn Sie ein wirklich starker Trainer sind, sollten Sie Ihr Bestes geben, um mit Ihrem Lieblingspokemon zu gewinnen." #Beispieltext
    args = sys.argv
    if len(args) >= 2:
        document = str(args[1]) #Durch Beispiel ersetzen, wenn ein Argument vorliegt

    access_token = auth(CLIENT_ID, CLIENT_SECRET)
    parse_document = parse(document, access_token)
    result_list = list()
    for chunks in parse_document['result']:
        text = "" #Halten Sie einen leeren Text bereit
        for token in chunks["tokens"]:

            word = conv_kana(token)
            if "Einzigartig" in token["features"]:
                text += word + " " #Fügen Sie Platz in voller Breite hinzu
            elif token["pos"] == "Phrase" or token["pos"] == "Lesepunkt":
                if "Fragezeichen" in token["features"]:
                    text += "?\n"
                elif "Ausrufezeichen" 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='') #Ohne den letzten Zeilenumbruch

Ergebnis

$ python3 pokemon_msg.py "Starkes Pokémon, schwaches Pokémon, die Selbstsucht einer solchen Person. Wenn Sie ein wirklich starker Trainer sind, sollten Sie Ihr Bestes geben, um mit Ihrem Lieblingspokemon zu gewinnen."
Starkes Pokémon

Yowai Pokemon

Diese Art von Person

Sehr stark
Wenn Sie ein Trainer sind

Ich mag Pokemon
Sie sollten Ihr Bestes geben

Oh!

Irgendwie sieht es so aus Es wurde eine Nachricht!

Ermöglicht das Senden von Nachrichten

Bis zu diesem Punkt ist es möglich, so etwas anzuzeigen. Im ursprünglichen Spiel wird der gesamte Text nicht auf einmal auf dem Bildschirm angezeigt, sondern in etwa zwei Zeilen. Sie können eine Nachricht per Knopfdruck senden. Ich werde versuchen, dies zu reproduzieren. Ändern Sie es auch so, dass am Ende der Nachricht angezeigt wird, um anzuzeigen, dass die Nachricht gesendet werden kann. Ich entschied mich, "input ()" zu setzen und auf die Eingabetaste zu warten, um die Nachricht zu senden.

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='') #Ohne den letzten Zeilenumbruch

Code bis zu diesem Punkt

Der gesamte bisherige Code (zum Vergrößern anklicken)

pokemon_msg.py



import requests
import json
import sys
import jaconv

BASE_URL = "https://api.ce-cotoha.com/api/dev/nlp/"
CLIENT_ID = "Geben Sie die COTOHA-Client-ID ein"
CLIENT_SECRET = "Fügen Sie COTOHA Client Secret ein"

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()

#Konvertieren Sie nur andere Wörter als Katakana in 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 = "Sie haben jetzt den ersten Schritt in die Region Can Tho gemacht!" #Beispieltext
    document = "Starkes Pokémon, schwaches Pokémon, die Selbstsucht einer solchen Person. Wenn Sie ein wirklich starker Trainer sind, sollten Sie Ihr Bestes geben, um mit Ihrem Lieblingspokemon zu gewinnen." #Beispieltext
    args = sys.argv
    if len(args) >= 2:
        document = str(args[1]) #Durch Beispiel ersetzen, wenn ein Argument vorliegt

    access_token = auth(CLIENT_ID, CLIENT_SECRET)
    parse_document = parse(document, access_token)
    result_list = list()
    for chunks in parse_document['result']:
        text = "" #Halten Sie einen leeren Text bereit
        for token in chunks["tokens"]:

            word = conv_kana(token)
            if "Einzigartig" in token["features"]:
                text += word + " " #Fügen Sie Platz in voller Breite hinzu
            elif token["pos"] == "Phrase" or token["pos"] == "Lesepunkt":
                if "Fragezeichen" in token["features"]:
                    text += "?\n"
                elif "Ausrufezeichen" 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='') #Ohne den letzten Zeilenumbruch

Ergebnis

$ python3 pokemon_msg.py "Starkes Pokémon, schwaches Pokémon, die Selbstsucht einer solchen Person. Wenn Sie ein wirklich starker Trainer sind, sollten Sie Ihr Bestes geben, um mit Ihrem Lieblingspokemon zu gewinnen."
Starkes Pokémon
               ▼
Yowai Pokemon
               ▼
Diese Art von Person
               ▼
Sehr stark
Wenn Sie ein Trainer sind
               ▼
Ich mag Pokemon
Sie sollten Ihr Bestes geben
               ▼

Dies ist atmosphärischer, wenn Sie es tatsächlich in der Befehlszeile ausführen, da Sie Nachrichten einzeln mit der Eingabetaste senden können.

Reigaishori ▼

Wie ich am Anfang schrieb, in der Pokemon-ähnlichen Meldungsanzeige

--Kanji wird nicht verwendet (mit einigen Ausnahmen)

Es gibt jedoch einige Ausnahmen, nämlich den "Yen" in der Preisanzeige. Kanji wird nur hier verwendet. Wenn Sie versuchen, das Zeichen "Yen" so wie es ist zu ersetzen, ändern sich alle zusammengesetzten Wörter wie "reibungslos fortfahren", was ein Problem darstellt. Die COTOHA-API kann jedoch "Hilfswörter" nach einem Teil des Wortes unterscheiden, daher habe ich beschlossen, sie zur Unterscheidung zu verwenden.

Wenn Sie die Hilfsnummer verwenden möchten, um 〇〇 Yen zu beurteilen ……?

Dies war jedoch nicht gut. Wenn Sie das Wort "500 Yen" gemäß der Referenz der COTOHA-API eingeben, werden die folgenden Informationen zurückgegeben.

$ curl -X POST -H "Content-Type:application/json;charset=UTF-8" -H "Authorization:Bearer [Access Token]" -d '{"sentence":"500 Yen","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 Yen",
      "kana" : "Gohyakun",
      "lemma" : "500 Yen",
      "pos" : "Substantiv",
      "features" : [ ],
      "dependency_labels" : [ ],
      "attributes" : { }
    } ]
  } ],
  "status" : 0,
  "message" : ""
}

Diese Nase ...?

Was erwartet wurde war, dass die "Position" des "Kreises" die "Hilfszahl" wurde, unterteilt in "500" und "Kreis". Im Fall von "151 Tieren" oder "10 Jahre alt" werden "Tiere" und "Alter" ordnungsgemäß als "Hilfswörter" getrennt, aber der Preis scheint ein "Substantiv" in einem Klumpen zu werden. Ich bin nicht sehr vertraut mit Linguistik, daher bin ich mit diesen Klassifikationen nicht sehr vertraut, aber anscheinend war ich enttäuscht.

$ python3 pokemon_msg.py "Das geheime Pokémon, Koi King, ist nur 500 Yen! Wie kaufst du es?"
Geheimes Pokémon
               ▼
Koi King
Was zur Hölle!
               ▼
Wie ist das?
               ▼

~~ Leider werde ich den Betrag aufgeben. ~~ Nun, ist das nicht zu seltsam für den Text des Spiels?

Verwenden Sie die Eigenausdrucksextraktion

(Hinzugefügt am 12.03.2020) In dem Kommentar erhielt ich den Rat, dass "eindeutigen Ausdruck extrahieren verwendet werden sollte" (Dank an @hanamizuno). .. Sicherlich kann beurteilt werden, ob die "Klasse" dieses Ergebnisses "MNY" ist.

$ curl -X POST -H "Content-Type:application/json;charset=UTF-8" -H "Authorization:Bearer [Access Token]" -d '{"sentence":"Das geheime Pokémon, Koi King, ist nur 500 Yen! Wie kaufst du es?","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" : "Koi King",
    "std_form" : "Koi King",
    "class" : "ART",
    "extended_class" : "",
    "source" : "basic"
  }, {
    "begin_pos" : 21,
    "end_pos" : 25,
    "form" : "500 Yen",
    "std_form" : "500 Yen",
    "class" : "MNY",
    "extended_class" : "",
    "source" : "basic"
  } ],
  "status" : 0,
  "message" : ""
}

Speichern Sie zunächst alle "MNY" -Elemente, die den im Text in der Liste enthaltenen "Geldausdruck" darstellen.

#Listen Sie Wörter auf, die monetäre Ausdrücke enthalten
def make_pricelist(ne_document):

    pricelist = list()

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

    return pricelist

Die Funktion "conv_kana", die das oben erstellte Katakana in Hiragana konvertiert, entspricht dem Geldausdruck, sodass die in dieser Liste gespeicherten Zeichenfolgen der Reihe nach gescannt werden und das ursprüngliche Wort im Fall des Geldausdrucks zurückgegeben wird. Umgeschrieben als conv_word. Wenn Sie jedoch den monetären Ausdruck mit chinesischen Zahlen wie "50 Yen" zurückgeben, wird die Atmosphäre ruiniert, sodass ich ihn jeweils in arabische Zeichen umwandeln werde. Ich habe die in [Numbers for Python <-> Kanjize gegenseitige Konvertierungsbibliothek "Kanjize" --Qiita](https://qiita.com/nagataaaas/items/154751c4f23b468e1c15) eingeführte kanjize`-Bibliothek verwendet. .. Außerdem geben wir Zahlen mit voller Breite anstelle von Zahlen mit halber Breite aus.

#Nur andere Wörter als Katakana werden in Hiragana umgewandelt.
#Wenn die Geldrepräsentation enthalten ist"Kreis"Konvertieren Sie und lassen Sie nur das Kanji von
def conv_word(token, pricelist):

    if len(pricelist) > 0:
        price = pricelist[0]
        if token["form"] == price:
            price = pricelist.pop(0)
            #Wenn es in chinesischen Zahlen ausgedrückt wird, ändern Sie es in arabische Zeichen.
            if not re.search('[0-9].+', price):
                price = str(kanji2int(price.replace("Kreis", ""))) + "Kreis"

            #Geben Sie Zahlen mit halber Breite an Zahlen mit voller Breite zurück
            return jaconv.h2z(price, digit=True, ascii=True)

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

Code bis zu diesem Punkt

Der gesamte bisherige Code (zum Vergrößern anklicken)

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 = "Geben Sie die COTOHA-Client-ID ein"
CLIENT_SECRET = "Fügen Sie COTOHA Client Secret ein"


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()

#Nur andere Wörter als Katakana werden in Hiragana umgewandelt.
#Wenn die Geldrepräsentation enthalten ist"Kreis"Konvertieren Sie und lassen Sie nur das Kanji von
def conv_word(token, pricelist):

    if len(pricelist) > 0:
        price = pricelist[0]
        if token["form"] == price:
            price = pricelist.pop(0)
            #Wenn es in chinesischen Zahlen ausgedrückt wird, ändern Sie es in arabische Zeichen.
            if not re.search('[0-9].+', price):
                price = str(kanji2int(price.replace("Kreis", ""))) + "Kreis"

            #Geben Sie Zahlen mit halber Breite an Zahlen mit voller Breite zurück
            return jaconv.h2z(price, digit=True, ascii=True)

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

#Listen Sie Wörter auf, die monetäre Ausdrücke enthalten
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 = "Sie haben jetzt den ersten Schritt in die Region Can Tho gemacht!" #Beispieltext
    document = "Starkes Pokémon, schwaches Pokémon, die Selbstsucht einer solchen Person. Wenn Sie ein wirklich starker Trainer sind, sollten Sie Ihr Bestes geben, um mit Ihrem Lieblingspokemon zu gewinnen." #Beispieltext
    document = "Das geheime Pokémon, Koi King, ist nur 500 Yen! Wie kaufst du es?" #Beispieltext
    args = sys.argv
    if len(args) >= 2:
        document = str(args[1]) #Durch Beispiel ersetzen, wenn ein Argument vorliegt

    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 = "" #Halten Sie einen leeren Text bereit
        for token in chunks["tokens"]:

            word = conv_word(token, pricelist)
            if "Einzigartig" in token["features"]:
                text += word + " " #Fügen Sie Platz in voller Breite hinzu
            elif token["pos"] == "Phrase" or token["pos"] == "Lesepunkt":
                if "Fragezeichen" in token["features"]:
                    text += "?\n"
                elif "Ausrufezeichen" 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='') #Ohne den letzten Zeilenumbruch

Ergebnis

$ python3 pokemon_msg.py "Das geheime Pokémon, Koi King, ist nur 500 Yen! Wie kaufst du es?"
Geheimes Pokémon
               ▼
Koi King
Was für nur 500 Yen!
               ▼
Wie ist das?
               ▼

Es ist fertig.

Zusammenfassung ▼

Die Kraft von Kagaku ist unglaublich!
               ▼
Jetzt mit PC-Kommunikation
Senden Sie einen Japaner
               ▼
Das Ergebnis der Analyse ist
Du kannst es sehen
               ▼

Um es so zu machen

Es sieht so aus, aber ich wollte noch mehr tun.

Verarbeitung der Hilfszahl "Yen"

~~ Wie oben erwähnt. Ich denke, es kann durch bedingte Verzweigung in Kombination mit Zahlen beurteilt werden, aber ich habe vorerst aufgegeben. ~~ (Hinzugefügt am 12.03.2020): Es ist jetzt möglich, mit der eindeutigen Ausdrucksextraktionsfunktion zu verarbeiten.

Alphabetverarbeitung

Die COTOHA-API ist ausgezeichnet, daher ist alles auf Japanisch einfach zu handhaben. Zum Beispiel sollte "COTOHA" "ooeeeecchi" sein und "151" "hyakugojuipiki" (nicht "hyakugoju" ichihiki "). Ich werde. Aber wenn überhaupt, denke ich, dass es besser ist, Buchstaben und arabische Zahlen so anzuzeigen, wie sie sind.

Katsuyohoho ▼

Wenn Sie es in Kombination mit der Spracherkennung verwenden, können Sie den gesprochenen Inhalt anscheinend in einen Retro-Spieltextstil konvertieren und anzeigen, indem Sie ihn mit dem Video überlappen. Grundsätzlich wird es zu Hiragana und Katakana, daher kann es für Kinderprogramme verwendet werden (?)

Link ▼

Lizenz ▼

Dieser Satz

Dieser Kiji no Inyobubunto
Boytos Spiel sind Männer
               ▼
Nozoku ist wirklich
Kantori-Kurabubaiyonten Zerode
Lizenziert
               ▼

(Der Text ohne den zitierten Teil dieses Artikels und den Spielbildschirm am Anfang ist unter CC BY 4.0 lizenziert.) [^ 2] [^ 2]: In der COTOHA-API scheint "CC" ein "Country Club" zu werden. Natürlich bedeutet "CC" hier "Creative Commons".

Quellcode

Der Quellcode wird unter der MIT-Lizenz lizenziert, wie im GitHub-Repository beschrieben. mkuriki1990/poke_msg - GitHub