[PYTHON] J'ai essayé de noter la syntaxe trop humoristique et humoristique en utilisant l'API COTOHA.

introduction

Récemment, en raison de l'influence d'une certaine série de vidéos [^ tokkun]

"C'était trop OO, et c'est devenu OO."

Je suis accro à l'expression. Récemment, il faisait trop froid quand je suis parti de chez moi le matin et je suis devenu Samgyopsal. Comme.

Cependant, dans la seconde moitié de la partie "devenir XX", des mots inattendus ne sont pas sortis.

"C'était si éblouissant que c'est devenu un chocolat marbré."

Je pense qu'il y a des moments où vous faites des compromis avec la sélection de mots presque manqués. Afin de me prévenir, j'ai écrit un programme qui utilise l'API COTOHA pour marquer la syntaxe (j'aimerais l'appeler avec respect) que je trouvais trop folle.

Méthode de notation

La syntaxe est trop humoristique,

"(La racine de l'adjectif) est trop, ... est devenu (nom)"

On peut dire que plus la similitude entre le radical adjectif et le nez est élevée, meilleure est la syntaxe. Mais la nomenclature ne peut pas être un mot qui n'a pas de sens. Si la partie nomenclature n'est pas un mot général, je voudrais lui donner 0 point.

Pour la similitude entre les radicaux adjectifs et la nomenclature, j'aimerais utiliser [distance de Lebenstein](implémentation de la distance #Lebenstein) pour le moment. Je ne veux pas déduire de points même si le côté nomenclature devient inutilement long, comme je l'ai dit au début, «il faisait trop froid et je suis devenu Samgyopsal». Par conséquent, le côté nomenclature ne regardera que le nombre de caractères du côté du mot adjectif [^ tukkomi].

Exemple d'utilisation

$ echo "Je suis devenu cheval parce que j'étais trop cheval" | python orochimaru.py
100.0 point
Je suis tellement fou ... Je suis fou ...

$ echo "Il est devenu trop éblouissant et est devenu un chocolat marbré" | python orochimaru.py 
33.3 points
C'est trop mabushi, c'est devenu un chocolat marbré ...

$ echo "C'était tellement drôle que c'est devenu drôle" | python orochimaru.py 
0 point
C'est trop drôle, c'est devenu drôle ...

Préparation

Utilisez l'API COTOHA pour analyser le texte d'entrée et déterminer si le nez est une nomenclature générale. Créez un compte de développeur à partir du portail API COTOHA (https://api.ce-cotoha.com/) et notez votre ID client et le secret client. De plus, bien qu'elle ne soit pas enregistrée dans PyPi, la bibliothèque python est publiée sur GitHub, donc installez-la en vous référant à cet article. Bien sûr, ce n'est pas nécessaire lorsque vous accédez directement à l'API, et il semble qu'il ne prend en charge que l'analyse syntaxique et le calcul de similitude pour le moment, alors soyez prudent.

python utilise 3.6. Si vous utilisez pyenv ou quelque chose comme ça, faites-le bien.

$ git clone https://github.com/obilixilido/cotoha-nlp.git
$ cd cotoha-nlp/
$ pip install -e .

Vous pouvez maintenant utiliser l'analyse syntaxique de l'API COTOHA.

la mise en oeuvre

Implémentation à distance de Levenstein

[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%BC%E3%83%99%E3%83%B3%E3%82%B7%E3%83 % A5% E3% 82% BF% E3% 82% A4% E3% 83% B3% E8% B7% 9D% E9% 9B% A2) Je viens d'implémenter l'algorithme tel quel, je vais donc omettre les détails.

levenshtein.py


def levenshtein_distance(s1, s2):
    l1 = len(s1)
    l2 = len(s2)
    dp = [[0 for j in range(l2+1)] for i in range(l1+1)]
    for i in range(l1+1):
        dp[i][0] = i
    for i in range(l2+1):
        dp[0][i] = i
    
    for i in range(1, l1+1):
        for j in range(1, l2+1):
            cost = 0 if (s1[i-1] == s2[j-1]) else 1
            dp[i][j] = min([dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+cost])
 
    return dp[l1][l2]

Trop bon pour l'analyse syntaxique

C'est une implémentation très approximative, mais si vous entrez un texte qui correspond à "C'est trop XX et c'est XX", le score et le texte du résultat de l'analyse seront affichés.

orochimaru.py


from cotoha_nlp.parse import Parser
import levenshtein_distance

def find_orochi_sentence(tokens):
    form_list = ["", "Aussi", "main", "", "À", "Nana", "Tsu", "Ta"]
    pos_list = ["", "Suffixe d'adjectif", "Suffixe verbal", "", "Assistant de cas", "Tronc de verbe", "Fin d'utilisation verbale", "Suffixe verbal"]
    i = 0
    s1 = ""; s2 = ""
    is_unknown = False
    for token in tokens:
        if (i > 7): return 1
        if (i == 0):
            if not (token.pos == "Adjectif radical"): return 1
            s1 = token.kana
        elif (i == 3):
            if not (token.pos == "nom"): return 1
            s2 = token.kana
            if ("Undef" in token.features):
                is_unknown = True
        else:
            if (i == 4 and token.pos == "nom"):
                s2 += token.kana
                if ("Undef" in token.feautes):
                    is_unknown = True
                continue
            if not (token.pos == pos_list[i] and token.form == form_list[i]): return 1
        i += 1

    if is_unknown:
        print("0 point")
    else:
        dist = levenshtein_distance.levenshtein_distance(s1, s2[:len(s1)])
        print(f"{(100 * (len(s1) - dist) / len(s1)):.1f}Point")
    print(f"{s1}Trop ...{s2}Je suis ...")
    return 0

parser = Parser("YOUR_CLIENT_ID",
    "YOUR_CLIENT_SECRET",
    "https://api.ce-cotoha.com/api/dev/nlp",
    "https://api.ce-cotoha.com/v1/oauth/accesstokens"
)
s = parser.parse(input())
if find_orochi_sentence(s.tokens) == 1:
    print("C'est trop humoristique et pas syntaxique")

Dans l'analyse syntaxique de l'API COTOHA, l'information morphologique [^ morphème] de chaque mot est obtenue, mais si le mot est un mot inconnu, l'information "Undef" est ajoutée aux "caractéristiques" qu'il contient. Sur la base de ces informations, il est jugé si la partie nez de la syntaxe est un nom général parce qu'il est trop humoristique.

De plus, si le kanji est inclus dans le calcul de similitude, il y a un problème de fluctuation de notation, nous comparons donc en utilisant la lecture de katakana. Par conséquent, si l'API COTOHA reconnaît que la lecture est différente de ce que vous attendiez, elle ne sera pas évaluée correctement. (Exemple: il était trop épicé et est devenu un visage)

Certains maîtres de la syntaxe sont trop enthousiastes pour traiter le problème de ne pas pouvoir trouver un bon mot en disant "trop pour devenir un cèdre", mais c'est une chose sournoise et je ne l'évaluerai pas.

en conclusion

Maintenant, chaque fois que je suis trop fou pour trouver une syntaxe, je peux obtenir une évaluation objective.

Cette fois, j'ai essayé d'utiliser l'API COTOHA pour l'analyse morphologique, mais je l'ai trouvée pratique car elle est facile à utiliser et prend en charge beaucoup de mots. Je pense que c'est aussi formidable que XX soit présumé être une nomenclature appropriée même si c'est un mot inconnu dans la partie qui "est devenu XX". La version gratuite a une limite sur le nombre de requêtes API (1000 fois par jour), mais je pense qu'il n'y a aucun problème à l'utiliser pour jouer.

Tout le monde, essayez d'utiliser trop la syntaxe. Merci beaucoup.

référence

[^ tokkun]: Lien vers la chaîne Youtube.

[^ tukkomi]: C'est un point Tsukkomi, et je pense qu'il existe une méthode d'implémentation plus appropriée.

[^ morpheme]: Référence officielle. Il n'y a aucune mention de "Undef" ici, donc il peut éventuellement devenir inutilisable ...

Recommended Posts

J'ai essayé de noter la syntaxe trop humoristique et humoristique en utilisant l'API COTOHA.
J'ai essayé de toucher l'API COTOHA
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
[Première API COTOHA] J'ai essayé de résumer l'ancienne histoire
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'utiliser l'API COTOHA (il y a aussi du code sur GitHub)
J'ai essayé d'utiliser l'API BigQuery Storage
J'ai essayé d'utiliser du pyenv, que je détestais sans manger, et c'était trop pratique de m'asseoir.
J'ai essayé de résumer diverses phrases à l'aide de l'API de synthèse automatique "summpy"
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
J'ai essayé d'utiliser Google Translate à partir de Python et c'était trop facile
J'ai essayé d'approcher la fonction sin en utilisant le chainer
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
Une histoire qui était pratique lorsque j'ai essayé d'utiliser le module d'adresse IP python
C'est trop facile d'accéder à l'API Twitter avec rauth et je l'ai ...
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
J'ai essayé de simuler l'optimisation des publicités à l'aide de l'algorithme Bandit
J'ai essayé d'obtenir les informations du Web en utilisant "Requests" et "lxml"
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
Notes diverses sur l'utilisation de python pour les projets
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé d'énumérer les différences entre java et python
J'ai essayé d'obtenir diverses informations de l'API codeforces
J'ai essayé d'approcher la fonction sin en utilisant chainer (re-challenge)
J'ai essayé de sortir le journal d'accès au serveur en utilisant Node.js
[Pour les débutants] J'ai essayé d'utiliser l'API Tensorflow Object Detection
[Pour ceux qui veulent utiliser TPU] J'ai essayé d'utiliser l'API de détection d'objets Tensorflow 2
J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud
J'ai essayé de créer l'API Quip
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
Comment obtenir des abonnés et des abonnés de Python à l'aide de l'API Mastodon
J'ai essayé d'analyser mon chanteur préféré (SHISHAMO) en utilisant l'API Spotify
J'ai essayé de numériser le tampon estampé sur papier en utilisant OpenCV
J'ai essayé de classer le nom d'utilisateur et le mot de passe de phpMyAdmin ciblés par l'attaque du serveur
Je suis devenu horreur quand j'ai essayé de détecter la quantité de fonctionnalités d'un visage animé en utilisant PCA et NMF.
J'ai touché l'API de Tesla
[Python] J'ai essayé de créer un programme simple qui fonctionne sur la ligne de commande en utilisant argparse
J'ai essayé l'API du roman Naruro
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
J'ai essayé de déplacer le ballon
J'ai essayé de prédire les hauts et les bas du cours de clôture du cours de l'action de Guru Navi en utilisant TensorFlow (progression)
J'ai essayé d'estimer la section.
J'ai essayé d'utiliser l'API de reconnaissance vocale docomo et l'API Google Speech en Java
Pour le moment en utilisant FastAPI, je veux montrer comment utiliser l'API comme ça dans swagger
J'ai essayé de livrer du courrier depuis Node.js et Python en utilisant le service de livraison de courrier (SendGrid) d'IBM Cloud!
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé de résumer jusqu'à ce que je quitte la banque et devienne ingénieur
J'ai essayé de déplacer l'image vers le dossier spécifié en faisant un clic droit et un clic gauche