Schnelle Stilometrie-Python-Bibliothek

· Thomas Wood
Schnelle Stilometrie-Python-Bibliothek

Erweitern Sie Ihr Team mit NLP-Spezialisten

Entfesseln Sie das Potenzial Ihrer NLP-Projekte mit dem richtigen Talent. Veröffentlichen Sie Ihre Stelle bei uns und ziehen Sie Kandidaten an, die genauso leidenschaftlich über natürliche Sprachverarbeitung sind.

NLP-Experten einstellen

Schnelles Stilometrie-Tutorial

Ich stelle eine von mir geschriebene Python- Bibliothek namens faststylometry vor, die es Ihnen ermöglicht, Autoren von Texten anhand ihres Schreibstils zu vergleichen. Die Wissenschaft, die Fingerabdrücke von Autoren auf diese Weise zu vergleichen, wird als forensische Stilometrie bezeichnet.

Um dieses Tutorial durchführen zu können, benötigen Sie Grundkenntnisse in Python.

Die Faststylometry- Bibliothek verwendet den Burrows-Delta-Algorithmus, eine bekannte stilometrische Technik. Die Bibliothek kann auch die Wahrscheinlichkeit berechnen, dass zwei Bücher vom selben Autor stammen.

Ich habe diese Bibliothek geschrieben, um mein Verständnis zu verbessern, und auch, weil die vorhandenen Bibliotheken, die ich finden konnte, sich auf die Erstellung von Diagrammen konzentrierten, aber nicht so weit gingen, Wahrscheinlichkeiten zu berechnen.

Hier gebe ich eine exemplarische Vorgehensweise zur Durchführung einer grundlegenden Stilometrieanalyse mithilfe der Faststylometry- Bibliothek. Wir werden den Delta-Code von Burrows an zwei „unbekannten“ Texten testen: Sense and Sensibility von Jane Austen und Villette von Charlotte Brontë. Beide Autoren sind in unserem Schulungskorpus.

Demo zur Autorenidentifizierung der forensischen Stilometrie auf fastdatascience.com Klicken Sie hier, um die Live-Demo der Forensic Stylometry-Bibliothek faststylometry auszuprobieren.

​Delta-Algorithmus von Burrows

Das Burrows-Delta ist eine Statistik, die den Abstand zwischen den Schreibstilen zweier Autoren ausdrückt. Eine hohe Zahl wie 3 bedeutet, dass die beiden Autoren sehr unterschiedlich sind, wohingegen eine niedrige Zahl wie 0,2 bedeuten würde, dass zwei Bücher mit hoher Wahrscheinlichkeit vom selben Autor stammen. Hier ist ein Link zu einer nützlichen Erklärung der Mathematik und Denkweise hinter Burrows‘ Delta und seiner Funktionsweise .

Das Burrows-Delta wird berechnet, indem die relativen Häufigkeiten von Funktionswörtern wie „inside“, „and“ usw. in den beiden Texten verglichen werden, wobei deren natürliche Variation zwischen den Autoren berücksichtigt wird.

​Faststilometry installieren

Wenn Sie Python verwenden, können Sie die Bibliothek mit dem folgenden Befehl installieren:

„ pip install faststylometry „

Das Jupyter-Notizbuch für diese exemplarische Vorgehensweise finden Sie hier .

Burrows Delta walkthrough in Jupyter Notebook

Komplettlösung für Burrows Delta im Jupyter Notebook

​Laden der Bibliothek

Zuerst starten wir Python. Zuerst müssen wir die Stilometriebibliothek importieren:

„ aus Faststylometry Import Corpus aus Faststylometry importieren Load_corpus_from_folder aus faststylometry import tokenise_remove_pronouns_en aus dem Faststylometry-Import berechne_burrows_delta Aus Faststylometry importieren, Predict_Proba, kalibrieren „

Die Bibliothek hängt von NLTK (dem Natural Language Toolkit) ab. Wenn Sie sie also zum ersten Mal verwenden, müssen Sie möglicherweise die folgenden Befehle in Ihrer Python- Umgebung ausführen, wenn Sie den integrierten Tokeniser verwenden möchten:

„ NLTK importieren nltk.download(“punkt”) „

​Einige Bücher in einen Korpus laden

Ich habe Ihnen einige Testdaten zum Spielen mit der Bibliothek bereitgestellt, die Sie hier vom Github-Projekt herunterladen können. Es handelt sich um eine Auswahl klassischer Literatur aus dem Projekt Gutenberg , darunter Jane Austen und Charles Dickens. Aus urheberrechtlichen Gründen kann ich keine neueren Bücher zur Verfügung stellen, Sie können diese aber jederzeit woanders beziehen.

Wenn Sie Git verwenden, können Sie die Beispieltexte mit diesem Befehl herunterladen:

„ Git-Klon https://github.com/fastdatascience/faststylometry

Stellen Sie sicher, dass sich die Buchtexte im Ordner faststylometry/data/train auf Ihrem Computer befinden und jede Datei den Namen „Autorenname“_-_“Buchtitel“.txt trägt, zum Beispiel:

stylometry folder screenshot

Sie können die Bücher nun in die Bibliothek laden und sie nach englischen Regeln tokenisieren:

„ train_corpus = load_corpus_from_folder(“faststylometry/data/train”) train_corpus.tokenise(tokenise_remove_pronouns_en) „

Alternativ können Sie Bücher wie folgt zu Ihrem Korpus hinzufügen:

„ Korpus = Korpus() corpus.add_book(“Jane Austen”, “Pride and Prejudice”, [gesamter Buchtext]) „

​Die Urheberschaft eines unbekannten Buches ermitteln

Ich habe uns auch einige „unbekannte“ Bücher zur Verfügung gestellt, um die Leistung des Algorithmus zu testen. Stellen Sie sich vor, wir sind auf ein Werk gestoßen, dessen Autor unbekannt ist. Die Bücher, die ich aufgenommen habe, sind Sense and Sensibility , geschrieben von Jane Austen (aber als „janedoe“ gekennzeichnet), und Villette , geschrieben von Charlotte Brontë, das ich als „currerbell“, Brontës echtes Pseudonym, markiert habe. Sie befinden sich im Ordner faststylometry/data/test .

[forensic stylometry](downloads/Forensic-Stylometry-for-Oxford.pdf) test texts

Hier ist der Code, um die unbekannten Dokumente in ein neues Korpus zu laden und es zu tokenisieren, damit es für die Analyse bereit ist:

„ Load Sense and Sensibility, geschrieben von Jane Austen (markiert als „janedoe“)

und Villette, geschrieben von Charlotte Brontë (gekennzeichnet als „currerbell“, Brontës echtes Pseudonym)

test_corpus = load_corpus_from_folder(“faststylometry/data/test”, pattern=None) Sie können „pattern“ auf einen Zeichenfolgenwert festlegen, um nur eine Teilmenge des Korpus zu laden.

test_corpus.tokenise(tokenise_remove_pronouns_en) „

Fast Data Science - London

Need a business solution?

NLP , ML und Data Science Leader seit 2016 – kontaktieren Sie uns für eine NLP- Beratungssitzung.

​Berechnen Sie das Burrows-Delta für beide unbekannten Texte

Jetzt haben wir ein Trainingskorpus, das aus bekannten Autoren besteht, und ein Testkorpus, das zwei „unbekannte“ Autoren enthält. Die Bibliothek stellt uns die Burrows-Delta-Statistik als Matrix (Pandas-Datenrahmen) für beide unbekannten Texte (x-Achse) im Vergleich zu allen bekannten Autoren (y-Achse) zur Verfügung:

„ berechne_burrows_delta(train_corpus, test_corpus, vocab_size = 50) „

Wir können sehen, dass die niedrigsten Werte in jeder Spalte, also die wahrscheinlichsten Kandidaten, Brontë und Austen sind – die tatsächlich die wahren Autoren von Villette und Sense and Sensibility sind.

Autorcurrerbell – villettejanedoe – sense_and_sensibility
austen0,9979360,444582
bronte0,5213580,93316
carroll1.1164661.433247
conan_doyle0,8670251,094766
dickens0,8002231.050542
schnell1.4808681,565499

Es ist möglich, einen Blick darauf zu werfen, welche Token für die stilometrische Analyse verwendet werden:

forensic stylometry top tokens

​Kalibrieren Sie das Modell und berechnen Sie die Wahrscheinlichkeit, dass jeder Kandidat im Trainingssatz der Autor ist

Nun kann die obige Burrows-Delta-Statistik etwas schwierig zu interpretieren sein, und manchmal wäre das, was wir gerne hätten, ein Wahrscheinlichkeitswert. Wie wahrscheinlich ist es, dass Jane Austen die Autorin von „Sense and Sensibility“ ist?

Wir können dies tun, indem wir das Modell kalibrieren. Das Modell untersucht die Burrows-Deltawerte zwischen bekannten Autoren und ermittelt, welche Werte am häufigsten auf die gleiche Urheberschaft hinweisen:

„ kalibrieren(train_corpus) „

Nachdem wir die Kalibriermethode aufgerufen haben, können wir nun das Modell bitten, uns die Wahrscheinlichkeiten zu liefern, die den Delta-Werten in der obigen Tabelle entsprechen:

„ predict_proba(train_corpus, test_corpus) „

Sie sehen, dass wir jetzt eine Wahrscheinlichkeit von 76 % haben, dass Villette von Charlotte Brontë geschrieben wurde.

Autorcurrerbell – villettejanedoe – sense_and_sensibility
austen0,3242330,808401
bronte0,7573150,382278
carroll0,2314630,079831
conan_doyle0,4452070,246974
dickens0,5105980,280685
schnell0,0671230,049068

Nebenbei bemerkt: Standardmäßig verwendet die Bibliothek die logistische Regression von Scikit Learn, um die Kalibrierungskurve des Modells zu berechnen. Alternativ könnten wir ihm mitteilen, welches Modell verwendet werden soll, indem wir der Kalibriermethode ein Argument übergeben:

forensic stylometry calibrate

​Zeichnen Sie die Kalibrierungskurve

Wir können die Kalibrierungskurve für einen Bereich von Delta-Werten zeichnen:

„ numpy als np importieren matplotlib.pyplot als plt importieren x_values = np.arange(0, 3, 0,1)

plt.plot(x_values, train_corpus.probability_model.predict_proba(np.reshape(x_values, (-1, 1)))[:,1]) plt.xlabel(“Burrows Delta”) plt.ylabel(“Wahrscheinlichkeit desselben Autors”) plt.title(“Kalibrierungskurve des Burrows-Delta-Wahrscheinlichkeitsmodells\nVerwendung der logistischen Regression mit Korrektur für Klassenungleichgewichte”) „

forensic stylometry burrows delta probability calibration curve

Wir können sehen, dass ein Wert von 0 für Delta einer nahezu sicheren Sicherheit entspricht, dass zwei Bücher vom selben Autor stammen, während ein Wert von 2 einer nahezu sicheren Sicherheit entspricht, dass sie von verschiedenen Autoren stammen.

​Zeichnen Sie die ROC-Kurve

Die ROC- Kurve und die AUC-Metrik sind nützliche Methoden zur Messung der Leistung eines Klassifikators.

Wenn die Burrows-Delta-Methode als Zwei-Klassen-Textklassifikator (verschiedener Autor vs. gleicher Autor) verwendet wird, ist die Aufgabe unglaublich einfach, da sie aus ganzen Büchern gelernt hat. Daher würden wir erwarten, dass der Klassifikator eine sehr gute Leistung erbringt.

Wir können die ROC- Bewertung mithilfe einer Kreuzvalidierung durchführen. Der obige Kalibrierungscode hat nacheinander jedes Buch aus dem Trainingskorpus entnommen, auf dem Rest ein Burrows-Modell trainiert und es mit dem zurückgehaltenen Buch getestet. Wir nehmen die daraus resultierenden Wahrscheinlichkeitswerte und berechnen die ROC-Kurve.

Ein AUC-Wert von 0,5 bedeutet, dass ein Klassifikator eine schlechte Leistung erbringt, und 1,0 ist ein perfekter Wert. Mal sehen, wie gut unser Modell funktioniert.

Lassen Sie uns zunächst die Grundwahrheiten ( falsch = anderer Autor, wahr = gleicher Autor) und die Burrows-Deltawerte für alle Vergleiche ermitteln, die innerhalb des Trainingskorpus durchgeführt werden können:

„ Ground_truths, Deltas = get_measurement_curve(train_corpus) „

forensic stylometry ground truths deltas

Wir erhalten die Wahrscheinlichkeiten jedes Vergleichs, den das Modell durchgeführt hat, indem wir die Delta-Werte der Burrows durch das trainierte Scikit-Learn- Modell zurücksetzen:

„ Wahrscheinlichkeiten = train_corpus.probability_model.predict_proba(np.reshape(deltas, (-1, 1)))[:,1] „

forensic stylometry probabilities

Wir können die Wahrscheinlichkeiten und Grundwahrheiten in Scikit-Learn eingeben, um die ROC-Kurve zu berechnen:

„ aus sklearn.metrics import roc_curve, auc fpr, tpr, Schwellenwerte = roc_curve(ground_truths, wahrscheinlichkeiten) „

Wir können jetzt den AUC-Score berechnen. Wenn unser Modell die Urheberschaft gut identifizieren kann, sollten wir eine Zahl nahe 1,0 sehen.

„ roc_auc = auc(fpr, tpr) „

Schließlich können wir die ROC-Kurve zeichnen:

„ plt.figure() plt.plot(fpr, tpr, color=‘darkorange’,

     lw=lw, label='ROC curve (area = %0.4f)' % roc_auc)

plt.plot([0, 1], [0, 1], color=‘navy’, lw=2, linestyle='–') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel(‘Falsch-Positiv-Rate’) plt.ylabel(‘True Positive Rate’) plt.title(‘Empfänger-Betriebskurve des Burrows-Delta-Klassifikators\nfür ganze Bücher’) plt.legend(loc=“unten rechts”) plt.show() „

burrows delta roc curve auc

Segmentieren Sie den Korpus und zeigen Sie die verschiedenen Bücher mithilfe der Hauptkomponentenanalyse in einem Streudiagramm an

Wir können auch die stilistischen Ähnlichkeiten zwischen den Büchern im Schulungskorpus visualisieren, indem wir ihre Unterschiede berechnen und sie mithilfe der Hauptkomponentenanalyse (PCA) im 2D-Raum anzeigen.

Dazu müssen wir die Python-Bibliothek für maschinelles Lernen Scikit-Learn verwenden.

„ aus sklearn.decomposition PCA importieren Import bzgl Pandas als PD importieren „

Wir können den Trainingskorpus neu laden und Segmente von 80.000 Wörtern nehmen, sodass wir verschiedene Abschnitte jedes Buches in unsere Analyse einbeziehen können.

„ Laden Sie den Trainingskorpus als „Testkorpus“ neu, tokenisieren Sie ihn erneut und segmentieren Sie ihn dieses Mal

test_corpus = load_corpus_from_folder(“faststylometry/data/train”) test_corpus.tokenise(tokenise_remove_pronouns_en) split_test_corpus = test_corpus.split(80000) „

Jetzt berechnen wir die Burrows-Delta-Statistik für die Buchsegmente:

„ df_delta = berechne_burrows_delta(train_corpus, split_test_corpus) „

Uns interessiert die Reihe der Z-Scores

„ df_z_scores = split_test_corpus.df_author_z_scores „

Forensische Stilometrie Burrows Delta Z-Scores min

Das obige Array ist zu groß, um es direkt anzuzeigen. Daher müssen wir es auf einen zweidimensionalen Raum reduzieren, um es in einem Diagramm anzuzeigen. Wir können dies mithilfe des Hauptkomponentenanalysemodells von Scikit-Learn tun und es auf zwei Dimensionen einstellen:

„ pca_model = PCA(n_components=2) pca_matrix = pca_model.fit_transform(df_z_scores) „

Es wäre schön, die Buchabschnitte in einem Diagramm darzustellen und für jedes Buch desselben Autors dieselbe Farbe zu verwenden. Da die Z-Score-Matrix nach Autor und Buchname indiziert ist, können wir einen regulären Ausdruck verwenden, um alles vor dem ersten Bindestrich zu übernehmen. Dies ergibt den einfachen Namen des Autors ohne Buchtitel:

„ Authors = df_z_scores.index.map( lambda x : re.sub(" - .+", “”, x)) „

forensic stylometry authors

Wir können die PCA-abgeleiteten Koordinaten und die Autorennamen in einem Datenrahmen zusammenfügen:

„ df_pca_by_author = pd.DataFrame(pca_matrix) df_pca_by_author[“author”] = Autoren „

Jetzt können wir die einzelnen Bücher in einem einzigen Diagramm darstellen:

„ plt.figure(figsize=(15,15)) für Autor, pca_coordinates in df_pca_by_author.groupby(“author”):

plt.scatter(*zip(*pca_coordinates.drop("author", axis=1).to_numpy()), label=author)

für i in range(len(pca_matrix)):

plt.text(pca_matrix[i][0], pca_matrix[i][1],"  " + df_z_scores.index[i], alpha=0.5)

plt.legend() plt.title(“Darstellung von Werken im Trainingskorpus mittels PCA”) „

forensic stylometry authors

Wir gehen weiter

Der Code für ROC/AUC bedeutet, dass wir verschiedene Parameter ausprobieren und die Vokabulargröße, Dokumentlänge oder Vorverarbeitungsschritte ändern können, um zu sehen, wie sich dies auf die Leistung der Burrows-Delta-Methode auswirkt.

Mich würde interessieren, wie sich das Delta bei anderen Sprachen verhält und ob es bei flektierten Sprachen von Vorteil wäre, eine morphologische Analyse als Vorverarbeitungsschritt durchzuführen. Sollte beispielsweise das türkische Wort „teyzemle“ (mit meiner Tante) als teyze+m+le behandelt werden, wobei die beiden Suffixe getrennt eingegeben werden müssen?

Sie können ein solches Experiment ausprobieren, indem Sie die Funktion tokenise_remove_pronouns_en durch eine Tokenisierungsfunktion Ihrer Wahl ersetzen. Die einzige Einschränkung besteht darin, dass eine Zeichenfolge in eine Liste von Zeichenfolgen konvertiert werden muss.

Verweise

Ihre NLP-Karriere wartet!

Bereit für den nächsten Schritt in Ihrer NLP-Reise? Vernetzen Sie sich mit Top-Arbeitgebern, die Talente in der natürlichen Sprachverarbeitung suchen. Entdecken Sie Ihren Traumjob!

Finden Sie Ihren Traumjob

Big-Data-Beratung – 4 häufigste Probleme gelöst
Data scienceBig data

Big-Data-Beratung – 4 häufigste Probleme gelöst

Mittlerweile sind es Organisationen aller Größenordnungen und fast aller Sektoren werden zunehmend datengesteuert, insbesondere als größere Datenspeicher Systeme und schnellere Computer treiben die Leistungsgrenzen immer weiter voran.

Zwei Revolutionen im Abstand von 200 Jahren: die Datenrevolution und die industrielle Revolution
Ai and societyData science

Zwei Revolutionen im Abstand von 200 Jahren: die Datenrevolution und die industrielle Revolution

Aufgrund des umfangreichen Einsatzes von Technologie und der Arbeitsteilung hat die Arbeit des durchschnittlichen Gig-Economy-Arbeiters jeden individuellen Charakter und damit auch jeden Charme für den Arbeitnehmer verloren.

KI im Personalwesen: Die Zukunft der Arbeit verändern
Ai and societyData science

KI im Personalwesen: Die Zukunft der Arbeit verändern

Die Auswirkungen von KI auf die Humanressourcen Die Arbeitswelt verändert sich rasant, sowohl aufgrund der Einführung traditioneller Data-Science-Praktiken in immer mehr Unternehmen als auch aufgrund der zunehmenden Beliebtheit generativer KI-Tools wie ChatGPT und Googles BARD bei nicht-technischen Arbeitnehmern.

What we can do for you

Transform Unstructured Data into Actionable Insights

Contact us