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!
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). 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".
$ 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.
Le code source est répertorié dans le référentiel GitHub ci-dessous. mkuriki1990/poke_msg - GitHub La licence est une licence MIT.
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. 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
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.
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))
$ 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.
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.
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)
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
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))
$ 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.
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.
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)
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
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
$ 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!
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
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
$ 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.
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.
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?
(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
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
$ 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.
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
▼
Cela ressemble à ça, mais il y avait quelque chose que je voulais faire plus.
~~ 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.
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.
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 (?)
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».
Le code source est concédé sous la licence MIT comme décrit dans le référentiel GitHub. mkuriki1990/poke_msg - GitHub
Recommended Posts