Politician Translator mit Spacy und Negate
Finden Sie heraus, was Politiker wirklich meinen, indem Sie ihren Text in das Gegenteil verkehren.
Dies ist ein kurzer Beitrag. Die ganze Zeit hören wir die Politiker reden, aber meistens meinen sie das Gegenteil. Wenn ein Politiker zum Beispiel sagt, dass er die Steuern senken wird, dann werden die Steuern steigen. Wenn ein Politiker sagt, er habe keine Beziehung mit dieser Frau, dann ... Und so weiter.
Also dachte ich, warum nicht ein Politician Translator in Python machen? In diesem Beitrag beginne ich mit den Ergebnissen. Der Code steht am Ende.
Der Politician Translator in Aktion
Joe Biden am 9. Januar 2023 (Twitter):
Die ersten beiden Jahre meiner Präsidentschaft waren die beiden stärksten Jahre des Beschäftigungswachstums in der Geschichte.
Diese historischen Zuwächse bei Arbeitsplätzen und Arbeitslosigkeit geben Arbeitnehmern mehr Macht und amerikanischen Familien mehr Spielraum.
Politician Translator:
Die ersten beiden Jahre meiner Präsidentschaft waren nicht die beiden Jahre mit dem stärksten Beschäftigungswachstum aller Zeiten.
Diese historischen Zuwächse bei Arbeitsplätzen und Arbeitslosigkeit geben den Arbeitnehmern nicht mehr Macht und den amerikanischen Familien nicht mehr Spielraum.
Bill Clinton vor 15 Jahren:
Ich hatte keine sexuellen Beziehungen zu dieser Frau, Miss Lewinsky.
Politician Translator:
Ich hatte eine sexuelle Beziehung zu dieser Frau, Miss Lewinsky.
Joe Biden am 6. Januar 2023 (Twitter):
Mein Wirtschaftsplan war immer darauf ausgerichtet, unsere Wirtschaft von unten nach oben und von der Mitte nach außen zu entwickeln.
Heute haben wir erfahren, dass die Arbeitslosigkeit auf einem 50-Jahres-Tief liegt, nachdem wir zwei Jahre lang das stärkste Beschäftigungswachstum aller Zeiten hatten.
Wir schaffen Arbeitsplätze. Wir senken die Kosten. Unser Plan funktioniert.
Politician Translator:
Mein Wirtschaftsplan hat nicht immer darin bestanden, unsere Wirtschaft von unten nach oben und von der Mitte nach außen zu entwickeln.
Heute haben wir nicht gelernt, dass die Arbeitslosigkeit nach den zwei Jahren mit dem stärksten Beschäftigungswachstum aller Zeiten nicht auf einem 50-Jahres-Tief liegt.
Wir schaffen keine Arbeitsplätze. Wir senken nicht die Kosten. Unser Plan funktioniert nicht.
Ist das nicht toll!
Der Politician Translator kann auch für die Schulung von Politikern verwendet werden.
Sie müssen zum Beispiel sagen:
Ich mag Erdnussbutter und esse sie jeden Tag.
Wenn sie eigentlich meinen:
Ich mag keine Erdnussbutter und esse sie auch nicht jeden Tag.
Ein anderes Beispiel. Sie müssen sagen:
Mein erster Geburtstag war toll. Mein 2. war noch besser.
Wenn sie meinen:
Mein erster Geburtstag war nicht toll. Mein 2. war nicht noch besser.
Einige details über den Code
Ich hatte diese Idee und wollte zunächst antonymes verwenden. Zu komplex für ein kurzes Projekt, vielleicht in einer nächsten Version. Dann fand ich das Python -Paket 'Negate'. Sehr schön, aber es kann nicht mit zusammengesetzten Sätzen umgehen.
Also habe ich nach einer Möglichkeit gesucht, die Sätze in Teile zu zerlegen. Dazu verwenden wir den POS-tags eines Satzes. Obwohl dies sehr primitiv ist, funktioniert es in vielen Fällen.
Sobald wir die Teile eines Satzes haben, lassen wir 'Negate' über sie laufen und fügen sie wieder zusammen. Dann noch etwas nachbessern, und fertig.
Politician Translator: Der Code
# your text
text = """The first two years of my presidency were the two strongest years of job growth on record.
These historic jobs and unemployment gains are giving workers more power and American families more breathing room.
"""
text = """I did not have sexual relations with that woman, Miss Lewinsky."""
#text = """I like peanut butter and eat it every day."""
#text = """My first birthday was great. My 2. was even better."""
import re
from negate import Negator
import spacy
from spacy.lang.en import English
class TextToSentences:
def __init__(self):
self.nlp = spacy.load('en_core_web_sm')
self.nlp.add_pipe('sentencizer')
def get_sentences(self, text):
doc = self.nlp(text)
return [sent.text.strip() for sent in doc.sents]
class SentenceToParts:
def __init__(self):
self.nlp = spacy.load('en_core_web_sm')
def get_parts(self, sentence):
doc = self.nlp(sentence)
parts, words = [], []
for token in doc:
if token.pos_ in ['CCONJ', 'SCONJ']:
parts.append(' '.join(words))
words = []
words.append(token.text)
if len(words) > 0:
parts.append(' '.join(words))
return parts
class NegateParts:
def __init__(self):
self.negator = Negator(use_transformers=True)
def get_negated_parts(self, parts):
negated_parts = []
for part in parts:
negated_parts.append(self.negator.negate_sentence(part, prefer_contractions=False))
return negated_parts
class StitchParts:
def __init__(self):
self.nlp = spacy.load('en_core_web_sm')
def get_stitched_parts(self, parts):
stitched_parts_items = []
for i, part in enumerate(parts):
# first word to lowercase if not PROPN
doc = self.nlp(part)
words = []
for j, token in enumerate(doc):
word = token.text
if i > 0 and j == 0 and token.pos not in ['PROPN']:
word = word.lower()
words.append(word)
stitched_parts_items.append(' '.join(words))
return ' '.join(stitched_parts_items)
class FixUpSentence:
def __init__(self):
pass
def get_fixedup_sentence(self, sentence):
# trim
sentence = sentence.strip()
# fix: end of line ' .'
sentence = re.sub(r'\s\.$', '.', sentence)
# fix: ' ’s'
sentence = sentence.replace(' ’s', '\'s')
# fix: ' , '
sentence = sentence.replace(' , ', ', ')
return sentence
tts = TextToSentences()
stp = SentenceToParts()
np = NegateParts()
sp = StitchParts()
fus = FixUpSentence()
# step 1: split text into sentences
sentences = tts.get_sentences(text)
ftext_items = []
for sentence in sentences:
# step 2.1: split sentence into sub-sentences
parts = stp.get_parts(sentence)
# step 2.2: negate sub-sentences
nparts = np.get_negated_parts(parts)
# step 2.3: create sentences from sub-sentences
nsentence = sp.get_stitched_parts(nparts)
#print('nsentence = {}'.format(nsentence))
fsentence = fus.get_fixedup_sentence(nsentence)
# step 2.4: Remove spaces etc.
ftext_items.append(fsentence)
# step 3: join sentences
ftext = ' '.join(ftext_items)
print('what they say = \n{}'.format(text))
print('what they mean = \n{}'.format(ftext))
Zusammenfassung
Ich könnte sagen, dass mir dieses kurze Projekt keinen Spaß gemacht hat, aber dann würdet ihr den Politician Translator benutzen und wissen, was ich wirklich meine ... ;-)
Links / Impressum
How to break up document by sentences with Spacy
https://stackoverflow.com/questions/46290313/how-to-break-up-document-by-sentences-with-spacy
Negate
https://pypi.org/project/negate
Tutorial on Spacy Part of Speech (POS) Tagging
https://machinelearningknowledge.ai/tutorial-on-spacy-part-of-speech-pos-tagging
Mehr erfahren
Machine Learning
Neueste
- Ausblenden der Primärschlüssel der Datenbank UUID Ihrer Webanwendung
- Don't Repeat Yourself (DRY) mit Jinja2
- SQLAlchemy, PostgreSQL, maximale Anzahl von Zeilen pro user
- Anzeige der Werte in den dynamischen Filtern SQLAlchemy
- Sichere Datenübertragung mit Public Key Verschlüsselung und pyNaCl
- rqlite: eine hochverfügbare und distverteilte SQLite -Alternative
Meistgesehen
- Verwendung von Pythons pyOpenSSL zur Überprüfung von SSL-Zertifikaten, die von einem Host heruntergeladen wurden
- Verwendung von UUIDs anstelle von Integer Autoincrement Primary Keys mit SQLAlchemy und MariaDb
- Verbindung zu einem Dienst auf einem Docker -Host von einem Docker -Container aus
- PyInstaller und Cython verwenden, um eine ausführbare Python-Datei zu erstellen
- SQLAlchemy: Verwendung von Cascade Deletes zum Löschen verwandter Objekte
- Flask RESTful API Validierung von Anfrageparametern mit Marshmallow-Schemas