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)
・ 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
Nachdem Sie eine lachende Antwort eingegeben haben, ・ Wer ist der Antwort am nächsten? ・ Wie viele Kissen kann ich bekommen? Wird vorhergesagt und angezeigt.
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.
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.
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.
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).
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.
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.
・ 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