Author Topic: Конкурс на лучший генератор лексики…  (Read 8247 times)

0 Members and 1 Guest are viewing this topic.

Offline arseniiv

  • Blogger
  • *
  • Posts: 14923
    • ::
…открывается!

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

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

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

Offline Bhudh

  • Posts: 60533
  • Gender: Male
  • aka 蝎
    • Сайты по языкознанию
Вот что выдаёт мой генератырь:
Quote from: Слова
cu, vi, vi, lu,
dive, lewe, luvy, gyze,
nypoca, jagafa, dylaqu, loduwa,
zowafota, pinyrigy, bysuwito, zylauco
Quote from: Предложения
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.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Offline arseniiv

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

Offline Bhudh

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

Offline Triton

  • Posts: 5743
Code: [Select]
~/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
Молиться, поститься и слушать радио Ватника

Offline Bhudh

  • Posts: 60533
  • Gender: Male
  • aka 蝎
    • Сайты по языкознанию
Чё-то мой с кириллицей заглючило… :what:
А с ИЕицей нормально:
Quote from: Слова
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
Quote from: Предложения
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.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Offline lehoslav

  • Posts: 8683
  • Gender: Male
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.

Offline arseniiv

  • Blogger
  • *
  • Posts: 14923
    • ::
Triton, это SSH?

Offline Bhudh

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

Offline Triton

  • Posts: 5743
Triton, это SSH?
:??? Это копипаст из консоли, десу же.
Молиться, поститься и слушать радио Ватника

Offline Bhudh

  • Posts: 60533
  • Gender: Male
  • aka 蝎
    • Сайты по языкознанию
А писано на Ruby?
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Offline Triton

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

Offline arseniiv

  • Blogger
  • *
  • Posts: 14923
    • ::
А. Не видел Ruby вблизи.

Offline lehoslav

  • Posts: 8683
  • Gender: Male
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.

Offline Demetrius

  • Posts: 12351
  • Бес джинн фея колдунчик
lodówa (ó=) = большой холодильних  :green:
Так вот откуда тарашкевичная «лядоўня»… А я-то думал, что они хоть что-то сами придумали…  :no:
«Честного не жди слова, // Я тебя предам снова»

Offline Вадимий

  • Posts: 14817
  • Gender: Male

Offline Искандер

  • Posts: 19289
  • Gender: Male
  • звезду, кому звезду!
Quote from: 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

Offline Triton

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

Code: [Select]
~/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

Code: [Select]
~/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

Code: [Select]
~/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
Молиться, поститься и слушать радио Ватника

Offline arseniiv

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

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

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

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

Судите:

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

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

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

Offline Вадимий

  • Posts: 14817
  • Gender: Male
Несть всё печатаемо.

Offline arseniiv

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


Offline Палтус

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

Offline arseniiv

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