Wordiv - это пакет Python для генерации текста с ограниченным набором символов. Он предназначен для проверки типа, но может быть полезен для генерации липограмм.
Допустим, у вас есть буквы HAMBURGERFONTSIVhamburgerfontsiv и пунктуация ., В вашем шрифте. Сордживи может генерировать следующую спинку:
Правда, для того, чтобы достаточно штраф для него на престолах выше, некоторое время для первого бизнеса. Она заключается в том, что он настроен как мысль, что он даже из его субстратов это остальное, что не то, что сбережения движения, которое он измеряет по этому вопросу, Ахав дает лодкам в полдень или из зеленого леса, так высоко, как на Ахава.
При разработке шрифта полезно изучить текст с частичным набором символов. Wordiv изо всех сил старается генерировать реалистичный текст с любым доступным глифами.
Во -первых, установите Wordiv с PIP:
# we install straight from git (for now!)
$ pip install git+https://github.com/tallpauley/wordsiv # byexample: +passДалее установите один или несколько исходных пакетов со страницы выпусков исходных пакетов 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: +passТеперь вы можете сделать поддельные предложения в Python!
> >> 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' )Если вы предпочитаете работать в приложении Drawbot, вы можете следовать этой процедуре для установки Wordiv:
Установите пакет wordsiv через Python-> Установите пакеты Python :
git+https://github.com/tallpauley/wordsiv и нажмите Go!
Установите желаемые исходные пакеты в одном и том же окне, но добавьте --no-deps в конце:
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
.tar.gz .whl Когда вы напишите свой скрипт Drawbot, вы добавите каждый источник, используя add_source_module() :
import wordsiv
import en_wordcount_web
wsv = wordsiv . WordSiv ()
wsv . add_source_module ( en_wordcount_web )
print ( wsv . sentence ( source = "en_wordcount_web" ))
Сорсвис сначала нуждаются в некоторых словах, которые поставляются в форме источников: объектов, которые предоставляют необработанные данные слова.
Эти источники доступны через исходные пакеты, которые являются просто пакетами Python. Давайте установим:
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: +passWordiv автоматически раскрывает эти установленные пакеты, и может сразу использовать эти источники. Давайте попробуем источник с наиболее распространенными словами в английском языке в современном использовании:
> >> 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.' )Как слова знают, как организовать слова из источника в предложение? Вот где модели вступают в игру.
Источник en_wordcount_web использует модель rand по умолчанию. Здесь мы явно выбираем модельный rand , чтобы достичь того же результата, что и выше:
> >> wsv = WordSiv ()
> >> wsv . sentence ( source = 'en_wordcount_web' , model = "rand" )
( 'Maple canvas sporting pages transferred with superior government brand with '
'women for key assign.' )Обратите внимание, что мы получаем такое же предложение, когда мы инициализируем новый объект Wordiv (). Это потому, что словесность предназначена для детерминирования.
Если мы хотим, чтобы текст несколько естественно выглядел , мы могли бы использовать нашу 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..."Модель Маркова обучается на реальном тексте и прогнозирует каждое слово, глядя на предыдущее слово (ы). Мы держим модель как можно более глупой, хотя (одно состояние слова), чтобы генерировать как можно больше различных предложений.
Источники и модели WordCount работают с простыми списками слов и количества событий, чтобы сгенерировать слова.
Randomdel ( model='rand' ) использует количество случаев, чтобы случайным образом выбирать слова, предпочитая более популярные слова:
# Default: probability by occurence count
> >> wsv . paragraph ( source = 'en_wordcount_web' , model = 'rand' ) # byexample: +skip
'Day music, commencement protection to threads who and dimension...'Рандмомль также может быть настроен на игнорирование количества событий и выбрать слова полностью случайным образом:
> >> wsv . sentence ( source = 'en_wordcount_web' , sent_len = 5 , prob = False ) # byexample: +skip
'Conceivably championships consecration ects— anointed.' SequentialModel ( model='seq' ) выплевывает слова в том порядке, который они появляются в источнике. Мы могли бы использовать эту модель для отображения 5 лучших триграмм на английском языке:
> >> wsv . words ( source = 'en_wordcount_trigrams' , num_words = 5 ) # byexample: +skip
[ 'the' , 'ing' , 'and' , 'ion' , 'tio' ]Wordiv создан вокруг идеи выбора слов, которые можно отображать с помощью Glyphs в неполном файле шрифта. Wordiv может автоматически определить, какие глифы находятся в файле шрифта.
Давайте загрузим шрифт с персонажами 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' Мы можем ограничить глифы таким же образом, но вручную с 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 и limit_glyphs Иногда это может быть полезно указать набор символов, который мы хотим отобразить , и использование этих символов только в том случае, если они есть в файле шрифта. Мы можем сделать это, указав как font_file , так и limit_glyphs :
> >> 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' Существует множество способов манипулировать текстом. Вот несколько примеров:
И модели Markovmodel, и WordCount позволяют нам прописать или строчный текст, независимо от того, являются ли исходные слова заглавные слова или нет:
> >> 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'Рандмомль с помощью капитализации предложений по умолчанию, но мы можем отключить это:
> >> wsv . sentence ( 'en_wordcount_web' , cap_sent = False , sent_len = 10 )
'egcs very and mortgage expressed about and online truss controls.'По умолчанию модели WordCount вставляют пунктуацию с вероятностями, примерно полученными от использования на английском языке.
Мы можем выключить это, передав нашу собственную функцию для пунктуации:
> >> 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.' Для получения более подробной информации о punc_func см. Пунктуацию.py. Это относится только к моделям WordCount, так как Markovmodel использует пунктуацию в своих исходных данных.
Модели заботятся о создании предложений и слов , поэтому параметры, относящиеся к ним, обрабатываются моделями. На данный момент, пожалуйста, обратитесь к исходному коду для этих моделей, чтобы изучить параметры, принятые для word() , words() и sentence() API:
Сам объект Wordiv обрабатывает sentences() , paragraph() , paragraphs() и text вызовы с их параметрами. Смотрите исходный код класса Wordsiv, чтобы узнать, как настраивать текстовые выводы.
При проверке типа мы, вероятно, хотим, чтобы наше доказательство оставалось прежним, поскольку у нас есть один и тот же набор символов. Это помогает нам сравнить изменения в типе.
По этой причине Wordiv использует один псевдолупирный генератор номеров, который выявляется при создании объекта Wordiv. Это означает, что сценарий Python с использованием этой библиотеки даст тот же результат, где бы он ни работал.
Если вы хотите, чтобы ваш сценарий генерировал разные слова, вы можете посетить объект словесного вещества:
> >> wsv = WordSiv ( seed = 6 )
> >> wsv . sentence ( source = "en_markov_gutenberg" , min_sent_len = 7 )
'even if i forgot the go in their' После просмотра документального кодированного предвзятости я рассмотрел, следует ли мы даже генерировать текст на основе исторических (или даже текущих) данных из -за сексизма, расизма, колониализма, гомофобии и т. Д., Содержится в текстах.
В этом разделе пытается решить некоторые из этих этических вопросов, которые возникли для меня (Крис Поли), и попытаться убрать этот проект от создания наступательного текста.
Во -первых, эта библиотека была разработана для целей:
Конечно, мы, естественно, читаем слова (DUH), поэтому само собой разумеется, что вы должны контролировать текст, сгенерированный этой библиотекой.
Я подумал, что если бы было более прогрессивные тексты, я мог бы обучить модель Маркова. Тем не менее, мы в любом случае прижимаем исходный текст до бессмысленности, чтобы максимизировать предложения, изготовленные с ограниченным набором символов.
Даже самый положительный текст может очень быстро стать темным, когда я сразился. Маркова модель размера 1 (идеально для ограниченных наборов символов), обученная универсальной декларацией прав человека, вынесла это предложение:
Everyone is entitled to torture
or other limitation of brotherhood.
Дело в том, что полупроверка генерации слов разрушает значение текста, так зачем выбирать вдумчивый источник? Тем не менее, мы должны действительно попытаться держаться подальше от наступательного исходного материала, потому что наступательные модели будут отображаться, если есть какая -то вероятность.
Если вы хотите внести источник и/или модель в этот проект, вот несколько рекомендаций:
Например, мы не давали Марковамоделу подбирать слишком много контекста из исходного текста, сохраняя размер состояния 1. Наличие одного состояния слов также также увеличивает количество потенциальных предложений, так что это работает.
Предложения, которые мы генерируем, имеют меньший смысл, но, поскольку это предназначено для фиктивного текста для проверки, это хорошо!
Это сложно отфильтировать «оскорбительные» слова, так как:
Поскольку мы генерируем бессмысленный текст для проверки, мы должны стараться изо всех сил отфильтровать списки слов по спискам оскорбительных слов. Если вам действительно нужны клятвы в своем тексте, вы можете создавать источники для своих собственных целей.
Мы не можем предотвратить создание случайных слов, но мы можем, по крайней мере, ограничить слова, которые, как правило, формируют оскорбительные предложения.
Статистические модели, подобные моделям, используемым в словесном веле, будут подхватывать шаблоны в тексте - особенно марковмодель. Попробуйте выбрать исходный материал, который довольно нейтральный (не то, чтобы что -то было на самом деле ).
Я обучил EN_MARKOV_GUTENBERG с этими публичными текстами от NLTK, что казалось достаточно безопасным для тупой модели Маркова с одним словом:
['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']
Если вы заметите какие-либо конкретные модели, генерирующие оскорбительные предложения больше, чем нет, пожалуйста, подайте проблему в репо wordiv-source-packages.
Я определенно не первый, кто генерирует слова для проверки. Проверьте эти классные проекты, и дайте мне знать, если вы знаете больше, я должен добавить!
Я, вероятно, не получил бы очень далеко без вдохновения Word-O-Mat, и хороший скрипт Drawbot, которым Роб Стенсон поделился со мной. Последнее - это то, где я понял, чтобы заселить генератор случайных чисел, чтобы сделать его детерминированным.
Я также сильно позаимствовал у Spacy в том, как я настроил исходные пакеты.
Также хочу поблагодарить мою жену Пэмми за любезно слушать, так как я объясняю каждый эзотерический вызов, который я решил, и оказал мне эмоциональную поддержку, когда я чуть не уничтожил 4 часа работы с небрежной ошибкой GIT.