WordSiv ist ein Python -Paket zum Generieren von Text mit einem begrenzten Zeichensatz. Es ist für die Typ -Beweise ausgelegt, kann jedoch zur Erzeugung von Lipogrammen nützlich sein.
Nehmen wir an, Sie haben die Briefe HAMBURGERFONTSIVhamburgerfontsiv und Interpunktion ., In Ihrer Schriftart. WordSiv kann den folgenden Antrieb erzeugen:
Richtig genug, für eine Geldstrafe für ihn an den Thrones oben, einige Zeit für das zuerst das Geschäft. Sie ist, dass er als ein Gedanke, er selbst aus seinen Substraten, der Rest ist, ist nicht die Dinge, die die Einsparungen einer Bewegung, die er über die Angelegenheit misst, Ahab den Booten mittags oder aus dem grünen Wald, so hoch wie auf Ahab.
Während des Entwerfens einer Schrift ist es nützlich, Text mit einem teilweisen Zeichensatz zu untersuchen. WordSiv versucht sein Bestes, um realistisch aussehenden Text mit allen verfügbaren Glyphen zu erzeugen.
Installieren Sie zunächst WordSiv mit PIP:
# we install straight from git (for now!)
$ pip install git+https://github.com/tallpauley/wordsiv # byexample: +passInstallieren Sie als Nächstes ein oder mehrere Quellpakete auf der Seite "Releases" des Quellpakets Repo:
$ base=https://github.com/tallpauley/wordsiv-source-packages/releases/download
$ pkg=en_markov_gutenberg-0.1.0/en_markov_gutenberg-0.1.0-py3-none-any.whl
$ pip install $base / $pkg # byexample: +passJetzt können Sie in Python falsche Sätze machen!
> >> import wordsiv
> >> wsv = wordsiv . WordSiv ( limit_glyphs = ( 'HAMBURGERFONTSIVhamburgerfontsiv' ))
> >> wsv . sentence ( source = 'en_markov_gutenberg' )
( 'I might go over the instant to the streets in the air of those the same be '
'haunting' )Wenn Sie es vorziehen, in der Drawbot -App zu arbeiten, können Sie diese Prozedur befolgen, um WordSiv zu installieren:
Installieren Sie das wordsiv -Paket über Python-> Python-Pakete installieren :
git+https://github.com/tallpauley/wordsiv ein und klicken Sie auf Go!
Installieren Sie die gewünschten Quellpakete im selben Fenster, fügen Sie jedoch am Ende --no-deps hinzu:
https://github.com/tallpauley/wordsiv-source-packages/releases/download/en_wordcount_web-0.1.0/en_wordcount_web-0.1.0-py3-none-any.whl --no-deps
.whl oder .tar.gz aus der Seite "Repo" von Quellpaketen unter der Dropdown -Seite des Vermögens kopieren. Wenn Sie Ihr Drawbot -Skript schreiben, werden Sie jede Quelle mit add_source_module() hinzufügen:
import wordsiv
import en_wordcount_web
wsv = wordsiv . WordSiv ()
wsv . add_source_module ( en_wordcount_web )
print ( wsv . sentence ( source = "en_wordcount_web" ))
WordSiv benötigt zunächst einige Wörter, die in Form von Quellen vorliegen: Objekte, die die Roh -Wort -Daten liefern.
Diese Quellen sind über Quellpakete erhältlich, bei denen es sich einfach um Python -Pakete handelt. Lassen Sie uns einige installieren:
base=https://github.com/tallpauley/wordsiv-source-packages/releases/download
# A markov model trained on public domain books
$ pkg=en_markov_gutenberg-0.1.0/en_markov_gutenberg-0.1.0-py3-none-any.whl
$ pip install $base / $pkg # byexample: +pass
# Most common English words compiled by Peter Norvig with data from Google
$ pkg=en_wordcount_web-0.1.0/en_wordcount_web-0.1.0-py3-none-any.whl
$ pip install $base / $pkg # byexample: +pass
# Most common Trigrams compiled by Peter Norvig with data from Google
$ pkg=en_wordcount_trigrams-0.1.0/en_wordcount_trigrams-0.1.0-py3-none-any.whl
$ pip install $base / $pkg # byexample: +passWordSiv automatisch entdeckt diese installierten Pakete und können diese Quellen sofort verwenden. Versuchen wir eine Quelle mit den häufigsten Worten in der englischen Sprache in der modernen Verwendung:
> >> from wordsiv import WordSiv
> >> wsv = WordSiv ()
> >> wsv . sentence ( source = 'en_wordcount_web' )
( 'Maple canvas sporting pages transferred with superior government brand with '
'women for key assign.' )Woher weiß ein Wortiv, wie man Wörter aus einer Quelle in einen Satz anordnet? Hier kommen Models ins Spiel.
Die Quelle en_wordcount_web verwendet standardmäßig das Modell rand . Hier wählen wir explizit das Modell rand aus, um das gleiche Ergebnis wie oben zu erzielen:
> >> wsv = WordSiv ()
> >> wsv . sentence ( source = 'en_wordcount_web' , model = "rand" )
( 'Maple canvas sporting pages transferred with superior government brand with '
'women for key assign.' )Beachten Sie, dass wir den gleichen Satz erhalten, wenn wir ein neues WordSiv () -Objekt initialisieren. Dies liegt daran, dass WordSiv determinisikalisch gestaltet ist.
Wenn wir einen Text wollen, der etwas natürliches aussieht , verwenden wir möglicherweise unser Markovmodel ( model='mkv' ).
> >> wsv . paragraph ( source = "en_markov_gutenberg" , model = "mkv" ) # byexample: +skip
"Why don't think so desirous of hugeness. Our pie is worship..."Ein Markov -Modell wird auf realem Text geschult und prognostiziert jedes Wort, indem Sie sich die vorhergehenden Wörter ansehen. Wir halten das Modell jedoch so dumm wie möglich (ein Wortzustand), um so viele verschiedene Sätze wie möglich zu generieren.
WordCount -Quellen und -Modelle arbeiten mit einfachen Listen von Wörtern und Auftreten, um Wörter zu generieren.
Das Randommodel ( model='rand' ) verwendet die Auftreten von Aufnahmen, um zufällig Wörter auszuwählen und mehr beliebte Wörter zu bevorzugen:
# Default: probability by occurence count
> >> wsv . paragraph ( source = 'en_wordcount_web' , model = 'rand' ) # byexample: +skip
'Day music, commencement protection to threads who and dimension...'Das Randommodel kann auch so eingestellt werden, dass die Ereignisse zählt und Wörter vollständig zufällig auswählen:
> >> wsv . sentence ( source = 'en_wordcount_web' , sent_len = 5 , prob = False ) # byexample: +skip
'Conceivably championships consecration ects— anointed.' Das sequentielleModel ( model='seq' ) spuckt Wörter in der Reihenfolge aus, die sie in der Quelle erscheinen. Wir könnten dieses Modell verwenden, um die Top 5 Trigramme in englischer Sprache anzuzeigen:
> >> wsv . words ( source = 'en_wordcount_trigrams' , num_words = 5 ) # byexample: +skip
[ 'the' , 'ing' , 'and' , 'ion' , 'tio' ]WordSiv basiert auf der Idee, Wörter auszuwählen, die mit den Glyphen in einer unvollständigen Schriftart zugelassen werden können. WordSiv kann automatisch bestimmen, welche Glyphen sich in einer Schriftart befinden.
Laden wir eine Schriftart mit den Charakteren HAMBURGERFONTSIVhamburgerfontsiv
> >> wsv = WordSiv ( font_file = 'tests/data/noto-sans-subset.ttf' )
> >> wsv . sentence ( source = 'en_markov_gutenberg' , max_sent_len = 10 )
'Nor is fair to be in as these annuities' Wir können die Glyphen auf die gleiche Weise einschränken, aber manuell mit limit_glyphs
> >> wsv = WordSiv ( limit_glyphs = 'HAMBURGERFONTSIVhamburgerfontsiv' )
> >> wsv . sentence ( source = 'en_wordcount_web' )
'Manage miss ago are motor to rather at first to be of has forget'font_file und limit_glyphs Es kann manchmal nützlich sein, den von uns angezeigten Zeichensatz anzugeben und nur diese Zeichen zu verwenden, wenn wir sie in der Schriftart Datei haben. Wir können dies tun, indem wir sowohl font_file als auch limit_glyphs angeben:
> >> wsv = WordSiv (
... font_file = 'tests/data/noto-sans-subset.ttf' ,
... limit_glyphs = 'abcdefghijklmnop'
... )
> >> wsv . sentence ( 'en_wordcount_web' , cap_sent = False , min_wl = 3 )
'eng gnome gene game egg one aim him again one game one image boom' Es gibt verschiedene Möglichkeiten, wie Text manipuliert werden kann. Hier sind einige Beispiele:
Sowohl die Markovmodel- als auch die WordCount -Modelle ermöglichen es uns, im Groß- oder Kleinbuchstigen Text zu sein, unabhängig davon, ob die Quellwörter aktiviert sind oder nicht:
> >> wsv = WordSiv ()
> >> wsv . sentence ( 'en_wordcount_web' , uc = True , max_sent_len = 8 )
'MAPLE CANVAS SPORTING PAGES TRANSFERRED, WITH SUPERIOR GOVERNMENT.'
> >> wsv . sentence (
... 'en_markov_gutenberg' , lc = True , min_sent_len = 7 , max_sent_len = 10
... )
'i besought the bosom of the sun so'Das Randodel beiträgt standardmäßig die Sätze, aber wir können dies ausschalten:
> >> wsv . sentence ( 'en_wordcount_web' , cap_sent = False , sent_len = 10 )
'egcs very and mortgage expressed about and online truss controls.'Standardmäßig fügen die Wortcount -Modelle Interpunktion mit Wahrscheinlichkeiten ein, die grob aus der Verwendung in englischer Sprache abgeleitet sind.
Wir können dies ausschalten, indem wir unsere eigene Funktion für die Interpunktion übergeben:
> >> def only_period ( words , * args ): return ' ' . join ( words ) + '.'
> >> wsv . paragraph (
... source = 'en_wordcount_web' , punc_func = only_period , sent_len = 5 , para_len = 2
... )
'By schools sign I avoid. Or about fascism writers what.' Weitere Informationen zu punc_func finden Sie unter Reifenpunktion.py. Dies gilt nur für WordCount -Modelle, da das Markovmodel die Interpunktion in seinen Quelldaten verwendet.
Modelle kümmern sich um die Erzeugung von Sätzen und Wörtern , sodass Parameter in Bezug auf diese von den Modellen behandelt werden. Wenden Sie sich vorerst an den Quellcode für diese Modelle, um die für word() , words() und sentence() akzeptierten Parameter zu lernen: APIs:
Das WordSiv -Objekt selbst übernimmt sentences() , paragraph() , paragraphs() und text mit ihren Parametern. Sehen Sie sich den Quellcode der WordSiv -Klasse an, um zu erfahren, wie Sie die Textausgabe anpassen.
Wenn wir beim Beweistyp den Nachweis beweisen, möchten wir wahrscheinlich, dass unser Beweis genauso bleibt, solange wir den gleichen Charakter -Set haben. Dies hilft uns, Änderungen des Typs zu vergleichen.
Aus diesem Grund verwendet WordSiv einen einzelnen Pseudo-Random-Zahlengenerator, der bei der Erstellung des Wordsiv-Objekts ausgesät wird. Dies bedeutet, dass ein Python -Skript, das diese Bibliothek verwendet, das gleiche Ergebnis erzeugt, wo immer es ausgeführt wird.
Wenn Sie möchten, dass Ihr Skript verschiedene Wörter erzeugt, können Sie das WordSiv -Objekt säen:
> >> wsv = WordSiv ( seed = 6 )
> >> wsv . sentence ( source = "en_markov_gutenberg" , min_sent_len = 7 )
'even if i forgot the go in their' Nachdem ich die dokumentarisch codierte Voreingenommenheit angesehen hatte, überlegte ich, ob wir aufgrund des Sexismus, des Rassismus, des Kolonialismus, der Homophobie usw. überhaupt Text basierend auf historischen (oder sogar aktuellen) Daten generieren sollten, die in den Texten enthalten sind.
In diesem Abschnitt wird versucht, einige dieser ethischen Fragen zu beantworten, die für mich (Chris Pauley) entstanden sind, und zu versuchen, dieses Projekt von der Generierung von offensiven Text abzulenken.
Zunächst einmal wurde diese Bibliothek für die Zwecke ausgelegt:
Natürlich lesen wir natürlich Wörter (DUH), daher versteht es sich, dass Sie von dieser Bibliothek generierten Text überwachen sollten.
Ich überlegte, ob es progressivere Texte gäbe, auf die ich ein Markov -Modell trainieren konnte. Wir kriechen jedoch trotzdem den Quelltext zur Sinnlosigkeit, um die Sätze mit einem begrenzten Charakter -Satz zu maximieren.
Sogar der positivste Text kann sehr schnell dunkel werden, wenn sie durcheinander geraten. Ein Markov -Modell der staatlichen Größe 1 (ideal für begrenzte Zeichensets), das mit der UN -Universalerklärung der Menschenrechte ausgebildet wurde, machte diesen Satz:
Everyone is entitled to torture
or other limitation of brotherhood.
Der Punkt ist, dass halbfremdige Wortgeneration die Bedeutung von Text ruiniert. Warum also die Mühe machen, eine nachdenkliche Quelle auszuwählen? Wir sollten jedoch wirklich versuchen, sich von offensiver Quellmaterial fernzuhalten, da offensive Muster angezeigt werden , wenn es eine Wahrscheinlichkeit gibt.
Wenn Sie eine Quelle und/oder ein Modell für dieses Projekt einbringen möchten, finden Sie hier einige Richtlinien:
Zum Beispiel verhindern wir Markovmodel davon abzuhalten, aus dem Originaltext zu viel Kontext zu finden, indem wir eine Zustandsgröße von 1. durchführen. Ein einziger Wortzustand erhöht auch die Menge potenzieller Sätze, sodass es funktioniert.
Die Sätze, die wir erzeugen, sind weniger sinnvoll, aber da dies für den Dummy -Text zur Beweisung ausgelegt ist, ist dies eine gute Sache!
Es ist knifflige "beleidigende" Wörter, da:
Da wir unsinnigen Text zum Beweis erzeugen, sollten wir unser Bestes geben, um Wordlisten durch beleidigende Wörterlisten zu filtern. Wenn Sie in Ihrem Text wirklich schwören, können Sie Quellen für Ihre eigenen Zwecke erstellen.
Wir können nicht verhindern, dass zufällige Wörter beleidigende Sätze bilden, aber wir können zumindest Wörter einschränken, die dazu neigen, offensive Sätze zu bilden .
Statistische Modelle wie die in WordSiv verwendeten Mustern im Text - insbesondere auf Markovmodels. Versuchen Sie, Quellenmaterial zu wählen, das ziemlich neutral ist (nicht, dass etwas wirklich ist).
Ich habe en_markov_gutenberg mit diesen öffentlich-domänen-Texten von NLTK trainiert, die für ein dummes Markov-Modell mit einem Wortstaat sicher genug schienen:
['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt',
'blake-poems.txt', 'bryant-stories.txt', 'burgess-busterbrown.txt',
'carroll-alice.txt', 'chesterton-ball.txt', 'chesterton-brown.txt',
'chesterton-thursday.txt', 'edgeworth-parents.txt', 'melville-moby_dick.txt',
'milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt',
'shakespeare-macbeth.txt', 'whitman-leaves.txt']
Wenn Sie feststellen, dass bestimmte Modelle mehr als nicht beleidigende Sätze generieren, stellen Sie bitte ein Problem beim Repo von WordSiv-Source-Packages ein.
Ich bin definitiv nicht der erste, der Wörter für die Beweisierung erzeugt. Schauen Sie sich diese coolen Projekte an und lassen Sie mich wissen, ob Sie mehr wissen, was ich hinzufügen sollte!
Ohne die Inspiration von Wort-o-mat und ein schönes Drawbot-Skript, das Rob Stenson mit mir geteilt hat, hätte ich wahrscheinlich nicht weit gekommen. Letzteres habe ich die Idee, den Zufallszahlengenerator zu säen, um ihn deterministisch zu machen.
Ich habe mich auch stark von Spacy in den Quellpaketen ausgeliehen.
Ich möchte auch meiner Frau Pammy dafür danken, dass sie freundlich zugehört hat, als ich jede esoterische Herausforderung erkläre, die ich in Angriff genommen habe, und mir emotionale Unterstützung zu bieten, wenn ich fast 4 Stunden Arbeit mit einem nachlässigen Fehler ausgelöscht habe.