[PYTHON] Créez un bot qui ne renvoie que le résultat de l'analyse morphologique avec MeCab avec Discord

Articles référencés

Aperçu

Comme le titre l'indique,

root@4c506a68cd26:~# python --version
Python 3.7.7
root@4c506a68cd26:~# mecab --version
mecab of 0.996

Préparation

Je vais l'omettre car il ne suit que «l'article référencé».

Je n'ai pas compris un point, ou mal compris, je pensais qu'il y avait un paramètre pour spécifier le point de terminaison lors du déploiement local ou sur heroku, alors j'ai cherché de diverses manières. Je ne l'ai écrit nulle part, mais d'une manière ou d'une autre, je suis arrivé à une conclusion, donc si je l'écris pour ne pas l'oublier, Qu'il soit local ou en cours d'exécution sur un serveur sur Internet, il se connecte au serveur Discord et est reconnu comme étant en ligne pendant que client.run (TOKEN) est en cours d'exécution. Je pense que c'est ce que cela signifie. Je n'ai pas lu le code source et ce n'est pas une information fiable, mais je pense que c'est probablement le cas.

Préparation autour d'heroku

Connectez-vous à heroku depuis la CLI.

heroku login

Connectez-vous à heroku avec votre navigateur.

Connectez-vous au registre des conteneurs sur Heroku.

heroku container:login

Réglez le jeton Discord.

heroku config:set TOKEN=hogehoge

Paramètres de Docker

FROM python:3.7-slim

ENV HOME=/app
WORKDIR /app

#Utilisé pour installer NEologd
RUN apt-get update && apt-get install -y \
  build-essential \
  curl \
  git \
  openssl \
  sudo \
  zip \
  file

#Installez MeCab
RUN apt-get update && apt-get install -y \
  mecab \
  libmecab-dev \
  mecab-ipadic \
  mecab-ipadic-utf8

RUN cd /usr/share/mecab && \
    git clone https://github.com/neologd/mecab-ipadic-neologd.git && \
    cd mecab-ipadic-neologd/ && \
    ./bin/install-mecab-ipadic-neologd -n -a -y -p /usr/share/mecab/dic/mecab-ipadic-neologd/

COPY requirements.txt ./requirements.txt

RUN pip install -r requirements.txt

COPY . .

# discord_bot.Exécutez py pour lancer le bot
CMD ["python", "discord_bot.py"]

Paramètres de la bibliothèque utilisée

requirements.txt


mecab-python3
discord.py

implémentation de bot

De tous les messages sans utiliser de commandes

discord_bot.py


import os
import MeCab
import discord

TOKEN = os.environ["TOKEN"]
PREFIX = "mecab "

client = discord.Client()

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

@client.event
async def on_message(message):
    print("received message: " + str(message))
    if message.content.startswith(PREFIX):
        #Ne répond pas si l'expéditeur est un bot
        if client.user != message.author:
            print(message.content)

            splited_message = message.content.split() #Diviser par l'espace
            splited_message.pop(0) #Le début est"mecab"Si inutile
            content = splited_message.pop() #Traitez la fin comme une chaîne de caractères à analyser
            option = ' '.join(splited_message) # "mecab "De"{Chaîne de caractères cible}"Concaténer les chaînes entre
            mecab = MeCab.Tagger(option)
            m = "```" + mecab.parse(content) + "```"
            print(m)

            #Envoyer un message au canal auquel le message a été envoyé
            await message.channel.send(m)

client.run(TOKEN)

Déployer sur heroku

heroku container:push web --app discord-bot-sample-app
heroku container:release web --app discord-bot-sample-app

Une fois le déploiement réussi, cochez ** SCOPES ** sur la page OAuth2 de la page des développeurs Discord pour accéder à l'URL affichée en bas et connecter le bot au serveur.

Cela devrait faire fonctionner le robot.

Comment utiliser

mecab L'environnement d'exploitation se reflète dans ce référentiel public. Lorsque vous envoyez un message

Ici nomenclature,Synonyme,Général,*,*,*,Ici,Cliquez ici,Cliquez ici
Mots auxiliaires,syndicat,*,*,*,*,de,Non,Non
Nomenclature publique,Changer de connexion,*,*,*,*,Libération,Kokai,Kokai
Nomenclature du référentiel,Général,*,*,*,*,*
Auxiliaire,Assistant de cas,Général,*,*,*,À,ré,ré
Action substantif,Changer de connexion,*,*,*,*,mouvement,Dousa,Dosa
Substantif environnemental,Général,*,*,*,*,environnement,Kankyo,Kankyo
Auxiliaire,Assistant de cas,Général,*,*,*,À,Wo,Wo
Reflet substantif,Changer de connexion,*,*,*,*,Réfléchir,Hanei,Hanei
Verbe shi,Indépendance,*,*,Sahen / Suru,Type continu,Faire,Shi,Shi
Te assistant,Assistant de connexion,*,*,*,*,main,Te,Te
Oui verbe,Non indépendant,*,*,Cinq étapes, La ligne,Type continu,y a-t-il,Ali,Ali
Masu verbe auxiliaire,*,*,*,Spécial / masse,Forme basique,Masu,truite,truite
.. symbole,Phrase,*,*,*,*,。,。,。
EOS

Je reçois une réponse comme celle-ci.

mecab -d / usr / share / mecab / dic / mecab-ipadic-neologd / Tout d'abord, préparons la chaîne de caractères cible. Si vous spécifiez un dictionnaire NEologd comme ,

Ici nomenclature,Synonyme,Général,*,*,*,Ici,Cliquez ici,Cliquez ici
Mots auxiliaires,syndicat,*,*,*,*,de,Non,Non
Nomenclature publique,Changer de connexion,*,*,*,*,Libération,Kokai,Kokai
Nomenclature du référentiel,Nomenclature propriétaire,Général,*,*,*,Dépôt,Dépôt,Dépôt
Auxiliaire,Assistant de cas,Général,*,*,*,À,ré,ré
Environnement d'exploitation substantif,Nomenclature propriétaire,Général,*,*,*,Environnement d'exploitation,Dousakankyo,Dosakankyo
Auxiliaire,Assistant de cas,Général,*,*,*,À,Wo,Wo
Reflet substantif,Changer de connexion,*,*,*,*,Réfléchir,Hanei,Hanei
Verbe shi,Indépendance,*,*,Sahen / Suru,Type continu,Faire,Shi,Shi
Te assistant,Assistant de connexion,*,*,*,*,main,Te,Te
Oui verbe,Non indépendant,*,*,Cinq étapes, La ligne,Type continu,y a-t-il,Ali,Ali
Masu verbe auxiliaire,*,*,*,Spécial / masse,Forme basique,Masu,truite,truite
.. symbole,Phrase,*,*,*,*,。,。,。
EOS

Seul l '«environnement opérationnel» a changé, mais il semble que le dictionnaire NEologd soit utilisé correctement.

problème

Avec cette implémentation, il reçoit tous les messages du serveur auquel le bot est connecté et vérifie si la chaîne mecab existe (je pense, peut-être). C'est du gaspillage car le traitement de la plupart des messages non pertinents coûte de l'argent.

Si vous implémentez la commande, vous ne pourrez recevoir le message que si la chaîne de préfixe et la chaîne de commande sont présentes (devrait, peut-être).

Implémentation de la version de commande

discord_command_bot.py


import os
import MeCab
import discord
from discord.ext import commands

TOKEN = os.environ["TOKEN"]

bot = commands.Bot(command_prefix='!', description='Output to results of morphological analysis.')

@bot.event
async def on_ready():
    print('Logged in as')
    print(bot.user.name)
    print(bot.user.id)
    print('------')

@bot.command()
async def mecab(ctx, *args):
    print("received message: " + str(args))
    if bot.user != ctx.message.author:
        l = list(args)
        content = l.pop() #Traitez la fin comme une chaîne de caractères à analyser
        print(content)

        option = ' '.join(l)
        mecab = MeCab.Tagger(option)
        m = "```" + mecab.parse(content) + "```"
        print(m)

        #Envoyer un message au canal auquel le message a été envoyé
        await ctx.send(m)

bot.run(TOKEN)

La différence avec la version sans commande est

Réécrire et déployer Dockerfile

Réécrivez le Dockerfile pour l'exécuter dans la version de commande.

CMD ["python", "discord_commmand_bot.py"]

Déployez-vous sur heroku.

heroku container:push web --app discord-bot-sample-app
heroku container:release web --app discord-bot-sample-app

La commande ! Mecab devrait maintenant être valide.

Expérience

`! mecab L'environnement d'exploitation est reflété dans ce référentiel public. ''

Ici nomenclature,Synonyme,Général,*,*,*,Ici,Cliquez ici,Cliquez ici
Mots auxiliaires,syndicat,*,*,*,*,de,Non,Non
Nomenclature publique,Changer de connexion,*,*,*,*,Libération,Kokai,Kokai
Nomenclature du référentiel,Général,*,*,*,*,*
Auxiliaire,Assistant de cas,Général,*,*,*,À,ré,ré
Action substantif,Changer de connexion,*,*,*,*,mouvement,Dousa,Dosa
Substantif environnemental,Général,*,*,*,*,environnement,Kankyo,Kankyo
Auxiliaire,Assistant de cas,Général,*,*,*,À,Wo,Wo
Reflet substantif,Changer de connexion,*,*,*,*,Réfléchir,Hanei,Hanei
Verbe shi,Indépendance,*,*,Sahen / Suru,Type continu,Faire,Shi,Shi
Te assistant,Assistant de connexion,*,*,*,*,main,Te,Te
Oui verbe,Non indépendant,*,*,Cinq étapes, La ligne,Type continu,y a-t-il,Ali,Ali
Masu verbe auxiliaire,*,*,*,Spécial / masse,Forme basique,Masu,truite,truite
.. symbole,Phrase,*,*,*,*,。,。,。
EOS

`mecab L'environnement d'exploitation se reflète dans ce référentiel public. ''

Pas de réaction.

Succès.

Postscript

le bot se déconnecte bientôt

Il fonctionne comme un robot pendant quelques minutes après le déploiement, mais se déconnecte rapidement. De plus, si vous déployez ou activez / désactivez le dynamomètre, il reviendra, mais je veux le maintenir en marche tout le temps.

https://teratail.com/questions/242975

Quand je l'ai recherché, il semble qu'il n'était pas bon de pousser le conteneur en tant que «web» au moment du déploiement.

heroku container:push web --app discord-bot-sample-app
heroku container:release web --app discord-bot-sample-app

Redéployez en tant que travailleur.

heroku container:push worker --app discord-bot-sample-app
heroku container:release worker --app discord-bot-sample-app

Cela ne s'est certainement pas arrêté.

Recommended Posts

Créez un bot qui ne renvoie que le résultat de l'analyse morphologique avec MeCab avec Discord
Envoie le résultat de l'analyse morphologique avec Mecab vers un navigateur WEB compatible avec le serveur Sakura / UTF-8
Créez un BOT qui raccourcit l'URL Discord
Créez un bot discord qui notifie unilatéralement avec python (seuls les requêtes et json sont utilisés)
Exécutons la commande à temps avec le bot discord
Créez un BOT qui peut appeler des images enregistrées avec Discord comme des pictogrammes
J'ai écrit un lecteur de corpus qui lit les résultats de l'analyse MeCab
Créez un BOT qui affiche le nombre de personnes infectées dans le nouveau Corona
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
Un serveur qui renvoie le nombre de personnes devant la caméra avec bottle.py et OpenCV
Créer un nouveau csv avec des pandas basé sur le csv local
[Python] Analyse morphologique avec MeCab
Un exemple de mécanisme qui renvoie une prédiction par HTTP à partir du résultat de l'apprentissage automatique
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
[Terminé] bot qui publie une notification du début de la diffusion en direct de Nico Nico sur Discord sur discord.py
J'ai essayé de créer un Discord Bot sur Docker qui signale le nombre de personnes infectées par corona à Tokyo à un moment spécifié
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
[Concept] bot qui publie une notification du début de la diffusion en direct de Nico Nico en direct sur Discord sur discord.py
L'histoire de la création d'un bot de boîte à questions avec discord.py
Rendement dans la classe qui a hérité de l'unittest.TestCase ne fonctionnait pas avec le nez (selon la version du nez?)
L'histoire de la création d'un Bot qui affiche les membres actifs dans un canal spécifique de Slack avec Python
Créez un nuage de mots avec uniquement des mots positifs / négatifs sur Twitter
Créer une API REST qui renvoie l'heure actuelle avec Python3 + Falcon
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
J'ai fait un bot mou qui m'informe de la température
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
L'histoire de la création d'un module qui ignore le courrier avec python
Créez un programme de jugement de compatibilité avec le module aléatoire de python.
J'ai joué avec Mecab (analyse morphologique)!
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
L'histoire du développement d'une application WEB qui génère automatiquement des copies de capture [MeCab]
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
Tweet la météo avec bot
Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
L'histoire de la création de Botonyan qui renvoie le contenu de Google Docs en réponse à un mot-clé spécifique sur Slack
Créez un bot qui stimule les tendances Twitter
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
Créez un bot avec AWS Lambda qui démarre / arrête automatiquement les instances avec des balises spécifiques
Comment créer rapidement un environnement d'analyse morphologique à l'aide d'Elasticsearch sur macOS Sierra
Autour de l'authentification de PyDrive2, un package pour faire fonctionner Google Drive avec Python
[kotlin] Créez une application qui reconnaît les photos prises avec un appareil photo sur Android
L'histoire de la création d'une application Web qui enregistre des lectures approfondies avec Django
L'histoire de la méthode d'apprentissage qui a acquis LinuC Niveau 1 avec seulement ping -t
J'ai essayé de créer un BOT de traduction qui fonctionne avec Discord en utilisant googletrans
[Discode Bot] J'ai essayé de créer un Bot qui me dit la valeur de race de Pokemon
L'histoire de la création d'un Line Bot qui nous raconte le calendrier de la programmation du concours
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
Un modèle qui identifie la guitare avec fast.ai
Tweet les prévisions météo avec le bot Partie 2
Créer un LINE BOT avec Minette pour Python
Créer une page qui se charge indéfiniment avec python