Was ich getan habe | Hauptveranstaltungen | |
---|---|---|
Episode 1 | Automatisches Wischen nach rechts | |
Episode 2 | Automatisches Senden von Nachrichten | Mit einer Frau abgestimmt |
Folge 3 | Bibliothek | Austauschlinie mit einer passenden Frau |
Nummer 3.Folge 5 | Wiedererlangung des Zugriffstokens | Tokens konnten mit dem vorherigen Code nicht erhalten werden |
Folge 4 | Datensammlung | LINE-Antworten kommen nicht mehr |
Folge 5 | Datenanalyse Profiltext | Informationsprodukte wurden von Leuten empfohlen, mit denen ich befreundet war |
Folge 6 | Datenanalyse Bildausgabe | Ein echtes Bekanntschaftsmädchen ruft mich kürzlich spät in der Nacht an(?) |
Der Code kann von [GitHub] git angezeigt werden.
Ich war damit beschäftigt, mich auf die Konferenz vorzubereiten, und als ich es merkte, waren seit dem letzten Artikel mehr als zwei Monate vergangen. Der Crawler hat jedoch die ganze Zeit gearbeitet, sodass ich viele Daten habe, die ich seit dem letzten Mal gesammelt habe. Sie kann es nicht wie gewohnt machen.
Es wurden viele Daten gesammelt. Es gibt 10632 Frauen, die geklaut haben. 72 von ihnen stimmten überein. Es passt nicht so gut wie ich erwartet hatte. Beim letzten Mal habe ich die Tabellendaten in der Tabelle und die Bilddaten in Google Drive gespeichert und sie zunächst heruntergeladen. Beim Herunterladen einer Tabelle können Sie mehrere Dateiformate auswählen. Wenn Sie sie jedoch mit csv oder tsv herunterladen, sind die Zeilenumbrüche im Profiltext und die von Ausländern im Profiltext geschriebenen Kommas schlecht und es war nutzlos problematisch. Speichern Sie es also im XLSX-Format. Außerdem gab es ungefähr 25.000 Profilbilder, so dass das Herunterladen lange dauerte. Die Analyse erfolgt auf dem Jupyter-Notebook.
Bitte beachten Sie, dass diese Daten eine Überprüfung der anhand meines Profils gesammelten Daten darstellen. Wenn Sie sie also ausführen, kann das Ergebnis abweichen. [^ 1] Bitte sei vorsichtig.
Schauen wir uns zunächst die Daten der übereinstimmenden Personen an.
analytics.py
import pandas as pd
import numpy as np
from tqdm.notebook import tqdm
import matplotlib.pyplot as plt
import seaborn as sns
from collections import Counter
filePath="data/tinder.xlsx"
df=pd.read_excel(filePath)
df.set_index("id", inplace=True)
match = df[df["match"]==1]
Gibt es jemanden, den du nicht erkennst? ??
Als nächstes werden die Daten der Person angezeigt, die nicht übereinstimmte.
analytics.py
unmatch = df[df["match"]==0]
Es sieht aus wie Pat, aber ich habe das Gefühl, dass die passende Person den Profiltext fester ausfüllt. Lass uns nachsehen. Es ist schwierig, "einen gut geschriebenen Profilsatz" zu definieren, aber vorerst überprüfen wir einfach die Anzahl der Zeichen im Profilsatz.
analytics.py
%matplotlib inline
sns.distplot(unmatch["bio"].apply(lambda w:len(str(w))), color="b", bins=30)
sns.distplot(match["bio"].apply(lambda w:len(str(w))), color="r", bins=30)
Das Ergebnis ist wie folgt. Diejenigen, die zu Rot passten, und diejenigen, die nicht zu Blau passten.
Immerhin habe ich das Gefühl, dass Rot weniger Zeichen nahe Null hat als Blau. Tatsächlich scheint es viele Konten zu geben, die kein einziges Zeichen in das Profil für diejenigen schreiben, die nicht übereinstimmen. Konten mit einem leeren Profil stimmen mit geringerer Wahrscheinlichkeit überein, selbst wenn Sie nach rechts wischen. Daher ist es besser, nicht zu wischen.
Zunächst möchte ich die im Profilsatz enthaltenen Wörter überprüfen. Für Profilsätze wird die morphologische Analyse mit der morphologischen Analyse-Engine MeCab [1] und dem erweiterten Wörterbuch mecab-ipadic-NEologd [2] durchgeführt.
Sie können MeCab mit `` `pip install mecab-python3``` installieren. Für die Installationsmethode von mecab-ipadic-NEologd ist der offizielle Text [3] sehr gut organisiert. Bitte beachten Sie dies. Sie können verschiedene Optionen auswählen, aber für diejenigen, die wirklich Probleme haben
$git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git ~/neologd
$echo yes | ~/neologd/bin/install-mecab-ipadic-neologd -n -a
Dann können Sie es installieren.
Rufen Sie mecab von Python aus an, um Ihre Profilanweisung Wort für Wort aufzuteilen.
Wenn Sie einfach Mecab aufrufen, wird ein Standardwörterbuch verwendet. Geben Sie daher NEologd als Option an. Der Speicherort des Wörterbuchs kann mit `echo` mecab-config --dicdir`" / mecab-ipadic-neologd "`
ermittelt werden.
mecab.py
import subprocess
import MeCab
cmd = 'echo `mecab-config --dicdir`"/mecab-ipadic-neologd"'
path = (subprocess.Popen(cmd, stdout=subprocess.PIPE,
shell=True).communicate()[0]).decode('utf-8')
m = MeCab.Tagger("-d {0}".format(path))
print(m.parse("Sie tanzte verliebt in Penpainappoappopen."))
#>>
#Ihre Nomenklatur,Gleichbedeutend,Allgemeines,*,*,*,Freundin,Freundin,Freundin
#Ist ein Assistent,Hilfe,*,*,*,*,Ist,C.,Beeindruckend
#Stift Ananas Appo Stift Nomenklatur,Proprietäre Nomenklatur,Allgemeines,*,*,*,Pen-Pineapple-Apple-Pen,Stift Ananas Apfelstift,Stift Ananas Apfelstift
#Und Hilfswörter,Parallele Assistenten,*,*,*,*,Wann,Zu,Zu
#Liebestanz Nomen,Proprietäre Nomenklatur,Allgemeines,*,*,*,Liebestanz,Liebestanz,Liebestanz
#Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,Wo,Wo
#Tanzverb,Unabhängigkeit,*,*,Fünf Schritte, La Linie,Kontinuierliche Verbindung,tanzen,Seltsam,Seltsam
#Hilfsverb,*,*,*,Besondere,Grundform,Ta,Ta,Ta
#.. Symbol,Phrase,*,*,*,*,。,。,。
#EOS
Dies wird verwendet, um die im Profilsatz enthaltenen Wörter aus jeder der übereinstimmenden und nicht übereinstimmenden Personen zu extrahieren.
analytics.py
def getWord(df):
retval = []
for bio in df.bio:
parse = m.parse(str(bio)).strip().split("\n")
for p in parse:
if ("\t" in p) == False:
continue
word, desc = p.split("\t")
if desc.split(",")[0] in ("Substantiv", "Verb", "Adjektiv", "形容Verb", "Coalm", "Adverb", "Verbindung", "感Verb", "Symbol"): # 助詞と助Verbを除きたかった
retval.append(word)
return retval
bio_match = getWord(match)
bio_unmatch = getWord(unmatch)
Die Liste der erhaltenen Wörter wird in der Reihenfolge der Häufigkeit des Auftretens angezeigt. Zuallererst von der Person, die übereinstimmte.
analytics.py
df_bio_match = pd.DataFrame.from_dict(
Counter(bio_match), orient="index").reset_index().rename(columns={"index":"word",0:"count"})
sns.barplot(data=df_bio_match.sort_values(
"count", ascending=False)[:20], x="word", y="count")
plt.xticks(rotation="vertical")
Der Tofu, der vorkommt, ist so etwas wie ein Leerzeichen. Vielleicht dünn? Ich habe mich gefragt, wer ∇ (Nabla) verwendet, also habe ich es überprüft und festgestellt, dass es für Gesichtsbuchstaben wie (・ ∇ ・) verwendet wird. Als nächstes kommt die Person, die nicht übereinstimmt.
analytics.py
df_bio_unmatch = pd.DataFrame.from_dict(
Counter(bio_unmatch), orient="index").reset_index().rename(columns={"index":"word",0:"count"})
sns.barplot(data=df_bio_unmatch.sort_values(
"count", ascending=False)[:20], x="word", y="count")
plt.xticks(rotation="vertical")
Es scheint einen Unterschied in der Tendenz zu geben, es scheint, dass es nicht ... Zum Beispiel kann man sehen, dass übereinstimmende Personen dazu neigen, Sätze nicht zu durchstechen. Auch wenn es viele Leute gibt, die mit oder ohne Match "like" in Kanji schreiben, passt keiner von ihnen zu denen, die "suki" in Hiragana schreiben. ~~ Ist es eine Landmine? ~~ Um ehrlich zu sein, glaube ich nicht, dass dies im Fehlerbereich liegt, da die Anzahl der Stichproben übereinstimmender Personen gering ist, aber es kann sich lohnen, sich daran zu erinnern.
Lassen Sie uns abschließend die Profilanweisung mit Doc2Vec vektorisieren. Vor einigen Jahren wurde DNN, das das Wort Word2Vec vektorisiert, zu einem großen Thema im NLP-Bereich, aber Doc2Vec ist ein Algorithmus, der es auf Sätze anstelle von Wörtern anwendet. Die Erklärung von Word2Vec war in [4] hilfreich, und die Erklärung von Doc2Vec war in [5] [6] hilfreich. Die Implementierung verwendet eine Bibliothek namens gensim [7]. Bitte installieren Sie es mit `` `pip install gensim```. Für den spezifischen Code habe ich auf [8] verwiesen.
analytics.py
#Teilen Sie die Daten in Trainingsdaten und Testdaten
df_train, df_test = train_test_split(df, random_state=8888)
#Teilen Sie Profilsätze mit MeCab in Wörter
m_wakati = MeCab.Tagger("-d {0} -Owakati".format(path)) #MeCab-Optionen-Durch Hinzufügen von Owakati werden Wörter durch Leerzeichen getrennt, ohne Teilwörter auszugeben.
bios=[]
for bio in df_train.bio:
bio = m_wakati.parse(str(bio)).strip()
bios.append(bio)
#Konvertieren Sie Daten in ein Format, das von gensim verarbeitet werden kann
trainings = [TaggedDocument(words = data.split(),tags = [i]) for i,data in enumerate(bios)]
#Erfahren Sie doc2vec
doc2vec = Doc2Vec(documents=trainings, dm=1, vector_size=300, window=4, min_count=3, workers=4)
#Holen Sie sich einen Vektor mit Trainingsdaten
X_train = np.array([doc2vec.docvecs[i] for i in range(df_train.shape[0])])
#Holen Sie sich das richtige Antwortetikett für Trainingsdaten
y_train = df_train["match"]
#Holen Sie sich den Testdatenvektor und das richtige Etikett
X_test = np.array([doc2vec.infer_vector(m.parse(str(bio)).split(" ")) for bio in df_test.bio])
y_test = df_test["match"]
Lassen Sie uns den vektorisierten Text mit PCA visualisieren. Zunächst aus den Trainingsdaten.
analytics.py
from sklearn.decomposition import PCA
pca = PCA()
X_reduced = pca.fit_transform(X_train)
plt.scatter(X_reduced[y_train==0][:,0], X_reduced[y_train==0][:,1], c="b", label="No Match")
plt.scatter(X_reduced[y_train==1][:,0], X_reduced[y_train==1][:,1], c="r", label="Match")
plt.legend()
Für diejenigen, die nicht übereinstimmten, gibt es eine bestimmte Anzahl von Personen, die eine große zweite Hauptkomponente haben, während die zweite Hauptkomponente derjenigen, die übereinstimmten, im Allgemeinen bei 0 liegt. Schauen wir uns auch die Testdaten an.
analytics.py
X_test_reduced = pca.transform(X_test)
plt.scatter(X_test_reduced[y_test==0][:,0], X_test_reduced[y_test==0][:,1], c="b", label="No Match")
plt.scatter(X_test_reduced[y_test==1][:,0], X_test_reduced[y_test==1][:,1], c="r", label="Match")
plt.legend()
Diejenigen, die übereinstimmen, können sehen, dass die zweite Hauptkomponente nahe 0 gesammelt wird.
Nachdem die Sätze vektorisiert wurden, wenden wir maschinelles Lernen an, um sie zu klassifizieren. Klassifizieren Sie Profilanweisungsvektoren mithilfe einer Support-Vektor-Maschine. Da es sich bei den diesmal verarbeiteten Daten um extrem voreingenommene, unausgeglichene Daten handelt, werden alle Profile als "nicht übereinstimmend" beurteilt, wenn die Entscheidungsgrenze gehorsam gezogen wird. Das ist nutzlos. Als ich auf das zurückblickte, was ich dieses Mal tun wollte, wollte ich zunächst nicht die Genauigkeit des maschinellen Lernens verbessern, aber sie wollte es. Konzentration auf jeden Punkt der Verwirrungsmatrix,
Erläuterung | Bemerkungen | |
---|---|---|
TP | Entschlossen, der Person zu entsprechen, die tatsächlich übereinstimmt | Das ist was Sie suchen |
TN | Beurteilen Sie, dass Personen, die nicht übereinstimmen, nicht übereinstimmen | Sie können unnötiges Wischen nach rechts reduzieren |
FP | Entschlossen, Personen zu entsprechen, die nicht wirklich übereinstimmen | Der rechte Schlag wird einmal verschwendet |
FN | Beurteilen Sie, dass die Person, die tatsächlich übereinstimmt, nicht übereinstimmt | Ich kann die bestimmte Person nicht treffen |
Offensichtlich ist FN das Schlimmste und ich möchte es um jeden Preis vermeiden. Andererseits ist es wünschenswert, dass FP nicht auftritt, aber es spielt keine Rolle, ob es ein wenig auftritt. Daher ist es bei dieser Aufgabe erforderlich, dass der Rückruf so hoch wie möglich ist. Andererseits sind Präzisions- und F-Werte akzeptabel, selbst wenn sie niedrig sind. Wenn Sie vorhersagen, dass alle Fälle "übereinstimmen", können Sie natürlich einen hohen Rückruf erhalten, wenn Sie die Präzision und den F-Wert zerstören [^ 2]. Deshalb haben wir maschinelles Lernen eingeführt, um dies zu vermeiden. Aus diesem Grund muss ich sagen, dass es ein Sturz ist, wenn der Rückruf sinkt. Daher werden wir dieses Mal eine Strategie verfolgen, um die Wahrscheinlichkeit eines Matchings durch Regressor abzuschätzen und einen relativ niedrigen Schwellenwert festzulegen, um nur "Bösewichte zu eliminieren, bei denen es offensichtlich unwahrscheinlich ist, dass sie übereinstimmen". Der Verdacht ist ein rechter Schlag. Auc wird als Bewertungsindex verwendet.
analytics.py
from sklearn.svm import SVR
from sklearn.metrics import roc_auc_score
model = SVR(C=100.0)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(roc_auc_score(y_test, y_pred))
#>>0.6196
Über auc0.6! Ist das nicht ein ziemlich gutes Ergebnis? Spezifische Schwellenwerteinstellungen werden vorgenommen, nachdem das Bild analysiert wurde. Der Artikel ist lang geworden, also bin ich heute hier. Bitte freuen Sie sich auf die nächste Profilbildausgabe.
Episode 6 ist [hier] [Folge 6]
[1]https://taku910.github.io/mecab/ [2]https://github.com/neologd/mecab-ipadic-neologd [3]https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md [4] Yasuki Saito, Deep Learning von Grund auf ❷ - Verarbeitung natürlicher Sprache [5] https://kitayamalab.wordpress.com/2016/12/10/doc2vecparagraph-vector-algorithm / [6]https://deepage.net/machine_learning/2017/01/08/doc2vec.html [7]https://radimrehurek.com/gensim/index.html [8]https://qiita.com/asian373asian/items/1be1bec7f2297b8326cf
[^ 1]: Ich möchte überprüfen, welche Art von Unterschied auftreten wird, wenn das gleiche Experiment zwischen gutaussehend und mir durchgeführt wird. Nein, vielleicht möchten Sie es nicht sehen. [^ 2]: Und das wurde durch die bisher implementierte Swipe-Strategie erreicht, die als All-Right-Swipe bezeichnet wird.
Recommended Posts