Wie der Titel schon sagt, habe ich einen Code geschrieben, der die automatische Suche mit Python mithilfe der Twitter-API realisiert und die daraus erhaltenen Informationen mit LINE Notify benachrichtigt.
Die Anzahl der an diesem Tag infizierten Personen wird täglich im Zusammenhang mit der Epidemie des neuen Koronavirus bekannt gegeben. Unabhängig davon, ob Sie sich um diese Nummer sorgen müssen oder nicht, öffnen Sie Twitter und suchen Sie von Mittag bis Abend, wenn Informationen über die Anzahl der infizierten Personen in Tokio veröffentlicht werden, um die aktuellen Nachrichten zu überprüfen, von denen Sie nicht wissen, wann sie veröffentlicht werden. Ich habe die Angewohnheit anzurufen. (Ich persönlich denke, dass es am schnellsten ist, die aktuellen Nachrichten über die Anzahl der infizierten Personen auf Twitter zu überprüfen.) ➡︎ Ich möchte die Suche nach Twitter auf Twitter vergeblich machen! !! Das ist das Motiv für diese Zeit.
Diese Implementierung ist auf die Anzahl der Infizierten in Tokio spezialisiert, scheint jedoch mit geringfügigen Änderungen auf verschiedene Arten angewendet werden zu können.
pip install tweepy
ist okay! Pip install mecab-python3 == 0.7
aus, und alles, was Sie benötigen, wird automatisch installiert, sodass dies möglicherweise einfacher ist.Das Vorbereiten dieser kann tatsächlich der schwierigste Teil sein. Es macht Spaß zu googeln und verschiedene Tools mit "{was du machen willst} Python" zu finden, aber lol
Die Implementierungsdetails werden unten erläutert, während der tatsächliche Code betrachtet wird.
** 1. Verschiedene Importe ** ** 2. Erstellen Sie ein Objekt für den Twitter-Zugriff ** ** 3. Erstellen Sie ein Objekt für die LINE-Benachrichtigung ** ** 4. Erstellen Sie eine automatische Suchfunktion **
import requests
import datetime
import time
import pandas as pd
from IPython.display import clear_output
#Funktion zum Löschen der Druckausgabe
import tweepy
import MeCab
tagger = MeCab.Tagger("-Owakati")
Der "Tagger" in der letzten Zeile ist das Objekt, das beim Teilen von Sätzen mit MeCab verwendet wird.
Insbesondere mit tagger.parse
tagger.parse("Das Wetter ist heute gut, nicht wahr?")
# => 'Das Wetter ist heute gut, nicht wahr?\n'
tagger.parse("Das Wetter ist heute gut, nicht wahr?").split()
# => ['heute', 'Ist', 'Gut', 'Wetter', 'ist', 'Hallo']
Es ist wie es ist. Wie wir später sehen werden, wird in dieser Implementierung split () verwendet, um einen Listentyp zu erstellen und Tweets zu verarbeiten.
Erstellen Sie ein Objekt, das den Schlüssel und das Token enthält, die Sie durch Registrieren der Twitter-API erhalten haben. Referenz: "Verwendung von Tweety ~ Teil 1 ~ [Getting Tweet]"
consumer_key = "Schlüssel hier erhalten/Token eingeben"
consumer_secret = "Das gleiche wie oben"
access_token = "Das gleiche wie oben"
access_token_secret = "Das gleiche wie oben"
auth = tweepy.OAuthHandler(consumer_key,consumer_secret)
auth.set_access_token(access_token,access_token_secret)
api = tweepy.API(auth) #Ich werde dies später verwenden
Ich habe den Code aus dem zuvor zitierten Artikel "Senden einer Nachricht an LINE mit Python" (https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9) verwendet.
class LINENotifyBot:
API_URL = 'https://notify-api.line.me/api/notify'
def __init__(self, access_token):
self.__headers = {'Authorization': 'Bearer ' + access_token}
def send(
self, message,
image=None, sticker_package_id=None, sticker_id=None,
):
payload = {
'message': message,
'stickerPackageId': sticker_package_id,
'stickerId': sticker_id,
}
files = {}
if image != None:
files = {'imageFile': open(image, 'rb')}
r = requests.post(
LINENotifyBot.API_URL,
headers=self.__headers,
data=payload,
files=files,
)
access_toke_Notify = "Geben Sie hier den Token ein"
bot_Notify = LINENotifyBot(access_token=access_token_Notify)
Wenn Sie nun "bot_Notify.send (message =" xxxxx ")" ausführen, wird LINE an das angegebene Ziel des Tokens gesendet.
Die Grundidee ist
Es ist, als würde man diesen Vorgang in regelmäßigen Abständen wiederholen.
Hier ist also die letzte auszuführende Funktion ** auto_search **.
def auto_search(item=100,wait_time=60,rate=0.5):
"""
item:Anzahl der abzurufenden Tweets
wait_time:Zeitintervall für die automatische Suche Einheit s
rate:Prozentsatz der Tweets, die die geschätzte Anzahl infizierter Personen enthalten
"""
d = datetime.datetime.now().day
m = datetime.datetime.now().month
print("searching on Twitter...")
pre_mode = 0 #Variablen zum Aufzeichnen von Nummern, die zuvor die Rate überschritten haben
while True:
df = find_infected_num(d,item) # "n Menschen"Eine Funktion, die n vom Typ DataFrame zurückgibt
num_mode = df.mode().values[0,0] #Häufigster Wert von df=Holen Sie sich Kandidaten für die Anzahl der infizierten Personen
count = df.groupby("num").size() #Aggregierte Daten der Anzahl der Tweets pro n
#num_Die Häufigkeit des Auftretens des Modus überschreitet die Rate & num_Modus ist ein neues Erscheinungsbild
if count.max() > item*rate and num_mode!=pre_mode:
#Ergebnisausgabe
print("\n--RESULT--")
print(count)
#LINE Benachrichtigung über Ergebnisse
text = "{}Mond{}Tag\n Infizierte Menschen in Tokio[{}]Mann\n * Tweet-Verhältnis ist{:.2f}%".format(m,d,num_mode,count.max()/item*100)
bot_Notify.send(message=text) #An LINE senden
#Bedingte Verzweigung, um eine Fortsetzung zu ermöglichen, wenn das Ergebnis unangemessen ist
if input("\ncontinue? y/n ")=="n":
break #Ende
waiting(2,wait_time,count) #Zur Anzeige während der Wartezeit
#pre_Modus-Update
if count.max() > item*rate:
pre_mode = num_mode
** find_infected_num ** ist eine Funktion zum Zurückgeben von n von "n Personen" in DataFrame. Hier werden der in 1 hergestellte Tagger und die in 2 hergestellte API verwendet.
def find_infected_num(d,item):
num_list = [] #Liste zum Speichern n
for tweet in tweepy.Cursor(api.search, q=['Infektion',"Tokio","{}Tag".format(d)]).items(item):
split_tweet = tagger.parse(tweet.text).split()
if "Mann" in split_tweet:
index = split_tweet.index("Mann") - 1
n = cut_number(split_tweet,index) # "Mann"Funktion, die die Nummer unmittelbar vorher zurückgibt
num_list.append(n)
return pd.DataFrame(num_list,columns=["num"])
** cut_number ** hier ist eine Funktion, um die Nummer unmittelbar vor "person" zu erhalten.
def cut_number(split_tweet,index):
start_i = index #Eine Variable, die die Position darstellt, an der die Nummer im Tweet begonnen hat
# "Mann"Gibt 0 zurück, wenn die unmittelbar vorhergehende Zahl nicht vom Typ str ist (10000 ist angemessen).
if not split_tweet[index] in list(map(str,range(0,10000))):
return 0
ans = split_tweet[start_i] # "Mann"Holen Sie sich die Nummer kurz vor
while True:
#Fügen Sie auf der linken Seite von ans hinzu, solange die Zahlen fortbestehen
if split_tweet[start_i-1] in list(map(str,range(0,9))):
start_i -= 1
ans = split_tweet[start_i] + ans
#Gibt ans zurück, wenn die Nummer vorbei ist
else:
return ans
Lassen Sie mich ein wenig erklären, warum eine solche Funktion benötigt wird. Wenn zum Beispiel der Satz "Heute gibt es 123 infizierte Personen" angezeigt wird, wenn Sie versuchen, durch Mecab zu teilen,
tagger.parse("123 Menschen sind heute infiziert").split()
# => ['heute', 'von', 'Infektion', 'Person', 'Ist', '1', '2', '3', 'Mann']
Auf diese Weise wurden 1, 2 und 3 getrennt. Da nur die letzte Ziffer der Anzahl infizierter Personen abgerufen werden kann, habe ich ** cut_number ** erstellt, um die richtige Anzahl zu erhalten.
Eine weitere Funktion, die in ** auto_search ** angezeigt wird, ist ** wait **. Diese Funktion visualisiert die verbleibende Zeit bis zur nächsten automatischen Suche. (Es ist wie ein Bonus, weil es nichts mit der Funktion der Haupteinheit zu tun hat.)
def waiting(div,wait_time,count):
clear_output()
for i in range(1,wait_time//div+1):
print("waiting: |"+"*"*i+" "*(wait_time//div-i)+"|")
print("\n--RESULT--")
print(count)
time.sleep(div)
clear_output()
print("searching on Twitter...")
Aufgrund der Art des Algorithmus ist es nicht immer möglich, den vorläufigen Bericht über die Anzahl der infizierten Personen abzurufen. Daher versuche ich, ihn zu verschieben und die Parameter anzupassen. (Der obige Code verwendet den bereits angepassten Wert.)
Das Folgende ist das Ausführungsergebnis von ** 7/19 **.
(Laufen mit item = 30
)
Zu diesem Zeitpunkt erhielt LINE die folgende Benachrichtigung.
Wenn Sie y in das Eingabefeld "Weiter" eingeben, wird die Suche fortgesetzt, aber die Anzahl der an diesem Tag in Tokio angekündigten infizierten Personen beträgt 188, also ist es in Ordnung. (Auch wenn Sie weiter suchen, erhalten Sie keine wiederholten Benachrichtigungen, da pre_mode = 188.)
(Laufen mit item = 100
)
Während des Wartens wird es so angezeigt. Wie Sie aus RESULT ersehen können, gibt es keine Kandidaten, die 50% überschreiten, sodass keine Benachrichtigung erfolgt. Im Gegenteil, es ist ersichtlich, dass der Prozentsatz nach Ablauf einer bestimmten Zeitspanne seit Bekanntgabe der Anzahl der infizierten Personen auch bei korrekter Anzahl abnimmt.
Basierend auf den Testergebnissen werde ich zukünftige Probleme auflisten.
rate = 0.5
, aber abhängig von der Tageszeit kann ein falscher Wert als vorläufiger Wert erkannt werden.Ich möchte dieses Programm weiterhin täglich ausführen und testen, um diese Probleme zu bestätigen.
Es scheint, dass Sie den vorläufigen Wert der Anzahl infizierter Personen erhalten können, indem Sie den Tweet der offiziellen Nachrichtenagentur angeben, ohne die Mehrheitsentscheidung aus verschiedenen Tweets zu treffen (und das ist richtig), aber ich weiß nicht genau, wo ich am schnellsten twittern soll. Da es keine solche Methode gibt, habe ich diese Methode ausprobiert. Übrigens habe ich es am 18.7. Getestet, aber die Tweet-Rate von "290" lag unmittelbar nach der Ankündigung über 80%, wahrscheinlich weil die Anzahl der Infizierten in Tokio 290 betrug. Als Reaktion darauf wurde 7/19 zunächst als "Rate = 0,8" betrieben, scheiterte jedoch ohne Benachrichtigung, selbst wenn der vorläufige Wert herauskam. Es lag an mir, die Rate zu senken und anzupassen. Es ist schwierig, je nach Tag über unterschiedliche Grade zu sprechen, aber ich freue mich darauf zu sehen, wie genau Benachrichtigungen mit dem einfachen Algorithmus "Aufnehmen vieler gemurmelter Zahlen" erfolgen können. Aus diesem Grund kann es sein, dass das Interesse eher als persönliche Entwicklung als als praktischer Nutzen verfolgt wird. Lol
Recommended Posts