Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Конкурс на лучший генератор лексики…

Автор arseniiv, февраля 13, 2011, 18:57

0 Пользователи и 1 гость просматривают эту тему.

arseniiv

...открывается!

Вот какие соображения я придумал, но сейчас некогда:

• Естественно, надо сделать выбор алфавита
• Можно сделать генератор, который подчиняется каким-то правилам буквосочетаемости, которые надо будет указать вместе с алфавитом.
• Можно сделать составление сразу не одного, а множества слов, расположенных по типу облака тэгов, притом, например, левый щелчок добавит слово к выбранным, а правый изменит его и слова, оказавшиеся рядом, или как-то так.
• Можно сделать автоматическую генерацию «словаря» (например, списочек в .txt) из хаотических слов; либо из выбранных слов
• Можно добавлять к слову перевод, если он пришёл в голову, прямо при его выборе
• Чего только нельзя

Offtop
Когда-нибудь потом хочу написать словарь-помощник конлангера, генератор слов туда бы пошёл, если кто-то свой потом захочет отдать или написать плагином.

Bhudh

Вот что выдаёт мой генератырь:
Цитата: Словаcu, vi, vi, lu,
dive, lewe, luvy, gyze,
nypoca, jagafa, dylaqu, loduwa,
zowafota, pinyrigy, bysuwito, zylauco
Цитата: Предложенияrruti ko mzy zuvazecy il-er-.
has s-k-vyha.
j zeli w-tuju diq-.
aha-ozeqa xra.
q-jypecy n-suwe ja sek-hu cwyate.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

arseniiv

А что за дефисы? Кстати, как у него с настраиваемостью? Предложения сильно-то и не нужны.

Bhudh

Дефис, да, в массиве буков.
А настраивать... Дык смотря что! Алфавит можно любой поставить (правда, с уникодом напряг, приходится кодами... пыха такая пыха.), длина слов регуляется, и предложений тоже...
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Triton


~/wordgen$ cat testrules

word: [syl:2..3] [V][syl:2..3]

syl: [C][V] [C][V][L]

C: t p s d f g h k z v b n m l r

V: i e a u o [DV]

DV: [V1][V2]

V1: a u

V2: i e

L: n m


~/wordgen$ cat wordgen.rb


$rules = {}

$root = ''

def parse_line(line)
line.strip!
return if line == '' || line[0] == '#'

s = line.split(':', 2)
return if s.size < 2

name = s[0].strip
s = s[1].strip.split(/\s+/)
return if name == '' || s.size == 0

$rules[name] = [] if !$rules.has_key?(name)
$rules[name] = $rules[name].concat(s).uniq
$root = name if $root == ''
end

STDIN.each_line { |l| parse_line(l) }

if $root == ''
STDERR.puts 'No rules found'
exit 1
end

def gen_word(name)
if !$rules.has_key?(name)
STDERR.puts "Rule '#{name}' not found"
exit 1
end
rule = $rules[name]
pattern = rule[rand rule.size]
return '' if pattern == '[]'
pattern.gsub /\[([a-zA-Z_0-9]+)(:([0-9]+)(\.\.([0-9]+))?)?\]/ do | s1, s2 |
n = $1
s1, s2 = if $5.is_a?(String)
[$3.to_i, $5.to_i]
elsif $3.is_a?(String)
[1, $3.to_i]
else
[1, 1]
end
r = ''
Random.new.rand(s1..s2).times { r << gen_word(n) }
r
end
end

loop do
word = gen_word($root)
begin
puts word
rescue
exit 0
end
end


~/wordgen$ ruby wordgen.rb < testrules | head -n 40 | sort | uniq
aehintombi
aelede
aifefimvo
aihumdaen
ailanmi
akomhirum
alaingui
asempuefin
atemnanpuen
azurin
dapekim
enunronre
etasen
gula
haidum
hamam
ibumge
ivukuma
mimkae
odanfuima
omenpemzi
opuele
ozizivaim
paetamfi
pafoni
pubirom
putuin
remven
saimsanfin
sansendam
sonhomhi
sonnaem
sumfi
tomdimpim
udemuiden
uelongumken
uetamdin
uetomaen
usobaifi
vanbogem
Молиться, поститься и слушать радио Ватника

Bhudh

Чё-то мой с кириллицей заглючило... :what:
А с ИЕицей нормально:
Цитата: Словаje, pi, bi, sa,
dʰutu, sоqai, mibʰe, zʰajo,
gobʰato, bimibʰu, dʰadʰiгi, miraka,
kejudeud, dʰiazuxa, lоjodeuzʰo, tuwijene
Цитата: Предложенияbʰou zaigoutu jeumoi.
zou г reu.
luheuzʰouja xa weja.
гoгoze meijai cigaulei.
bʰupaubepei cisaukeubʰo moipeu gedʰо.
:uzhos: Там же г кириллическая, какого он с чистой кириллицей не работает⁈
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

lehoslav

Цитата: Bhudh от февраля 13, 2011, 20:28
loduwa

Это польское слово! :negozhe:

lodówa (ó=) = большой холодильних  :green:
Wenn mit mir und denn noch drey Personen es vorbey ist in unserem Dorf, alsdann wird wohl niemand recht wissen, wie ein Hund auf Wendisch genannt wirdt.

arseniiv


Bhudh

Цитата: lehoslavЭто польское слово! :negozhe:
Шо ж мне теперь, все сгенерированные слова на существование в пяти тышшах языков проверять?
Пусть будет ложным другом!
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Triton

Молиться, поститься и слушать радио Ватника

Bhudh

Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Triton

Молиться, поститься и слушать радио Ватника

arseniiv


lehoslav

Wenn mit mir und denn noch drey Personen es vorbey ist in unserem Dorf, alsdann wird wohl niemand recht wissen, wie ein Hund auf Wendisch genannt wirdt.

Demetrius

Цитата: lehoslav от февраля 13, 2011, 20:50
lodówa (ó=) = большой холодильних  :green:
Так вот откуда тарашкевичная «лядоўня»... А я-то думал, что они хоть что-то сами придумали...  :no:


Искандер

Цитата: Bhudh от февраля 13, 2011, 20:52
Цитата: lehoslavЭто польское слово! :negozhe:
Шо ж мне теперь, все сгенерированные слова на существование в пяти тышшах языков проверять?
Пусть будет ложным другом!
jesce nado szob znacilo "cholodilnik"
Szob lożny, no choroszy.

I generator nużen nie słów, a morfem...
"Niech żyją POLACY!! Ponieważ polacy są rasej nadczłowieków. Od nich jest przyszłość planety. Oni przeżyją nawet wojną atomowę, dlatego, że polacy są wieczni, bo chtoniczni. I dadzą potomstwo, które też będzie polakami i polkami. Niech żyjemy, hura!.." (c) Awwal12

Triton

Версия №2. Теперь с возможностью назначать веса вариантам.

~/wordgen$ cat testrules
word: [syl:2..3]!3 [V][syl:2..3]

syl: [C][V]!4 [C][V][L]

C: t p s d f g h k z v b n m l r
L: n!2 m

V: i!3 e!4 a!4 u o!4 [DV]
DV: [V1][V2]
V1: a u
V2: i e


~/wordgen$ cat wordgen.rb

$rules = {}
$root = ''
$wt_sum = {}

def parse_line(line)
line.strip!
return if line == '' || line[0] == '#'

s = line.split(':', 2)
return if s.size < 2

name = s[0].strip
s = s[1].strip.split(/\s+/).map do | v |
v = v.split('!', 2)
v[1] = if v.size < 2 then 1 else v[1].to_i end
v
end

return if name == '' || s.size == 0

$rules[name] = [] if !$rules.has_key?(name)
$rules[name] = $rules[name].concat(s).uniq
$root = name if $root == ''
end

STDIN.each_line { |l| parse_line(l) }

if $root == ''
STDERR.puts 'No rules found'
exit 1
end

$rules.each_pair  do |name , rule|
$wt_sum[name] = rule.reduce(0) { |sum, v| sum += v[1]}
end

def gen_word(name)
if !$rules.has_key?(name)
STDERR.puts "Rule '#{name}' not found"
exit 1
end

rule = $rules[name]
d = rand $wt_sum[name]; i = 0
pattern = rule.find { |v| i += v[1]; d < i && d >= i - v[1]} [0]

return '' if pattern == '[]'

pattern.gsub /\[([a-zA-Z_0-9]+)(:([0-9]+)(\.\.([0-9]+))?)?\]/ do
n = $1
s1, s2 = if $5.is_a?(String)
[$3.to_i, $5.to_i]
elsif $3.is_a?(String)
[1, $3.to_i]
else
[1, 1]
end
r = ''
Random.new.rand(s1..s2).times { r << gen_word(n) }
r
end
end

loop do
word = gen_word($root)
begin
puts word
rescue
exit 0
end
end


~/wordgen$ ruby wordgen.rb < testrules | head -n 60 | sort | uniq
agihezun
akogi
buva
date
devi
duesigi
edikiba
edorufo
fetopu
foho
gamen
gelekui
gike
gimfo
gonko
hemo
hogue
idennaenzi
ironso
izale
izasue
izero
lenrodo
lezen
liku
molofo
mupevim
navi
nivito
nodosa
nolo
nonefo
nosu
okega
okinsen
paemate
pofu
rezina
rinmam
ripove
seko
semkami
somke
sonke
suku
taho
tedaemdin
teveve
tokipe
toniha
ugammive
uzigo
vanhila
vanse
vazamfu
venhapun
vorai
zamunze
zolainvo
zongivo
Молиться, поститься и слушать радио Ватника

arseniiv

Я сделал что-то похожее на Triton'ов скрипт, только, правда, количество повторений задать нельзя — нужно писать прямо все варианты. Есть веса, целочисленные (по умолчанию тоже 1), но, клянусь, я эту тему вспомнил и перечитал только после того, как перепридумал всё сам!

Прошу так же не вводить в укор технологии .NET то, что программа распространяется с двумя библиотеками и одним файлом скомпилированной грамматики — это моя вина. Нужен .NET Framework 3.5 Client Profile.

Представление о языке описания генератора можно получить, глядя на пример, который показывается по умолчанию. Если что не так, по требованию всё распишу и даже дам BNF-грамматику. Можно использовать однострочные комментарии, начинающиеся с //. Символьные группы могут содержать любые символы, кроме управляющих, пробельных, запятой и стрелки, а начинаться должны не с цифры. Если символьная группа встречается в левой части продукции, она не сможет попасть в выходную строку, так что называйте нетерминалы как-нибудь не так, каковы у вас звуки слова. Регистр учитывается.

В нормальной версии, когда напишу, будет, конечно, пакетный режим. А ещё там будет другой способ генерации слов с помощью матрицы вероятностей появления одного символа после другого. Правда, она будет генерироваться автоматически, но некоторое управление её видом будет типа уж точно разных вероятностей для гл-согл, согл-гл, гл-гл, согл-согл. Не знаю, насколько такой подход будет строить хорошие слова. Может, сначала проверю его в Mathematic'е.

Судите:

arseniiv

Подниму тему в третий раз, мало ли со вчерашнего утра кто не видел.

Надо же кому-то тестировать, ё-моё!

В другой теме про генератор лексики Ванько очень замечательную ссылку давал: http://www.zompist.com/sounds.htm. Как думаете, делать интерфейс к этой программке? Можно будет «не выходя» поизменять слова, накопившиеся в списке выбранных — списки слов и правила будут во временных файлах.

Вадимий


arseniiv

Оказалось, у Вадимия не отображались → и ɣ и ему лень было устанавливать новые версии шрифтов [:P я всё рассказал!].
Прошу тестировать программу всё-таки!

arseniiv


Палтус

Мэр Нью-Йорка Фиорелло ла Гуардиа с 136-кг палтусом на Фултонском рыбном рынке (англ.) в Бронксе

arseniiv

Хорошая легковесная штука, однако не такая расширяемая. Надо будет включить в будущую статью-обзор.