Eine warnende Lektion.
Machen wir einen Tonalitätsklassifikator!Die Stimmungsanalyse (Stimmungsanalyse) ist eine sehr häufige Aufgabe in der Verarbeitung natürlicher Sprache (NLP), und dies ist nicht überraschend. Für ein Unternehmen ist es wichtig zu verstehen, was die Leute sagen: positiv oder negativ. Eine solche Analyse wird verwendet, um soziale Netzwerke, Kundenfeedback und sogar den algorithmischen Aktienhandel zu überwachen (daher
kaufen Bots
Berkshire Hathaway-Aktien, nachdem sie im letzten Film positive Bewertungen über die Rolle von Anne Hathaway veröffentlicht haben ).
Die Analysemethode ist manchmal zu einfach, aber eine der einfachsten Möglichkeiten, messbare Ergebnisse zu erzielen. Senden Sie einfach den Text - und die Ausgabe ist positiv und negativ. Sie müssen sich nicht mit dem Analysebaum befassen, ein Diagramm oder eine andere komplexe Darstellung erstellen.
Das werden wir tun. Wir werden den Weg des geringsten Widerstands beschreiten und den einfachsten Klassifikator erstellen, der wahrscheinlich jedem bekannt vorkommt, der an relevanten Entwicklungen auf dem Gebiet der NLP beteiligt ist. Ein solches Modell findet sich beispielsweise im Artikel
Deep Averaging Networks (Iyyer et al., 2015). Wir versuchen überhaupt nicht, ihre Ergebnisse in Frage zu stellen oder das Modell zu kritisieren. Wir geben einfach eine bekannte Methode zur Vektordarstellung von Wörtern.
Arbeitsplan:
- Führen Sie eine typische Vektordarstellung von Wörtern ein , um mit Bedeutungen (Bedeutungen) zu arbeiten.
- Führen Sie Trainings- und Testdatensätze mit Standardlisten positiver und negativer Wörter ein.
- Trainieren Sie den Gradientenabstiegsklassifikator, um andere positive und negative Wörter anhand ihrer Vektordarstellung zu erkennen.
- Verwenden Sie diesen Klassifikator, um die Tonalitätsbewertungen für Textsätze zu berechnen.
- Um das Monster zu sehen, das wir erschaffen haben.
Und dann werden wir sehen, "wie man ohne besondere Anstrengungen einen KI-Rassisten schafft". Natürlich können Sie das System nicht in solch einer monströsen Form verlassen, also werden wir:
- Um das Problem statistisch zu bewerten , damit es möglich wird, den Fortschritt zu messen, sobald er gelöst ist.
- Verbessern Sie Daten , um ein genaueres und weniger rassistisches semantisches Modell zu erhalten.
Software-Abhängigkeiten
Dieses Tutorial ist in Python
numpy
und
scipy
auf einem typischen Python-Stapel für maschinelles Lernen:
numpy
und
scipy
für numerisches Rechnen,
pandas
für Datenverwaltung und
scikit-learn
für maschinelles Lernen. Am Ende werden wir auch
matplotlib
und
seaborn
für die
seaborn
.
Im Prinzip kann
scikit-learn
durch TensorFlow oder Keras oder ähnliches ersetzt werden: Sie können den Klassifikator auch auf Gradientenabstieg trainieren. Ihre Abstraktionen brauchen wir aber nicht, denn hier findet das Training in einer Phase statt.
import numpy as np import pandas as pd import matplotlib import seaborn import re import statsmodels.formula.api from sklearn.linear_model import SGDClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score
Schritt 1. Vektordarstellung von Wörtern
Vektordarstellungen werden häufig bei Texteingabe verwendet. Wörter werden im mehrdimensionalen Raum zu Vektoren, wobei benachbarte Vektoren ähnliche Bedeutungen darstellen. Mithilfe von Vektordarstellungen können Sie Wörter anhand (ungefähr) ihrer Bedeutung vergleichen und nicht nur anhand genauer Übereinstimmungen.
Erfolgreiches Lernen erfordert Hunderte von Gigabyte Text. Glücklicherweise haben verschiedene Forschungsteams diese Arbeit bereits durchgeführt und vorgefertigte Modelle von Vektordarstellungen zum Download bereitgestellt.
Die beiden bekanntesten englischen Datensätze sind
word2vec (auf Google News trainiert) und
GloVe (auf Common Crawl-Webseiten). Jeder von ihnen wird ein ähnliches Ergebnis liefern, aber wir werden das GloVe-Modell verwenden, da es eine transparentere Datenquelle hat.
GloVe ist in drei Größen erhältlich: 6 Milliarden, 42 Milliarden und 840 Milliarden. Das neueste Modell ist das leistungsstärkste, erfordert jedoch erhebliche Verarbeitungsressourcen. Die 42-Milliarden-Version ist ziemlich gut und das Wörterbuch ist ordentlich auf 1 Million Wörter zugeschnitten. Wir sind auf dem Weg des geringsten Widerstands, also nehmen Sie die 42-Milliarden-Version.
- Warum ist es so wichtig, ein „bekanntes“ Modell zu verwenden?
"Ich bin froh, dass du danach gefragt hast, hypothetischer Gesprächspartner!" Bei jedem Schritt versuchen wir, etwas extrem Typisches zu tun, und das beste Modell für die Vektordarstellung von Wörtern wurde aus irgendeinem Grund noch nicht bestimmt. Ich hoffe, dass dieser Artikel den Wunsch weckt, moderne, hochwertige Modelle zu verwenden , insbesondere solche, die einen algorithmischen Fehler berücksichtigen und versuchen, ihn zu korrigieren. Dazu später mehr.
Laden Sie glove.42B.300d.zip von
der GloVe-Website herunter und extrahieren Sie die Datei
data/glove.42B.300d.txt
. Als nächstes definieren wir eine Funktion zum Lesen von Vektoren in einem einfachen Format.
def load_embeddings(filename): """ DataFrame , word2vec, GloVe, fastText ConceptNet Numberbatch. . """ labels = [] rows = [] with open(filename, encoding='utf-8') as infile: for i, line in enumerate(infile): items = line.rstrip().split(' ') if len(items) == 2:
(1917494, 300)
Schritt 2. Goldstandard-Tonalitätswörterbuch
Jetzt brauchen wir Informationen darüber, welche Wörter als positiv und welche als negativ angesehen werden. Es gibt viele solcher Wörterbücher, aber wir werden ein sehr einfaches Wörterbuch (Hu und Liu, 2004) verwenden, das in dem Artikel von
Deep Averaging Networks verwendet wird .
Laden Sie das Wörterbuch von
der Website von
Bing Liu herunter und extrahieren Sie die Daten in
data/positive-words.txt
und
data/negative-words.txt
.
Als Nächstes legen wir fest, wie diese Dateien gelesen und als
neg_words
pos_words
und
neg_words
:
def load_lexicon(filename): """ (https://www.cs.uic.edu/~liub/FBS/sentiment-analysis.html) Latin-1. , - . , ';' , . """ lexicon = [] with open(filename, encoding='latin-1') as infile: for line in infile: line = line.rstrip() if line and not line.startswith(';'): lexicon.append(line) return lexicon pos_words = load_lexicon('data/positive-words.txt') neg_words = load_lexicon('data/negative-words.txt')
Schritt 3. Wir trainieren das Modell, um die Tonalität vorherzusagen
Basierend auf den Vektoren positiver und negativer Wörter verwenden wir den Befehl Pandas
.loc[]
, um nach Vektordarstellungen aller Wörter zu suchen.
Einige Wörter fehlen im GloVe-Wörterbuch. Meistens sind dies Tippfehler wie „Fancinating“. Hier sehen wir eine Reihe von
NaN
, die das Fehlen eines Vektors anzeigen, und löschen sie mit dem Befehl
.dropna()
.
pos_vectors = embeddings.loc[pos_words].dropna()
neg_vectors = embeddings.loc[neg_words].dropna()
Jetzt erstellen wir Datenfelder am Eingang (Vektordarstellungen) und am Ausgang (1 für positive Wörter und -1 für negative). Wir überprüfen auch, ob die Vektoren an Wörter angehängt sind, damit wir die Ergebnisse interpretieren können.
vectors = pd.concat([pos_vectors, neg_vectors])
targets = np.array([1 for entry in pos_vectors.index] + [-1 for entry in neg_vectors.index])
labels = list(pos_vectors.index) + list(neg_vectors.index)
- Warte einen Moment. Einige Wörter sind weder positiv noch negativ, sie sind neutral. Sollte nicht eine dritte Klasse für neutrale Wörter geschaffen werden?
"Ich denke, er hätte sich als nützlich erwiesen." Später werden wir sehen, welche Probleme durch die Zuordnung der Tonalität zu neutralen Wörtern entstehen. Wenn wir neutrale Wörter zuverlässig identifizieren können, ist es durchaus möglich, die Komplexität des Klassifikators auf drei Kategorien zu erhöhen. Aber Sie müssen ein Wörterbuch mit neutralen Wörtern finden, denn im Wörterbuch von Liu gibt es nur positive und negative.
Also habe ich meine Version mit 800 Beispielen von Wörtern ausprobiert und das Gewicht erhöht, um neutrale Wörter vorherzusagen. Aber die Endergebnisse unterschieden sich nicht sehr von dem, was Sie jetzt sehen werden.
- Wie unterscheidet diese Liste positive und negative Wörter? Kommt das nicht auf den Kontext an?
- Gute Frage. Die Analyse allgemeiner Schlüssel ist nicht so einfach, wie es scheint. Die Grenze ist an einigen Stellen ziemlich willkürlich. In dieser Liste wird das Wort "frech" als "schlecht" und "ehrgeizig" als "gut" markiert. "Comic" ist schlecht und "lustig" ist gut. Eine „Rückerstattung“ ist gut, obwohl sie normalerweise in einem schlechten Kontext erwähnt wird, wenn Sie jemandem Geld schulden oder jemandem etwas schulden.
Jeder versteht, dass die Tonalität durch den Kontext bestimmt wird, aber in einem einfachen Modell muss man den Kontext ignorieren und hoffen, dass die durchschnittliche Tonalität richtig erraten wird.
Mit der Funktion
train_test_split
teilen
train_test_split
gleichzeitig die Eingabevektoren, Ausgabewerte und Beschriftungen in Trainings- und Testdaten auf, während 10% zum Testen übrig
train_test_split
.
train_vectors, test_vectors, train_targets, test_targets, train_labels, test_labels = \ train_test_split(vectors, targets, labels, test_size=0.1, random_state=0)
Erstellen Sie nun einen Klassifikator und übergeben Sie Vektoren durch Iterationen. Wir verwenden die logistische Verlustfunktion, damit der endgültige Klassifikator die Wahrscheinlichkeit ableiten kann, dass das Wort positiv oder negativ ist.
model = SGDClassifier(loss='log', random_state=0, n_iter=100) model.fit(train_vectors, train_targets) SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1, eta0=0.0, fit_intercept=True, l1_ratio=0.15, learning_rate='optimal', loss='log', n_iter=100, n_jobs=1, penalty='l2', power_t=0.5, random_state=0, shuffle=True, verbose=0, warm_start=False)
Wir bewerten den Klassifikator anhand von Testvektoren. Es zeigt eine Genauigkeit von 95%. Nicht schlecht.
accuracy_score(model.predict(test_vectors), test_targets)
0.95022624434389136
Wir definieren die Tonalitätsvorhersagefunktion für bestimmte Wörter und verwenden sie dann für einige Beispiele aus Testdaten.
def vecs_to_sentiment(vecs):
| Tonalität |
---|
zappeln | -9,931679 |
---|
unterbrechen | -9,634706 |
---|
standhaft | 1,466919 |
---|
imaginär | -2,989215 |
---|
Besteuerung | 0,468522 |
---|
weltberühmt | 6.908561 |
---|
preiswert | 9.237223 |
---|
Enttäuschung | -8,737182 |
---|
totalitär | -10,851580 |
---|
kriegerisch | -8,328674 |
---|
friert ein | -8,456981 |
---|
Sünde | -7,839670 |
---|
zerbrechlich | -4.018289 |
---|
getäuscht | -4.309344 |
---|
ungelöst | -2,816172 |
---|
klug | 2.339609 |
---|
dämonisiert | -2.102152 |
---|
sorglos | 8,747150 |
---|
unbeliebt | -7,887475 |
---|
sympathisieren | 1,790899 |
---|
Es ist zu sehen, dass der Klassifikator funktioniert. Er lernte, die Tonalität in Worten außerhalb der Trainingsdaten zu verallgemeinern.
Schritt 4. Holen Sie sich eine Tonalitätsbewertung für den Text.
Es gibt viele Möglichkeiten, einer Gesamtschätzung Vektoren hinzuzufügen. Wieder folgen wir dem Weg des geringsten Widerstands, also nehmen Sie einfach den Durchschnittswert.
import re TOKEN_RE = re.compile(r"\w.*?\b")
Es gibt viel zu optimieren:
- Einführung einer umgekehrten Beziehung zwischen dem Wortgewicht und seiner Häufigkeit, so dass dieselben Präpositionen die Tonalität nicht stark beeinflussen.
- Einstellung, damit kurze Sätze nicht mit extremen Tonalitätswerten enden.
- Buchhaltungsphrasen.
- Ein zuverlässigerer Wortsegmentierungsalgorithmus, den Apostrophe nicht niederschlagen.
- Berücksichtigung von Negativen wie "nicht zufrieden".
Aber alles erfordert zusätzlichen Code und wird die Ergebnisse nicht grundlegend ändern. Zumindest können Sie jetzt verschiedene Angebote grob vergleichen:
text_to_sentiment("this example is pretty cool") 3.889968926086298
text_to_sentiment("this example is okay") 2.7997773492425186
text_to_sentiment("meh, this example sucks") -1.1774475917460698
Schritt 5. Siehe das Monster, das wir erschaffen haben
Nicht jeder Satz hat eine ausgeprägte Tonalität. Mal sehen, was mit neutralen Sätzen passiert:
text_to_sentiment("Let's go get Italian food") 2.0429166109408983
text_to_sentiment("Let's go get Chinese food") 1.4094033658140972
text_to_sentiment("Let's go get Mexican food") 0.38801985560121732
Ich bin bereits auf ein solches Phänomen gestoßen, als ich Bewertungen von Restaurants unter Berücksichtigung von Vektordarstellungen von Wörtern analysierte. Ohne ersichtlichen Grund
haben alle mexikanischen Restaurants eine niedrigere Gesamtpunktzahl .
Vektordarstellungen erfassen subtile semantische Unterschiede im Kontext. Sie spiegeln daher die Vorurteile unserer Gesellschaft wider.
Hier sind einige andere neutrale Vorschläge:
text_to_sentiment("My name is Emily") 2.2286179364745311
text_to_sentiment("My name is Heather") 1.3976291151079159
text_to_sentiment("My name is Yvette") 0.98463802132985556
text_to_sentiment("My name is Shaniqua") -0.47048131775890656
Verdammt noch mal ...
Das mit den Namen von Menschen verbundene System hat völlig unterschiedliche Gefühle. Sie können sich diese und viele andere Beispiele ansehen und feststellen, dass die Tonalität bei stereotypen weißen Namen normalerweise höher und bei stereotypen schwarzen Namen niedriger ist.
Dieser Test wurde von Caliscan, Bryson und Narayanan in ihrem Forschungsbericht verwendet, der im April 2017 in der Zeitschrift
Science veröffentlicht wurde. Es zeigt, dass die
Semantik des Sprachkorpus die Vorurteile der Gesellschaft enthält . Wir werden diese Methode verwenden.
Schritt 6. Bewertung des Problems
Wir wollen verstehen, wie solche Fehler vermieden werden können. Lassen Sie uns mehr Daten durch den Klassifikator leiten und dessen „Bias“ statistisch messen.
Hier haben wir vier Namenslisten, die unterschiedliche ethnische Hintergründe widerspiegeln, hauptsächlich in den USA. Die ersten beiden sind Listen mit überwiegend „weißen“ und „schwarzen“ Namen, die auf der Grundlage eines Artikels von Kaliskan et al. Angepasst wurden. Ich habe auch spanische und muslimische Namen aus Arabisch und Urdu hinzugefügt.
Diese Daten werden verwendet, um die Verzerrung des Algorithmus während des ConceptNet-Erstellungsprozesses zu überprüfen: Sie finden sie im Modul
conceptnet5.vectors.evaluation.bias
. Es besteht die Idee, das Wörterbuch auf andere ethnische Gruppen auszudehnen, wobei nicht nur Namen, sondern auch Nachnamen berücksichtigt werden.
Hier sind die Auflistungen:
NAMES_BY_ETHNICITY = {
Mit Pandas erstellen wir eine Tabelle mit Namen, deren vorherrschender ethnischer Herkunft und Tonalitätsbewertungen:
def name_sentiment_table(): frames = [] for group, name_list in sorted(NAMES_BY_ETHNICITY.items()): lower_names = [name.lower() for name in name_list] sentiments = words_to_sentiment(lower_names) sentiments['group'] = group frames.append(sentiments) # return pd.concat(frames) name_sentiments = name_sentiment_table()
Beispieldaten:
name_sentiments.ix[::25]
| Tonalität | die Gruppe |
---|
Mohammed | 0,834974 | Araber / Muslim |
---|
alya | 3,916803 | Araber / Muslim |
---|
Terryl | -2,858010 | Schwarz |
---|
josé | 0,432956 | Hispanic |
---|
Luciana | 1,086073 | Hispanic |
---|
hank | 0,391858 | Weiß |
---|
Megan | 2.158679 | Weiß |
---|
Wir werden für jeden Namen ein Diagramm der Verteilung der Tonalität erstellen.
plot = seaborn.swarmplot(x='group', y='sentiment', data=name_sentiments) plot.set_ylim([-10, 10])
(-10, 10)

Oder als Histogramm mit Konfidenzintervallen für durchschnittlich 95%.
plot = seaborn.barplot(x='group', y='sentiment', data=name_sentiments, capsize=.1)

Führen Sie
abschließend das Statistikpaket für
seriöse Statistikmodelle aus. Es wird gezeigt, wie groß die Verzerrung des Algorithmus ist (zusammen mit einer Reihe anderer Statistiken).
OLS-RegressionsergebnisseDep. Variable: | Stimmung | R-Quadrat: | 0,208 |
---|
Modell: | OLS | Adj. R-Quadrat: | 0,192 |
---|
Methode: | Kleinste Quadrate | F-Statistik: | 04/13 |
---|
Datum: | Do, 13. Juli 2017 | Prob (F-Statistik): | 1.31e-07 |
---|
Zeit: | 11:31:17 | Log-Wahrscheinlichkeit: | -356,78 |
---|
Nein, nein. Beobachtungen: | 153 | AIC: | 721.6 |
---|
Df Rückstände: | 149 | BIC: | 733.7 |
---|
Df Modell: | 3 | | |
---|
Kovarianztyp: | nicht robust | | |
---|
Die F-Statistik ist das Verhältnis der Variation zwischen Gruppen zur Variation innerhalb von Gruppen, das als allgemeine Bewertung der Verzerrung angesehen werden kann.
Unmittelbar darunter liegt die Wahrscheinlichkeit, dass wir die maximale F-Statistik mit der Nullhypothese sehen, dh wenn kein Unterschied zwischen den verglichenen Optionen besteht. Die Wahrscheinlichkeit ist sehr, sehr gering. In einem wissenschaftlichen Artikel würden wir das Ergebnis als "sehr statistisch signifikant" bezeichnen.
Wir müssen den F-Wert verbessern. Je niedriger desto besser.
ols_model.fvalue
13.041597745167659
Schritt 7. Andere Daten versuchen.
Wir haben jetzt die Möglichkeit, die schädliche Verzerrung des Modells numerisch zu messen. Versuchen wir es anzupassen. Dazu müssen Sie eine Reihe von Dingen wiederholen, die früher nur separate Schritte in einem Python-Notizblock waren.
Wenn ich guten, unterstützten Code schreiben würde, würde ich keine globalen Variablen wie
model
und
embeddings
. Mit dem aktuellen Spaghetti-Code können Sie jedoch jeden Schritt besser untersuchen und verstehen, was passiert. Wir verwenden einen Teil des Codes wieder und definieren zumindest eine Funktion, um einige Schritte zu wiederholen:
def retrain_model(new_embs): """ . """ global model, embeddings, name_sentiments embeddings = new_embs pos_vectors = embeddings.loc[pos_words].dropna() neg_vectors = embeddings.loc[neg_words].dropna() vectors = pd.concat([pos_vectors, neg_vectors]) targets = np.array([1 for entry in pos_vectors.index] + [-1 for entry in neg_vectors.index]) labels = list(pos_vectors.index) + list(neg_vectors.index) train_vectors, test_vectors, train_targets, test_targets, train_labels, test_labels = \ train_test_split(vectors, targets, labels, test_size=0.1, random_state=0) model = SGDClassifier(loss='log', random_state=0, n_iter=100) model.fit(train_vectors, train_targets) accuracy = accuracy_score(model.predict(test_vectors), test_targets) print("Accuracy of sentiment: {:.2%}".format(accuracy)) name_sentiments = name_sentiment_table() ols_model = statsmodels.formula.api.ols('sentiment ~ group', data=name_sentiments).fit() print("F-value of bias: {:.3f}".format(ols_model.fvalue)) print("Probability given null hypothesis: {:.3}".format(ols_model.f_pvalue))
Wir versuchen word2vec
Es ist davon auszugehen, dass nur GloVe das Problem hat. Es gibt wahrscheinlich viele zweifelhafte Websites in der Common Crawl-Datenbank und mindestens 20 Exemplare des Urban Dictionary of Street Slang. Vielleicht ist es auf einer anderen Basis besser: Was ist mit dem guten alten word2vec, das in Google News trainiert wurde?
Es scheint, dass die maßgeblichste Quelle für word2vec-Daten
diese Datei auf Google Drive ist . Laden Sie es herunter und speichern Sie es als
data/word2vec-googlenews-300.bin.gz
.
Accuracy of sentiment: 94.30%
F-value of bias: 15.573
Probability given null hypothesis: 7.43e-09
Word2vec erwies sich mit einem F-Wert von mehr als 15 als noch schlechter.
Im Prinzip war es dumm zu erwarten, dass
Nachrichten besser vor Voreingenommenheit geschützt werden.
ConceptNet Numberbatch versuchen
Schließlich kann ich über mein eigenes Projekt zur Vektordarstellung von Wörtern sprechen.
ConceptNet mit der Vektorpräsentationsfunktion ist das Wissensdiagramm, an dem ich arbeite. Es normalisiert Vektordarstellungen in der Trainingsphase und identifiziert und entfernt einige Quellen für algorithmischen Rassismus und Sexismus. Diese Methode zur Korrektur von Verzerrungen basiert auf einem wissenschaftlichen Artikel von Bulukbashi et al.,
"Debiasing Word Embeddings", und wird verallgemeinert, um mehrere Arten von Verzerrungen gleichzeitig zu beseitigen. Soweit ich weiß, ist dies das einzige semantische System, in dem es so etwas gibt.
Von Zeit zu Zeit exportieren wir vorberechnete Vektoren aus ConceptNet - diese Releases heißen
ConceptNet Numberbatch . Im April 2017 wurde die erste Version mit Bias-Korrektur veröffentlicht, daher werden wir die englischsprachigen Vektoren laden und unser Modell neu trainieren.
numberbatch-en-17.04b.txt.gz
, speichern es im
data/
Verzeichnis und trainieren das Modell neu:
retrain_model(load_embeddings('data/numberbatch-en-17.04b.txt'))
Accuracy of sentiment: 97.46%
F-value of bias: 3.805
Probability given null hypothesis: 0.0118

Hat ConceptNet Numberbatch das Problem vollständig behoben? Kein algorithmischer Rassismus mehr?
Nein.Ist Rassismus viel weniger geworden?
Auf jeden Fall .
Schlüsselbereiche für ethnische Gruppen überlappen sich viel stärker als in GloVe- oder word2vec-Vektoren. Im Vergleich zu GloVe nahm der Wert von F mehr als dreimal ab und im Vergleich zu word2vec mehr als viermal. Und im Allgemeinen sehen wir beim Vergleich verschiedener Namen viel kleinere Unterschiede in der Tonalität: Dies sollte so sein, da die Namen das Ergebnis der Analyse wirklich nicht beeinflussen sollten.
Eine leichte Korrelation blieb jedoch bestehen. Vielleicht kann ich solche Daten und Trainingsparameter aufnehmen, dass das Problem gelöst zu sein scheint. Dies wird jedoch eine schlechte Option sein, da
das Problem
tatsächlich bestehen bleibt, da wir in ConceptNet nicht alle Ursachen für algorithmischen Rassismus identifiziert und kompensiert haben. Aber das ist ein guter Anfang.
Keine Fallstricke
Bitte beachten Sie, dass sich mit der Umstellung auf ConceptNet Numberbatch die Genauigkeit der Vorhersage der Tonalität verbessert hat.
Jemand könnte vorgeschlagen haben, dass die Korrektur von algorithmischem Rassismus die Ergebnisse auf andere Weise verschlechtern würde. Aber nein. Möglicherweise haben Sie Daten, die besser und weniger rassistisch sind. Die Daten verbessern sich mit dieser Korrektur wirklich.
Der von Menschen erworbene Wort2vec- und GloVe-Rassismus hat nichts mit der Genauigkeit des Algorithmus zu tun.Andere Ansätze
Dies ist natürlich nur eine Möglichkeit, die Tonalität zu analysieren. Einige Details können unterschiedlich implementiert werden.Stattdessen oder zusätzlich zum Ändern der Vektorbasis können Sie versuchen, dieses Problem direkt in der Ausgabe zu beheben. Beseitigen Sie beispielsweise im Allgemeinen die Bewertung der Tonalität für Namen und Personengruppen.Im Allgemeinen besteht die Möglichkeit, die Berechnung der Tonalität aller Wörter abzulehnen und sie nur für Wörter aus der Liste zu berechnen. Dies ist vielleicht die häufigste Form der Stimmungsanalyse - ohne maschinelles Lernen. Die Ergebnisse sind nicht voreingenommener als der Autor der Liste. Das Ablehnen von maschinellem Lernen bedeutet jedoch, den Rückruf (Rückruf) zu reduzieren. Die einzige Möglichkeit, das Modell an einen Datensatz anzupassen, besteht darin, die Liste manuell zu bearbeiten.Als hybrider Ansatz können Sie eine große Anzahl geschätzter Tonalitätsschätzungen für Wörter erstellen und eine Person anweisen, diese geduldig zu bearbeiten und eine Liste von Ausnahmewörtern mit einer Tonalität von Null zu erstellen. Aber das ist ein zusätzlicher Job. Auf der anderen Seite werden Sie wirklich sehen, wie das Modell funktioniert. Ich denke, dass dies auf jeden Fall gesucht werden sollte.