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!
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). 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.
$ 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.
Der Quellcode ist unten im GitHub-Repository aufgeführt. mkuriki1990/poke_msg - GitHub Die Lizenz ist MIT-Lizenz.
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. 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
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.
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))
$ 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.
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.
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)
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
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))
$ 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.
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.
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)
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
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
$ 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!
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
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
$ 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.
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.
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?
(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
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
$ 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.
Die Kraft von Kagaku ist unglaublich!
▼
Jetzt mit PC-Kommunikation
Senden Sie einen Japaner
▼
Das Ergebnis der Analyse ist
Du kannst es sehen
▼
Es sieht so aus, aber ich wollte noch mehr tun.
~~ 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.
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.
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 (?)
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".
Der Quellcode wird unter der MIT-Lizenz lizenziert, wie im GitHub-Repository beschrieben. mkuriki1990/poke_msg - GitHub
Recommended Posts