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

Генератор языков

Автор shinkarom, августа 12, 2009, 15:05

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


addewyd

угу. смотрим. правда, дельфа у меня старовата.

Вадимий

Шинкаром!
Усовершенствованная версия латиницы для Вашей программы.

Вадимий

Новая версия :-[
Внимание. Изменилось содержание файлов "Глаголы.txt" и "Существительные.txt"

arseniiv

Частотный список - нет лучше штуки, чем его автоматическая генерация. Как в моём файле. Кто разберётся - тому бонус - использование ;D Похоже, никто не разберётся. Ну ладно. Вскорости всё посмотрю. Но пока не могу...

О, Вадимий, у вас хороший список глаголов! :) (И мне когда-нибудь пригодится.) Это вы те списки почистили от цифр и разделили, да?

Кстати, вот тут

function RandomFromArr(arr: array of string): string;
begin
  result:=arr[random(length(arr)-1)];
end;

последний элемент массива никогда не будет выдаваться. Надо result := arr[random(length(arr))]; - ведь random(n) выдаёт число от 0 до n-1

Вадимий

Цитата: arseniiv от сентября  4, 2009, 16:54
Частотный список - нет лучше штуки, чем его автоматическая генерация. Как в моём файле. Кто разберётся - тому бонус - использование ;D Похоже, никто не разберётся. Ну ладно. Вскорости всё посмотрю. Но пока не могу...

О, Вадимий, у вас хороший список глаголов! :) (И мне когда-нибудь пригодится.) Это вы те списки почистили от цифр и разделили, да?

Кстати, вот тут

function RandomFromArr(arr: array of string): string;
begin
  result:=arr[random(length(arr)-1)];
end;

последний элемент массива никогда не будет выдаваться. Надо result := arr[random(length(arr))]; - ведь random(n) выдаёт число от 0 до n-1
Почистил и разделил, да  :yes:.

А зачем вы этот код приводите?


Вадимий


arseniiv

Ого, интересная! Но я shinkarom'скую программу пока снёс.

shinkarom

Вот моя новая версия. Просто Интернета неделю не было.
Добавил зачатки спряжения, генерацию частотного списка букв.

Насчет диакритики, то я собираюсь потом добавить файл , в котором много букв, чтобы программа случайно выбирала из списка и количество и сами буквы.

У меня вопрос: какой должен быть алгоритм выбора буквы, если известно распределение букв по частоте?

Я собираюсь позже добавить скриптинг. Вкладывайте txt файлы со своими предложениями по поводу его формата. А также свои алфавиты
Мой блог //allthetongues.hol.es

Вадимий

неплохо, совсем неплохо. (особенно множественное число, генерирующееся разными способами.)
А по поводу частоты:
допустим, а встречается в 2 раза чаще, чем б, а В в 2 раза чаще, чем б.
генерируем строку: баавввв и выбираем случайню букву оттуда. Вот пример :генерирует похожие на русские слова.

addewyd

Цитата: shinkarom от сентября  8, 2009, 13:08
У меня вопрос: какой должен быть алгоритм выбора буквы, если известно распределение букв по частоте?

Имеем хеш h:  буква -> частота (0..1), т.е сумма частот = 1

n = random()
x = 0
foreach (letter, freq) in h
{
  if n >= x and n < x + freq return letter
  x += freq
}


Приблизительно так

Ilmar

Цитата: Вадимий от сентября  8, 2009, 14:31
генерирует похожие на русские слова.
нйаь
пнтьлт
ькеьоа

Надо дорабатывать)))
When you wake, you shall have cake,
And all the pretty little horses.

addewyd

Цитата: Вадимий от сентября  8, 2009, 14:31
генерирует похожие на русские слова
Похожие на русские слова можно генерировать так:

;;;; -*- Mode: Lisp; Syntax: Common Lisp -*-
;;;; YK, Mon Aug 9 1999
;;;; bred, v.0.2

(defvar *word-1* nil)
(defvar *word-2* nil)
(defvar *tree* (list nil nil nil))

;;; -------------------------------------------------------

(defun get-words (stream)
    (if *word-1*
        (setf *word-1* *word-2* *word-2* (read-word stream))
        (setf *word-1* (read-word stream) *word-2* (read-word stream))))


;;; -------------------------------------------------------

(defun read-word (stream)
    (let (c (str "") )
            (setq c (int-char (read-byte stream nil 0)))
            (when (char-equal c #\Newline) (setf c #\Space))
            (cond
                ((char-equal c #\Null) "")
                (t (string-append str c)))))
       
;;; -------------------------------------------------------

(defun tree-add (word nextword tree)
    (cond
((string= word "") nil)
        ((null (car tree))
            (setf (car tree)
                (list word 1 (list (list nextword 1)))))
        ((string= word (caar tree))
            (incf (second (first tree)))
                (add-next nextword (third (car tree))))
        ((string< word (caar tree))
            (unless (second tree)
                (setf (second tree) (list ()()())))
            (tree-add word nextword (second tree)))
        (t (unless (third tree)
                (setf (third tree) (list ()()())))
            (tree-add word nextword (third tree)))))

;;; -------------------------------------------------------

(defun add-next (word lst)
    (let ((el (member word lst
        :test #'(lambda (i l) (string= (car l) i)))))
        (if el
            (incf (second (first el)))
            (nconc lst (list (list word 1))))))

;; -----------------------------------------------

(defun find-word (tree word)
    (cond
        ((null tree) nil)
        ((string= (caar tree) word) (car tree))
        ((string< word (caar tree))
(find-word (second tree) word))
        (t (find-word (third tree) word))))

;;; -----------------------------------------

(defun choose-word (lst)
    (if lst
        (let* ((n (apply #'+ (mapcar #'cadr lst)))
            (r (random n)) 
            (l (length lst))
            (m 0))
            (loop
                (decf l)
                (when (or (< (decf r (cadr (nth m lst))) 0) (< l 1))
                    (return (car (nth m lst))))
                (incf m)))
        nil))

;;-------------------------------------------------------

(defun string-append (str chr)
    (string-concat str (make-string 1 :initial-element chr)))

;;; -------------------------------------------------------

(defun generate-tree (fname)
    (with-open-file (stream fname :element-type 'unsigned-byte)
        (loop
            (get-words stream)
            (tree-add *word-1* *word-2* *tree*)
            (when (string= *word-2* "") (return *tree*)))))

;; --------------------------------------------------------

(defun write-text (tree)
(print tree)
    (let ((wrd (first tree)) (n 0) w-next)
        (loop
            (unless (and wrd (setf w-next (choose-word (third wrd))))
                (return))
            (format t "~A" (first wrd))
;;            (when (> (incf n) 7) (setq n 0) (terpri))
            (setf wrd (find-word tree w-next)))))

;;; -------------------------------------------------------

(defun main ()
    (setf *random-state* (make-random-state t))
    (if (car *args*)
        (write-text (generate-tree (car *args*)))
        (princ "Usage: bred <filename>")))

(main)


Выдаст построенное дерево и некоторое количество слов.

Вадимий

Цитата: Ilmar от сентября  9, 2009, 10:26
Цитата: Вадимий от сентября  8, 2009, 14:31
генерирует похожие на русские слова.
нйаь
пнтьлт
ькеьоа

Надо дорабатывать)))
Некоторые слова того не требуют :):

одоры
гвов
оюда
тлан
летот
ыеанп

Вадимий

У меня теперь реже доступ к компьютеру, я реже буду всё выкладывать.

arseniiv

Буду покорно ждать следующей версии, чтобы посмотреть... :)


arseniiv

Offtop
Да в общем-то и не за что. Моё внимание довольно легко заинтересовать...

shinkarom

Вот моя новая версия. Я добавил немного, потому что пока не зная, как продолжать.
Мой блог //allthetongues.hol.es

arseniiv

Может, начать сначала? На более глубоком уровне. Хотя идей нет, а без них всё это пустое.

иванов егор

А когда кто нибудь сделает, чтобы падежи, числа и прочее задавались по желанию пользователя, а не случайным способом?

arseniiv

Цитата: иванов егор от ноября  2, 2010, 16:39
А когда кто нибудь сделает, чтобы падежи, числа и прочее задавались по желанию пользователя, а не случайным способом?
А такая программа уже есть! Называется «бумажный блокнот». :)

Если честно, предложите какую-нибудь достаточно богатую схему формализации желаний пользователя, а ещё способ строить необходимое описание языка по полученному списку желаний. Боюсь, это AI. Тут, увы, пока приходится обходиться неспешной человеческой головой.

Точнее выражаясь, хороший генератор языков должен быть подобен идеальному генератору расписания (например, для университета, хотя и школьные достаточно сложны), притом он должен «уметь» пополняться новыми знаниями о том, что можно сделать в языке, а ещё грамотно состыковывать части языка воедино, чтобы он не был похож на мой стол. Предлагайте решения, разберём. ;D

иванов егор

Цитата: arseniiv от ноября  2, 2010, 18:37
Предлагайте решения, разберём. ;D
Ну, сделал же Вадимий грамматику, выпадающую случайно. Каждый раз другой состав падежей и чисел.

Bhudh

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

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр