[PYTHON] Erstellen Sie mit MeCab mit Discord einen Bot, der nur das Ergebnis der morphologischen Analyse zurückgibt

Artikel, auf die verwiesen wird

Überblick

Wie der Titel schon sagt,

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

Vorbereitung

Ich werde es weglassen, weil es nur dem "referenzierten Artikel" folgt.

Ich habe einen Punkt nicht verstanden oder missverstanden. Ich dachte, dass es eine Einstellung gibt, mit der der Endpunkt bei der Bereitstellung vor Ort oder in Heroku angegeben werden kann. Deshalb habe ich verschiedene Suchanfragen durchgeführt. Ich habe es nirgendwo geschrieben, aber irgendwie bin ich zu einem Schluss gekommen. Wenn ich es also schreibe, damit ich es nicht vergesse, Unabhängig davon, ob es lokal ist oder auf einem Server im Internet ausgeführt wird, stellt es eine Verbindung zum Discord-Server her und wird als online erkannt, während "client.run (TOKEN)" ausgeführt wird. Ich denke, das bedeutet es. Ich habe den Quellcode nicht gelesen und es sind keine zuverlässigen Informationen, aber ich denke, das ist wahrscheinlich der Fall.

Vorbereitung um Heroku

Melden Sie sich über die CLI bei heroku an.

heroku login

Melden Sie sich mit Ihrem Browser bei heroku an.

Melden Sie sich bei der Container-Registrierung auf Heroku an.

heroku container:login

Setze die Zwietrachtmarke.

heroku config:set TOKEN=hogehoge

Docker-Einstellungen

FROM python:3.7-slim

ENV HOME=/app
WORKDIR /app

#Wird zur Installation von NEologd verwendet
RUN apt-get update && apt-get install -y \
  build-essential \
  curl \
  git \
  openssl \
  sudo \
  zip \
  file

#Installieren Sie 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.Führen Sie py aus, um den Bot zu starten
CMD ["python", "discord_bot.py"]

Einstellungen der verwendeten Bibliothek

requirements.txt


mecab-python3
discord.py

Bot-Implementierung

Aus allen Nachrichten ohne Verwendung von Befehlen

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):
        #Antwortet nicht, wenn der Absender ein Bot ist
        if client.user != message.author:
            print(message.content)

            splited_message = message.content.split() #Durch Raum teilen
            splited_message.pop(0) #Der Anfang ist"mecab"Also unnötig
            content = splited_message.pop() #Behandeln Sie das Ende als zu analysierende Zeichenfolge
            option = ' '.join(splited_message) # "mecab "Von"{Zielzeichenfolge}"Verketten Sie die Zeichenfolgen zwischen
            mecab = MeCab.Tagger(option)
            m = "```" + mecab.parse(content) + "```"
            print(m)

            #Senden Sie eine Nachricht an den Kanal, an den die Nachricht gesendet wurde
            await message.channel.send(m)

client.run(TOKEN)

In Heroku bereitstellen

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

Wenn die Bereitstellung erfolgreich ist, aktivieren Sie ** SCOPES ** auf der OAuth2-Seite der Discord-Entwicklerseite, um auf die unten angezeigte URL zuzugreifen und den Bot mit dem Server zu verbinden.

Dies sollte den Bot zum Laufen bringen.

Wie benutzt man

mecab Die Betriebsumgebung spiegelt sich in diesem öffentlichen Repository wider. Wenn Sie eine Nachricht senden

Hier Nomenklatur,Gleichbedeutend,Allgemeines,*,*,*,Hier,Hier klicken,Hier klicken
Hilfswörter,Union,*,*,*,*,von,Nein,Nein
Öffentliche Nomenklatur,Verbindung ändern,*,*,*,*,Veröffentlichung,Kokai,Kokai
Repository-Nomenklatur,Allgemeines,*,*,*,*,*
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,D.,D.
Aktionsnomen,Verbindung ändern,*,*,*,*,Bewegung,Dousa,Dosa
Umwelt Nomen,Allgemeines,*,*,*,*,Umgebung,Kankyo,Kankyo
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,Wo,Wo
Reflexionsnomen,Verbindung ändern,*,*,*,*,Reflektieren,Hanei,Hanei
Shi Verb,Unabhängigkeit,*,*,Sahen / Suru,Kontinuierlicher Typ,Machen,Shi,Shi
Der Assistent,Verbindungsassistent,*,*,*,*,Hand,Te,Te
Ja Verb,Nicht unabhängig,*,*,Fünf Schritte, La Linie,Kontinuierlicher Typ,Gibt es,Ali,Ali
Masu Hilfsverb,*,*,*,Spezial / Masse,Grundform,Masu,Forelle,Forelle
.. Symbol,Phrase,*,*,*,*,。,。,。
EOS

Ich bekomme so eine Antwort.

mecab -d / usr / share / mecab / dic / mecab-ipadic-neologd / Zuerst bereiten wir die Zielzeichenfolge vor. Wenn Sie ein NEologd-Wörterbuch wie angeben,

Hier Nomenklatur,Gleichbedeutend,Allgemeines,*,*,*,Hier,Hier klicken,Hier klicken
Hilfswörter,Union,*,*,*,*,von,Nein,Nein
Öffentliche Nomenklatur,Verbindung ändern,*,*,*,*,Veröffentlichung,Kokai,Kokai
Repository-Nomenklatur,Proprietäre Nomenklatur,Allgemeines,*,*,*,Repository,Repository,Repository
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,D.,D.
Betriebsumgebung Substantiv,Proprietäre Nomenklatur,Allgemeines,*,*,*,Betriebsumgebung,Dousakankyo,Dosakankyo
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,Wo,Wo
Reflexionsnomen,Verbindung ändern,*,*,*,*,Reflektieren,Hanei,Hanei
Shi Verb,Unabhängigkeit,*,*,Sahen / Suru,Kontinuierlicher Typ,Machen,Shi,Shi
Der Assistent,Verbindungsassistent,*,*,*,*,Hand,Te,Te
Ja Verb,Nicht unabhängig,*,*,Fünf Schritte, La Linie,Kontinuierlicher Typ,Gibt es,Ali,Ali
Masu Hilfsverb,*,*,*,Spezial / Masse,Grundform,Masu,Forelle,Forelle
.. Symbol,Phrase,*,*,*,*,。,。,。
EOS

Nur die "Betriebsumgebung" hat sich geändert, aber es scheint, dass das NEologd-Wörterbuch ordnungsgemäß verwendet wird.

Problem

Mit dieser Implementierung empfängt es alle Nachrichten des Servers, mit dem der Bot verbunden ist, und prüft, ob die Zeichenfolge "mecab" vorhanden ist (glaube ich, vielleicht). Das ist verschwenderisch, weil es Geld kostet, die meisten irrelevanten Nachrichten zu verarbeiten.

Wenn Sie den Befehl implementieren, können Sie die Nachricht nur empfangen, wenn die Präfixzeichenfolge und die Befehlszeichenfolge vorhanden sind (sollten möglicherweise).

Implementierung der Befehlsversion

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() #Behandeln Sie das Ende als zu analysierende Zeichenfolge
        print(content)

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

        #Senden Sie eine Nachricht an den Kanal, an den die Nachricht gesendet wurde
        await ctx.send(m)

bot.run(TOKEN)

Der Unterschied zur Nicht-Befehlsversion ist

Schreiben Sie Dockerfile neu und stellen Sie es bereit

Schreiben Sie die Docker-Datei neu, um sie in der Befehlsversion auszuführen.

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

In Heroku bereitstellen.

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

Der Befehl ! Mecab sollte jetzt gültig sein.

Experiment

`! mecab Die Betriebsumgebung spiegelt sich in diesem öffentlichen Repository wider. ``

Hier Nomenklatur,Gleichbedeutend,Allgemeines,*,*,*,Hier,Hier klicken,Hier klicken
Hilfswörter,Union,*,*,*,*,von,Nein,Nein
Öffentliche Nomenklatur,Verbindung ändern,*,*,*,*,Veröffentlichung,Kokai,Kokai
Repository-Nomenklatur,Allgemeines,*,*,*,*,*
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,D.,D.
Aktionsnomen,Verbindung ändern,*,*,*,*,Bewegung,Dousa,Dosa
Umwelt Nomen,Allgemeines,*,*,*,*,Umgebung,Kankyo,Kankyo
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,Wo,Wo
Reflexionsnomen,Verbindung ändern,*,*,*,*,Reflektieren,Hanei,Hanei
Shi Verb,Unabhängigkeit,*,*,Sahen / Suru,Kontinuierlicher Typ,Machen,Shi,Shi
Der Assistent,Verbindungsassistent,*,*,*,*,Hand,Te,Te
Ja Verb,Nicht unabhängig,*,*,Fünf Schritte, La Linie,Kontinuierlicher Typ,Gibt es,Ali,Ali
Masu Hilfsverb,*,*,*,Spezial / Masse,Grundform,Masu,Forelle,Forelle
.. Symbol,Phrase,*,*,*,*,。,。,。
EOS

`mecab Die Betriebsumgebung spiegelt sich in diesem öffentlichen Repository wider. ``

Keine Reaktion.

Erfolg.

Nachtrag

Bot geht bald offline

Es funktioniert nach der Bereitstellung einige Minuten lang als Bot, wird jedoch bald offline geschaltet. Wenn Sie Dyno bereitstellen oder ein- oder ausschalten, wird es zurückgegeben, aber ich möchte, dass es die ganze Zeit ausgeführt wird.

https://teratail.com/questions/242975

Als ich es nachgeschlagen habe, scheint es nicht gut zu sein, den Container zum Zeitpunkt der Bereitstellung als "Web" zu verschieben.

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

Als Arbeiter neu einsetzen.

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

Sicherlich hat das nicht aufgehört.

Recommended Posts

Erstellen Sie mit MeCab mit Discord einen Bot, der nur das Ergebnis der morphologischen Analyse zurückgibt
Gibt das Ergebnis der morphologischen Analyse mit Mecab an einen WEB-Browser aus, der mit Sakura Server / UTF-8 kompatibel ist
Erstellen Sie einen BOT, der die Discord-URL verkürzt
Erstellen Sie einen Discord-Bot, der einseitig mit Python benachrichtigt (nur Anfragen und JSON werden verwendet).
Lassen Sie uns den Befehl pünktlich mit dem Bot der Zwietracht ausführen
Erstellen Sie einen BOT, der mit Discord registrierte Bilder wie Piktogramme aufrufen kann
Ich habe einen Korpusleser geschrieben, der die Ergebnisse der MeCab-Analyse liest
Erstellen Sie einen BOT, der die Anzahl der infizierten Personen in der neuen Corona anzeigt
Machen Sie mit LINE + Flask einen morphologischen Analyse-Bot
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Ein Server, der mit Flasche.py und OpenCV die Anzahl der Personen vor der Kamera zurückgibt
Erstellen Sie eine neue CSV mit Pandas basierend auf der lokalen CSV
[Python] Morphologische Analyse mit MeCab
Ein Beispiel für einen Mechanismus, der eine Vorhersage von HTTP aus dem Ergebnis des maschinellen Lernens zurückgibt
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
[Abgeschlossen] Bot, der eine Benachrichtigung über den Start der Live-Übertragung von Nico Nico an Discord auf discord.py sendet
Tornado - Erstellen wir eine Web-API, die JSON problemlos mit JSON zurückgibt
[Konzept] Bot, der eine Benachrichtigung über den Beginn der Live-Live-Übertragung von Nico Nico an Discord auf discord.py sendet
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Ausbeute in einer Klasse, die unittest geerbt hat. TestCase funktionierte nicht mit der Nase (abhängig von der Version der Nase?)
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt
Erstellen Sie eine Wortwolke mit nur positiven / negativen Wörtern auf Twitter
Erstellen Sie mit Python3 + Falcon eine REST-API, die die aktuelle Uhrzeit zurückgibt
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Erstellen Sie ein Kompatibilitätsbewertungsprogramm mit dem Zufallsmodul von Python.
Ich habe mit Mecab gespielt (morphologische Analyse)!
Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht
Die Geschichte der Entwicklung einer WEB-Anwendung, die automatisch Fangkopien generiert [MeCab]
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
Tweet die Wettervorhersage mit Bot
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
Die Geschichte der Erstellung von Botonyan, das den Inhalt von Google Text & Tabellen als Antwort auf ein bestimmtes Keyword in Slack zurückgibt
Erstellen Sie einen Bot, der Twitter-Trends verstärkt
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Erstellen Sie mit AWS Lambda einen Bot, der Instanzen mit bestimmten Tags automatisch startet / stoppt
So erstellen Sie mit Elasticsearch unter macOS Sierra schnell eine morphologische Analyseumgebung
Rund um die Authentifizierung von PyDrive2, einem Paket zum Betreiben von Google Drive mit Python
[kotlin] Erstellen Sie eine App, die Fotos erkennt, die mit einer Kamera auf Android aufgenommen wurden
Die Geschichte der Erstellung einer Webanwendung, die umfangreiche Lesungen mit Django aufzeichnet
Die Geschichte der Lernmethode, mit der LinuC Level 1 nur mit ping -t erworben wurde
Ich habe versucht, einen Übersetzungs-BOT zu erstellen, der mit Discord unter Verwendung von Googletrans funktioniert
[Bot dekodieren] Ich habe versucht, einen Bot zu erstellen, der mir den Rassenwert von Pokemon angibt
Die Geschichte, einen Line Bot zu erstellen, der uns den Zeitplan für die Wettbewerbsprogrammierung erzählt
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ein Modell, das die Gitarre mit fast.ai identifiziert
Tweet die Wettervorhersage mit Bot Teil 2
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird