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 einstellenIch 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.
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.
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 .
Komplettlösung für Burrows Delta im Jupyter Notebook
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”) „
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:
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]) „
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 .
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:
test_corpus.tokenise(tokenise_remove_pronouns_en) „
Fast Data Science - London
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.
Autor | currerbell – villette | janedoe – sense_and_sensibility |
---|---|---|
austen | 0,997936 | 0,444582 |
bronte | 0,521358 | 0,93316 |
carroll | 1.116466 | 1.433247 |
conan_doyle | 0,867025 | 1,094766 |
dickens | 0,800223 | 1.050542 |
schnell | 1.480868 | 1,565499 |
Es ist möglich, einen Blick darauf zu werfen, welche Token für die stilometrische Analyse verwendet werden:
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.
Autor | currerbell – villette | janedoe – sense_and_sensibility |
---|---|---|
austen | 0,324233 | 0,808401 |
bronte | 0,757315 | 0,382278 |
carroll | 0,231463 | 0,079831 |
conan_doyle | 0,445207 | 0,246974 |
dickens | 0,510598 | 0,280685 |
schnell | 0,067123 | 0,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:
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”) „
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.
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) „
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] „
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() „
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.
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 „
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)) „
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”) „
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.
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 TraumjobMittlerweile 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.
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.
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