...открывается!
Вот какие соображения я придумал, но сейчас некогда:
• Естественно, надо сделать выбор алфавита
• Можно сделать генератор, который подчиняется каким-то правилам буквосочетаемости, которые надо будет указать вместе с алфавитом.
• Можно сделать составление сразу не одного, а множества слов, расположенных по типу облака тэгов, притом, например, левый щелчок добавит слово к выбранным, а правый изменит его и слова, оказавшиеся рядом, или как-то так.
• Можно сделать автоматическую генерацию «словаря» (например, списочек в .txt) из хаотических слов; либо из выбранных слов
• Можно добавлять к слову перевод, если он пришёл в голову, прямо при его выборе
• Чего только нельзя
Когда-нибудь потом хочу написать словарь-помощник конлангера, генератор слов туда бы пошёл, если кто-то свой потом захочет отдать или написать плагином.
Вот что выдаёт мой генератырь:
Цитата: Слова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.
А что за дефисы? Кстати, как у него с настраиваемостью? Предложения сильно-то и не нужны.
Дефис, да, в массиве буков.
А настраивать... Дык смотря что! Алфавит можно любой поставить (правда, с уникодом напряг, приходится кодами... пыха такая пыха.), длина слов регуляется, и предложений тоже...
~/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
Чё-то мой с кириллицей заглючило... :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: Там же
г кириллическая, какого он с чистой кириллицей не работает⁈
Цитата: Bhudh от февраля 13, 2011, 20:28
loduwa
Это польское слово! :negozhe:
lodówa (ó=
) = большой холодильних :green:
Triton, это SSH?
Цитата: lehoslavЭто польское слово! :negozhe:
Шо ж мне теперь, все сгенерированные слова на существование в пяти тышшах языков проверять?
Пусть будет ложным другом!
Цитата: arseniiv от февраля 13, 2011, 20:50
Triton, это SSH?
:??? Это копипаст из консоли, десу же.
А писано на Ruby?
А. Не видел Ruby вблизи.
Цитата: 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...
Версия №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
Я сделал что-то похожее на Triton'ов скрипт, только, правда, количество повторений задать нельзя — нужно писать прямо все варианты. Есть веса, целочисленные (по умолчанию тоже 1), но, клянусь, я эту тему вспомнил и перечитал только после того, как перепридумал всё сам!
Прошу так же не вводить в укор технологии .NET то, что программа распространяется с двумя библиотеками и одним файлом скомпилированной грамматики — это моя вина. Нужен .NET Framework 3.5 Client Profile.
Представление о языке описания генератора можно получить, глядя на пример, который показывается по умолчанию. Если что не так, по требованию всё распишу и даже дам BNF-грамматику. Можно использовать однострочные комментарии, начинающиеся с //. Символьные группы могут содержать любые символы, кроме управляющих, пробельных, запятой и стрелки, а начинаться должны не с цифры. Если символьная группа встречается в левой части продукции, она не сможет попасть в выходную строку, так что называйте нетерминалы как-нибудь не так, каковы у вас звуки слова. Регистр учитывается.
В нормальной версии, когда напишу, будет, конечно, пакетный режим. А ещё там будет другой способ генерации слов с помощью матрицы вероятностей появления одного символа после другого. Правда, она будет генерироваться автоматически, но некоторое управление её видом будет типа уж точно разных вероятностей для гл-согл, согл-гл, гл-гл, согл-согл. Не знаю, насколько такой подход будет строить хорошие слова. Может, сначала проверю его в Mathematic'е.
Судите:
Подниму тему в третий раз, мало ли со вчерашнего утра кто не видел.
Надо же кому-то тестировать, ё-моё!
В другой теме про генератор лексики Ванько очень замечательную ссылку давал: http://www.zompist.com/sounds.htm. Как думаете, делать интерфейс к этой программке? Можно будет «не выходя» поизменять слова, накопившиеся в списке выбранных — списки слов и правила будут во временных файлах.
Несть всё печатаемо.
Оказалось, у Вадимия не отображались → и ɣ и ему лень было устанавливать новые версии шрифтов [:P я всё рассказал!].
Прошу тестировать программу всё-таки!
[Up to the top.]
Во:
http://awkwords.wsr3.net/
Хорошая легковесная штука, однако не такая расширяемая. Надо будет включить в будущую статью-обзор.
Цитироватьсум ки тисум пипи тисам ката па пакун кин сипу туту кан па кам паса тисам така сипин пупан си паки пим кум сипим тику кусан сим ки ти сакам китим тум капун тан пум кун ку па сум пака сипи ки сатан ким тапан пин сум пун туку таким кики тапун пам тукун касум тасин сан ка са кута пим пати тати ти тун сусу там таса пису пун куса ту тин сан капу пим кам тасам кусин пуса типун тан сата пам сисим кисим катим пун ти тукун тасин пу пам кум саса пупун пипи сипум сим ти
;D
Bhudh, побудь тестером! Вдруг алгоритм бракованый в каком-нибудь месте.
Цитата: arseniiv от июля 27, 2011, 22:49
.NET
Городить огород на .NET ради простого генератора образцов по заданной грамматике. Я что-то не понимаю в этой жизни. :donno:
Цитата: arseniiv от августа 1, 2011, 14:40
Bhudh, побудь тестером!
Цитата: arseniiv от июля 27, 2011, 22:49Нужен .NET Framework 3.5 Client Profile.
Нет, ты всё-таки издеваешься...
Цитата: Triton от августа 1, 2011, 16:43
Я что-то не понимаю в этой жизни. :donno:
Мне лень ставить Ruby. :tss:
Цитата: Bhudh от августа 1, 2011, 17:30
Нет, ты всё-таки издеваешься...
Я могу попробовать перевести на меньший. Какой есть?
Цитата: arseniiv от августа 1, 2011, 20:02
Цитата: Triton от августа 1, 2011, 16:43
Я что-то не понимаю в этой жизни. :donno:
Мне лень ставить Ruby. :tss:
apt-get install ruby... ой, не то. Вот то. (http://rubyforge.org/frs/download.php/74298/rubyinstaller-1.9.2-p180.exe)
Цитата: arseniiv от Какой есть?
Вроде трёшка...
Кому нужна руби без рельс?
Цитата: Python от августа 2, 2011, 00:52
Кому нужна руби без рельс?
Мне нужна. А что? Вы хотите об этом поговорить?
Цитата: arseniiv от июля 29, 2011, 12:38
В другой теме про генератор лексики Ванько очень замечательную ссылку давал: http://www.zompist.com/sounds.htm.
Кстати, мне даже хотелось бы как-то улучшить sounds, чтобы сочетания символов с комбинирующейся диакритикой и MODIFIER * считались нераздельными. Не лишаясь преимущества определять символьные классы (а есть ли такое в sed?).
Кто-нибудь знает вообще о том, есть ли какие-то расширения sounds?
Цитата: Bhudh от августа 2, 2011, 00:17
Вроде трёшка...
Надеюсь, можно будет спустить необходимую версию вообще до 2.
Нужен .NET Framework 2.0.
Начал добавлять то, что хотел — теперь для удобства уже три слова. Пакетное ещё не сделал.