Einführung in sie gemacht mit Python ~ Tinder Automatisierungsprojekt ~ Episode 5

Inhaltsverzeichnis

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.

Synopse bis zum letzten Mal

Aktuelle Situation

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.

Datenanalyse

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 Sie sich die Daten an

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. bio-length.png

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.

Profiltext im Detail anzeigen

Morphologische Analyse

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.

Installation

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.

Wort geteilt

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

Wörter, die häufig von passenden Personen verwendet werden

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")

bio-match.png

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")

bio-unmatch.png

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.

Satzvektorisierung

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()

pca_train.png 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()

pca_test.png

Diejenigen, die übereinstimmen, können sehen, dass die zweite Hauptkomponente nahe 0 gesammelt wird.

Maschinelles Lernen

Klassifizierung mit svm

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]

Verweise

[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

Einführung in sie gemacht mit Python ~ Tinder Automatisierungsprojekt ~ Episode 6
Einführung in sie gemacht mit Python ~ Tinder Automatisierungsprojekt ~ Episode 5
IPynb-Bewertungssystem mit TA von Introduction to Programming (Python)
[Einführung in Python] Verwenden wir foreach mit Python
[Python] Einfache Einführung in das maschinelle Lernen mit Python (SVM)
Einführung in die künstliche Intelligenz mit Python 1 "Genetic Algorithm-Theory-"
Markov Chain Artificial Brainless mit Python + Janome (1) Einführung in Janome
Markov-Kette Künstlich Gehirnlos mit Python + Janome (2) Einführung in die Markov-Kette
Einführung in die künstliche Intelligenz mit Python 2 "Genetic Algorithm-Practice-"
Einführung in Tornado (1): Python Web Framework mit Tornado gestartet
Einführung in den Formationsflug mit Tello edu (Python)
Einführung in Python mit Atom (unterwegs)
Einführung in das Generalized Linear Model (GLM) von Python
[Einführung in die Udemy Python3 + -Anwendung] 9. Drucken Sie zunächst mit print
Einführung in die Python-Sprache
Einführung in OpenCV (Python) - (2)
[Einführung in Python] Wie iteriere ich mit der Bereichsfunktion?
[Kapitel 5] Einführung in Python mit 100 Klopfen Sprachverarbeitung
Einführung in die verteilte Parallelverarbeitung von Python durch Ray
Lesehinweis: Einführung in die Datenanalyse mit Python
Ich habe versucht, Othello dazu zu bringen, Kindern Python3 beizubringen (6) Final
[Kapitel 3] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 2] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Automatisierung] Betreiben Sie GitLab mit Python, um die Verwaltung von Anfragen zu vereinfachen
[Kapitel 4] Einführung in Python mit 100 Klopfen Sprachverarbeitung
Einführung in Python Django (2) Win
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Stellen Sie mit Python eine Verbindung zu Wikipedia her
Post to Slack mit Python 3
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
20200329_Einführung in die Datenanalyse mit Python 2nd Edition Personal Summary
Konvertieren Sie das Scratch-Projekt in Python
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Einführung in Python für VBA-Benutzer - Aufrufen von Python aus Excel mit xlwings-
Schalten Sie Python mit Alternativen auf 2.7 um
Schreiben Sie mit Python in csv
[Einführung in Python] <Liste> [Bearbeiten: 22.02.2020]
Einführung in Python (Python-Version APG4b)
Eine Einführung in die Python-Programmierung
[Raspi4; Einführung in den Sound] Stabile Aufzeichnung der Toneingabe mit Python ♪
Ich habe mit Python einen Blackjack gemacht.
Othello gemacht mit Python (wie GUI)
Ich habe Wordcloud mit Python gemacht.
Einführung in Python For, While
[Einführung in Python] So erhalten Sie Daten mit der Funktion listdir
[Einführung in Udemy Python3 + Application] 51. Seien Sie vorsichtig mit Standardargumenten
Aktiviert, um PNG mit Pillow of Python in JPG zu konvertieren
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Ich las "Das Lernen mit Python von der Einführung bis zur Praxis stärken", Kapitel 1
Einführung in die Bayes'sche statistische Modellierung mit Python ~ Versuch einer linearen Regression mit MCMC ~
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Fühlen wir uns wie ein Materialforscher mit Python [Einführung in Pymatgen]
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Ich las "Das Lernen mit Python von der Einführung bis zur Praxis stärken", Kapitel 2
[Einführung in die Udemy Python3 + -Anwendung] 58. Lambda
[Einführung in die Udemy Python3 + -Anwendung] 31. Kommentar
Python: So verwenden Sie Async mit