[PYTHON] Sagen Sie mit Word2Vec + Random Forest die Anzahl der Kissen voraus, die als Lachbefragte empfangen werden können

Motivation

Ich mag Lachen sehr und wenn ich nach Hause gehe, schaue ich mir das aufgezeichnete Lachen endlos an. Vorübergehend von der Erforschung der Verarbeitung natürlicher Sprache befreit, machen Sie eine Pause und lachen Sie ...

Chachara ~ Charara ** Cha ** ** Cha! !! !! !! !! ** ** **

inside-head


Erhalten Sie die Antwort:(Geben Sie eine Antwort ein, die wie ein Lachpunkt aussieht.
Yamada-Kun! Nehmen Sie einen von Sanyutei Enraku-san!

Puff! (Inspirierender Mann)

Was ist ein Lachpunkt?

・ Unterhaltungsprogramme, die schon lange stattfinden ・ Ogiri ist berühmt für professionelle Rakugo-Künstler, die stilvolle Antworten auf das Thema geben. ・ Wenn Sie eine interessante Antwort geben, erhalten Sie ein Kissen. Wenn Sie ausrutschen oder eine unhöfliche Antwort geben, werden Sie vom Kissen genommen ・ Sammle 10 Kissen und erhalte tolle Produkte

Zweck

Nachdem Sie eine lachende Antwort eingegeben haben, ・ Wer ist der Antwort am nächsten? ・ Wie viele Kissen kann ich bekommen? Wird vorhergesagt und angezeigt.

Vorgehensweise ① Satzerfassung, Vorverarbeitung

Von Nippon Television veröffentlichte Inhalte früherer Sendungen [http://www.ntv.co.jp/sho-ten/02_week/kako_2011.html](http://www.ntv.co.jp/sho-ten / 02_week / kako_2011.html) für 2011 ·Antworten · Befragter ・ Erhöhen / Verringern der Kissen Aufzeichnung. Andere Antworten als die sechs Hauptbefragten (Ansager Ogiri, junger Ogiri usw.) wurden ausgeschlossen.

Die Anzahl der gesammelten Antworten betrug 1773. Es war überraschend, dass es mit etwa 330 Antworten pro Person keinen großen Unterschied gab.

Symbole und seltsame Leerzeichen wurden aus diesem Satz gestrichen, Piktogramme wurden mit Emoji entfernt und Groß- und Kleinschreibung wurden mit Mojimoji vereinheitlicht.

Schritt ② Word2Vec

Ich habe mit Word2Vec einen Satz in einen 200-dimensionalen Vektor umgewandelt. Vektorisieren Sie Wörter in Sätzen mit japanischer Wikipedia-Entitätsvektor. (Ich dachte, es wäre eine gute Idee, Wikipedia für die Antwort des Lachens mit vielen verbalen Ausdrücken zu verwenden, aber ich konnte das erlernte Modell, das leicht verwendet werden kann, nicht übertreffen.) Die Summe der aus den Antworten entnommenen Wortvektoren wurde als Antwortvektor verwendet.

Schritt ③ Lernen Sie in Random Forest

Ich habe einen Klassifikator in einer zufälligen Gesamtstruktur erstellt. Zufälliger Wald ist sehr gut, weil er leicht berechnet ist. Wir haben die Parameter auch mit Gridsearch CV optimiert. Der Parametersuchbereich ist Maximale Tiefe: 1 ~ 10 Anzahl der Bäume entschieden: 1 ~ 1000 ist.

Extrahieren Sie nach dem Durchsuchen der Parameter den mit der höchsten Genauigkeit und speichern Sie den Klassifikator mit Pickle.

gridsearch.py


grid_mori_speaker = GridSearchCV(RandomForestClassifier() , grid_param_mori() , cv=10 ,scoring = 'accuracy', verbose = 3,n_jobs=-1)
grid_mori_speaker.fit(kotae_vector,shoten.speaker)
grid_mori_speaker_best = grid_mori_speaker.best_estimator_
with open('shoten_speaker_RF.pickle',mode = 'wb') as fp :
    pickle.dump(grid_mori_speaker_best,fp)

Berechnen Sie dies anhand der Anzahl der Kissen, die von den Befragten identifiziert werden können, und speichern Sie es als Pickle-Datei.

Übrigens betrug die höchste korrekte Antwortrate bei der Diskriminierung der Befragten 0,25 und die Anzahl der Kissen 0,50. Es ist immer noch ziemlich niedrig, daher möchte ich die Schritte (2) bis (3) verbessern, um die Genauigkeit zu verbessern.

Schritt ④ Erstellen Sie ein Programm zur Eingabe von Sätzen und zur Klassifizierung

Erstellen Sie ein Programm, mit dem Sie Sätze manuell eingeben und die Klassifizierungsergebnisse anzeigen können. Ich dekomprimiere den Sortierer, der in eine Pickle-Datei konvertiert wurde, füge einen Satzvektor ein und gebe das Klassifizierungsergebnis aus.

shoten.py


#usr/bin/env python
#coding:utf-8

import numpy as np
import re
import emoji
import mojimoji
import MeCab
from gensim.models import KeyedVectors
import pickle

mecab = MeCab.Tagger("")#Wenn Sie das Neologd-Wörterbuch verwenden, geben Sie bitte den Pfad ein
model_entity = KeyedVectors.load_word2vec_format("entity_vector.model.bin",binary = True)

with open('shoten_speaker_RF.pickle', mode='rb') as f:
    speaker_clf = pickle.load(f)
with open('shoten_zabuton_RF.pickle', mode='rb') as f:
    zabuton_clf = pickle.load(f)
    
def text_to_vector(text , w2vmodel,num_features):
    kotae = text
    kotae = kotae.replace(',','、')
    kotae = kotae.replace('/n','')
    kotae = kotae.replace('\t','')
    kotae = re.sub(r'\s','',kotae)
    kotae = re.sub(r'^@.[\w]+','',kotae)
    kotae = re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-]+','',kotae)
    kotae = re.sub(r'[!-/:-@[-`{-~ ]+','',kotae)
    kotae = re.sub(r'[:-@, [] ★ ☆ "". , ・]+','',kotae)
    kotae = mojimoji.zen_to_han(kotae,kana = False)
    kotae = kotae.lower()
    kotae = ''.join(['' if character in emoji.UNICODE_EMOJI else character for character in kotae])
    kotae_node = mecab.parseToNode(kotae)
    kotae_line = []
    while kotae_node:
        surface = kotae_node.surface
        meta = kotae_node.feature.split(",")
        if not meta[0] == 'Symbol' and not meta[0] == 'BOS/EOS':
            kotae_line.append(kotae_node.surface)
        kotae_node = kotae_node.next
    feature_vec = np.zeros((num_features), dtype = "float32")
    word_count = 0
    for word in kotae_line:
        try:
            feature_vec = np.add(feature_vec,w2vmodel[word])
            word_count += 1
        except KeyError :
            pass
        if len(word) > 0:
            if word_count == 0:
                feature_vec = np.divide(feature_vec,1)
            else:
                feature_vec = np.divide(feature_vec,word_count)
        feature_vec = feature_vec.tolist()
    return feature_vec

def zabuton_challenge(insert_text):
    vector = np.array(text_to_vector(insert_text,model_entity,200)).reshape(1,-1)
    if(zabuton_clf.predict(vector)[0] == 0):
        print(str(speaker_clf.predict(vector)[0])+"Ich werde dir kein Kissen geben")
    elif(zabuton_clf.predict(vector)[0] < 0):
        print("Yamada-Kun!"+str(speaker_clf.predict(vector)[0])+"an Herrn oder Frau"+str(zabuton_clf.predict(vector)[0])+"Gib mir ein Stück!")
    elif(zabuton_clf.predict(vector)[0] > 0):
        print("Yamada-Kun!"+str(speaker_clf.predict(vector)[0])+"Von"+str(zabuton_clf.predict(vector)[0] * -1)+"Nehmen Sie einen!")
    else:
        print("Yamada-Kun! Klassifikator, der einen Fehler ausgibt Bringen Sie alle von Ihnen erstellten Entwicklerkissen mit!")
        
if __name__ == "__main__":
    while True:
        text = input("Bitte antworte:")
        zabuton_challenge(text)

Bitte verzeihen Sie mir, dass ich jetzt nicht viele Kommentare schreibe. Der Inhalt der Funktion text_to_vector () ist eine modifizierte Version des Codes, der in einem der Blog-Beiträge geschrieben wurde (es tut mir leid, dass ich die Quelle verloren habe).

Bewegung

Sie können Sätze eingeben, indem Sie shoten.py starten. (Es dauert eine Weile, bis die Pickle-Datei zuerst gelesen wird ...)

Geben Sie als Antwortdaten Antwort auf die 2395. erste Frage, die am 29. Dezember 2012 ausgestrahlt wurde ein. Versuchen.

コメント 2019-12-01 161726.png

Es werden nur Herr Koyuzo, Herr Enraku und Herr Kikuogi ausgegeben, aber je nach Antwort werden auch die anderen drei ausgegeben. Der Grund, warum die richtige Antwortrate nicht gut ist, ist, dass die Genauigkeit des erstellten Klassifikators schlecht ist. Ich denke auch, dass der Grund, warum niemand ein Kissen erhalten hat, darin besteht, dass mehr als die Hälfte der gesammelten Daten 0 Kissen waren.

Verbesserungsplan

・ Sammeln Sie mehr Daten (Auf der Website der Sammlungsquelle werden die Antworten von 2011 bis April 2014 aufgelistet. Ich möchte mehr Daten sammeln und die Anzahl der Daten ermitteln ~~ Es ist sehr mühsam ~~) ・ Verwenden Sie einen Korpus, der stark in verbalen Ausdrücken ist (ich konnte nichts anderes als den Korpus von Wikipedia finden. Wenn Sie also etwas wissen, das stark in verbalen Ausdrücken ist, lassen Sie es mich bitte wissen). ・ Ändern Sie den Klassifizierungsalgorithmus (ich denke darüber nach, BERT auszuprobieren, weil ich BERT in meiner Forschung verwenden möchte).

Recommended Posts

Sagen Sie mit Word2Vec + Random Forest die Anzahl der Kissen voraus, die als Lachbefragte empfangen werden können
[Python] Ein Programm, das die maximale Anzahl von Spielzeugen findet, die mit Ihrem Geld gekauft werden können
Sagen Sie die Anzahl der mit COVID-19 infizierten Personen mit Prophet voraus
[Python] Ein Programm, um die Anzahl der Äpfel und Orangen zu ermitteln, die geerntet werden können
Formatübersicht der Formate, die mit gensim serialisiert werden können
Messen Sie die Wichtigkeit von Features mit einem zufälligen Gesamtstrukturwerkzeug
Vergleich von 4 Stilen, die mit set_context an seaborn übergeben werden können
[Python] Code, der zu Beginn beim Scraping als Anfänger mit Hirntod geschrieben werden kann
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
Maximale Anzahl von Funktionsparametern, die in jeder Sprache definiert werden können
Artikel, der eine Person sein kann, die den Mechanismus der API versteht und beherrscht (mit Python-Code)
Zählen Sie die Anzahl der Zeichen mit Echo
Tensorflow scheint es, dass sogar der Eigenwert der Matrix automatisch unterschieden werden kann
Python-Tricks: Eine Kombination aus enumerate () und zip (), bei der überprüft wird, ob eine Zeichenfolge in eine Zahl konvertiert werden kann, wobei die Zeichenfolge als Zahl sortiert wird
[Python] Ich habe eine Praxis untersucht, die durch asynchrone Verarbeitung (Multiprocessing, Asyncio) parallel zum Hauptthread ausgeführt werden kann.