ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » обработка текста » поиск с учётом словоформ


поиск с учётом словоформ

Сообщений 1 страница 13 из 13

1

Санда и падежи

БудДен написал(а):

я знаю

Но что если посмотреть на ситуацию независимо?

Павиа сообщает о том, что есть библиотека иностранной разработки для отбрасывания окончаний слов. Эта библиотека внутри себя иностранным образом определяет внутренний язык. Ну, собственно, и что?

Внутри вводятся два понятия: слово и stem (я не знаю корректного русского перевода, потому что это не "основа слова" без "окончания"). Для русской реализации нужно опираться на работы российских лингвистов, и код написанный на русскоязычном языке программирования с кириллическим алфавитом.

Кроме того (т.е. кроме разницы в определениях, и кроме внесения вражеской зависимости),
задача, которую надо решить, состоит вовсе не в поиске по коду.

Задача заключается в том, чтобы предоставить пользователю возможность использовать слово в разных падежах в разных местах кода. Т.е. информация о падеже пропадать не должна, а должна быть доступна для движка анализа.

Отредактировано Лис (2021-03-31 19:37:24)

0

2

Внутри вводятся два понятия: слово и stem (я не знаю корректного русского перевода, потому что это не "основа слова" без "окончания"). Для русской реализации нужно опираться на работы российских лигвистов, и код написанный на русскоязычном языке программирования с кириллическим алфавитом.
...
Кроме того (т.е. кроме разицы в определениях, и кроме внесения вражеской зависимости),
задача, которую надо решить состоит вовсе не в поиске по коду.
...
Задача заключается в том, чтобы предоставить пользователю возможность использовать слово в разных падежах
в разных местах кода.

Это во многом можно даже в Обероне, например, тип может называться "задача", а процедура "создайЗадачу". И чтобы такой код можно было поддерживать,
нужно, чтобы можно было искать слово "задача" в любых формах. Если технологии, описанные Павиа, для этого подходят, то работы русских лингвистов не нужны, а кириллический ЯП у нас уже есть.

Т.е. информация о падеже пропадать не должна, а должна быть доступна для движка анализа.

Это полезно, но не строго обязательно. Я имею в виду, при моём подходе, когда мы стараемся поддерживать словоформы, но без фанатизма, и на смысл кода они не влияют. Без поиска по словоформам совсем уж туго. Чтобы сделать именно учёт падежей и их влияние на смысл кода, нужно менять язык программирования. Таких ресурсов у меня нет и не предвидится, скорее всего, никогда, если никто денег не даст, конечно. Даже если денег дадут, то разработка ЯП - это отдельное, длительное и очень рискованное мероприятие. Т.е. это должна быть боковая ветка разработки, и не в коем случае не один из её этапов. Введение разработки ЯП как этапа отодвигает завершение проекта лет на 10 вперёд. Сейчас в мире всё гораздо быстрее крутится. Даже просто сделать перевод A2 - это проект, безнадёжно отстающий от времени.

Отредактировано БудДен (2021-03-31 19:39:37)

0

3

БудДен написал(а):

Это во многом можно даже в Обероне

Ссылку на место в спецификации Оберона, в которой говорится про русские падежи, не подскажешь?

БудДен написал(а):

должна быть боковая ветка разработки, и не в коем случае не один из её этапов. Введение разработки ЯП как этапа отодвигает завершение проекта лет на 10 вперёд. Сейчас в мире всё гораздо быстрее крутится.

Это аргументация для твоего личного проекта. В общем случае она негодная.

Отредактировано Лис (2021-03-31 19:52:31)

0

4

Лис написал(а):

Задача заключается в том, чтобы предоставить пользователю возможность использовать слово в разных падежах в разных местах кода. Т.е. информация о падеже пропадать не должна, а должна быть доступна для движка анализа.

В англоязычных ЯП жесткий порядок параметров, если его оставить, добавив падежи, они будут лишь синтаксическим сахаром, а должны нести вполне определенные возможности.

Лис написал(а):

есть библиотека иностранной разработки для отбрасывания окончаний слов.

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

БудДен написал(а):

Чтобы сделать именно учёт падежей и их влияние на смысл кода, нужно менять язык программирования.

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

Отредактировано MihalNik (2021-04-01 00:42:40)

0

5

Вот программа вычисления простых чисел
в реальном интерпретаторе РЯП первой версии:

Код:
число равно 3
конец равно 55
начало
 цикл равно число делить 2
 округлить цикл
 простое равно 1

 начало
  цикл2 равно цикл плюс 1
  остаток0 равно число модуль цикл2
  остаток равно остаток0
  линверт остаток

  если остаток
  простое равно 0

  цикл равно цикл минус 1
  если остаток
  цикл равно 0
 цикл цикл

 если простое
 показать число

 число равно число плюс 2
 конец равно конец минус 1
цикл конец

А вот так я перевёл этот код
на воображаемый РЯП с падежами:

Код:
число   равно   трём
конец   равен   пятидесяти пяти
начинаем цикл
 цикл   равен   числу делённому на два
 округлить цикл
 простое число   равно   единице

    начало цикла   проверки делимости числа
     цикл2   равен   цикл плюс один
     остаток0   равен   число по модулю цикл2
     остаток   равен   остаток0
     инвертировать   остаток

     если остаток   то простое число равно нулю

     цикл декремент
     если остаток   то цикл обнулить
    конец цикла

 если простое   то показать число

 число инкремент
 инкремент число
 конец декремент
цикл конец

Можно заметить некоторые нюансы:

1) "начинаем цикл" и "начало цикл" это одно и то же.

2) главное не перепутать строку "конец цикла",
которой завершается внутренний цикл,
со строкой "цикл конец",
которой завершается внешний цикл.

3) переменную "простое число" в первой версии можно писать с пробелом.

4) строка условия "если остаток   то цикл обнулить" уже записана в одну строку,
а в первой версии можно писать лишь двумя строками.
Если записать одной строкой, то фокус не удастся (факир был пьян).

5) строки "число инкремент" и "инкремент число" выполняют одно и то же действие.

Что скажет уважаемая публика?
Насколько далеко (глубоко?) можно упасть в кроличью нору?

0

6

NuShaman написал(а):

Вот программа вычисления простых чисел

Мое замечание не совсем по теме, но я бы для такого ЯП выбрал более подходящий пример. Записывать в текстовой форме математические операции в школе не учат. Второй вариант с падежами выглядит понятнее первого, но к стыду своему вынужден признать, что без чтения описания языка я не понял, что там закодировано. Похоже на проверку ряда методом перебора делителей, но смутило деление пополам вместо квадратного корня. На всякий случай накидал наивный вариант по Эратосфену на диалекте Рефал-5 (язык не ориентирован на вычисления, однако позволяет свести задачу к обработке последовательностей, таким образом "навязывая" более эффективное решение).

Код:
#!/bin/refal -w

начало = <натуральные <решето (<ряд от 2 до 10000>)>>;

решето {
  (0    …) = 0    <решето (…)>;
  (?шаг …) = ?шаг <решето (<кратные ?шаг ?шаг (…)>)>; 
  () = ;
}

кратные {
  ?шаг 1     (? .вход) .выход  = <кратные ?шаг ?шаг        (.вход) .выход 0>;
  ?шаг ?счёт (? .вход) .выход  = <кратные ?шаг <?счёт - 1> (.вход) .выход ?>;
  … () .готово = .готово;
}

ряд {
  от ?    до ?     .ряд = .ряд ?;
  от ?мин до ?макс .ряд = <ряд от <1 + ?мин> до ?макс .ряд ?мин>;
}

натуральные {
  0 … =   <натуральные …>;
  ? … = ? <натуральные …>;
  = ;
}

Отредактировано С.Т. (2021-04-03 06:07:18)

0

7

С.Т. написал(а):

Похоже на проверку ряда методом перебора делителей, но смутило деление пополам вместо квадратного корня.

Вычислять квадратный корень - слишком муторно,
поэтому использовал деление пополам.

С.Т. написал(а):

вариант по Эратосфену

В сегодняшнем интерпретаторе РЯП
нет механизма массивов,
а я смею предположить,
что алгоритм решета Эратосфена не реализовать без массивов,
поэтому решето Эратосфена не реализовать в сегодняшнем РЯП.

Вы написали интересный код.
На странице
http://www.botik.ru/pub/local/scp/refal5/refal5.html
я скачал программу
Version PZ executables for Windows NT/2000/XP ( 233Kb ). Last updated 29.10.2004.

Я могу запустить его под Windows с русскими словами?
Или этот код придется переводить на английский язык?

0

8

NuShaman написал(а):

В сегодняшнем интерпретаторе РЯП
нет механизма массивов,
а я смею предположить,
что алгоритм решета Эратосфена не реализовать без массивов,

В Рефале нет массивов. Функция получает на вход последовательность (т.н. Поле Зрения), далее происходит попытка сопоставить её с образцом (левая часть, до знака =). Если сопоставление успешно, формируется результат (правой частью, после знака =). Иначе повторяется для следующего предложения и т.п. Язык разрабатывался как раз для решения задач из названия темы.

NuShaman написал(а):

я скачал программу
Version PZ executables for Windows NT/2000/XP ( 233Kb ). Last updated 29.10.2004.

Я могу запустить его под Windows с русскими словами?
Или этот код придется переводить на английский язык?

Придётся переводить. Помимо ограничений на имена идентификаторов есть и другие отличия. В классическом Рефал-5 тип переменных (это не "целое" или "строка", как обычно, а количество вмещаемых переменной символов) определяется буквенным префиксом. Прежде всего, придётся заменить . и на e. а ? на s.
Плюс поле зрения у меня выводится "само", без функции Prout. Вот готовый вариант:

Код:
* Refal5-PZ & Refal-05 compatible

$EXTERN Add, Sub; 

* syntactic sugar
*$ENUM From, To;

$ENTRY Go {
  = <Prout <Naturals <Sieve (<Series From 2 To 10000>)>>>;
}

Sieve {
  (0      e.Tail) = 0      <Sieve (e.Tail)>;
  (s.Mesh e.Tail) = s.Mesh <Sieve (<Aliquots s.Mesh s.Mesh (e.Tail)>)>; 
  () = ;
}

Aliquots {
  s.Mesh 1     (s.Cur e.In) e.Out = <Aliquots s.Mesh s.Mesh        (e.In) e.Out 0>;
  s.Mesh s.Cnt (s.Cur e.In) e.Out = <Aliquots s.Mesh <Sub s.Cnt 1> (e.In) e.Out s.Cur>;
  e.Stuff () e.Result = e.Result;
}

Series {
  From s.End To s.End e.Series = e.Series s.End;
  From s.Min To s.Max e.Series = <Series From <Add 1 s.Min> To s.Max e.Series s.Min>;
}

Naturals {
  0         e.Tail = <Naturals e.Tail>;
  s.Natural e.Tail = s.Natural <Naturals e.Tail>;
  = ;
}

Учтите, что транслятор Турчина (4,6 сек *) не развивается. Если заинтересовал язык, стоит обратить внимание на живые проекты Рефала-5λ (3,5 сек *) и лёгкий компилятор Refal-05 (4,6 сек *) того же автора. Правда, мой интерпретатор (включая трансляцию, 1,1 сек *) почему-то их обогнал. Если есть к нему интерес и он не запускается в WSL, могу попробовать адаптировать его под WinNT (но быстро не обещаю, немного отвык от той ОС).

*) время выполнения Решета на Ryzen 3,7ГГц

Отредактировано С.Т. (2021-04-05 13:31:51)

0

9

С.Т. написал(а):

и он не запускается в WSL, могу попробовать адаптировать его под WinNT

Мне нужен EXE-файл (интерпретатор или компилятор РЕФАЛа)
для любой Windows,
желательно для десятки.
И, разумеется, чтобы Ваш код решета Эратосфена,
написанный на русском языке,
выполнялся в нём.

Отредактировано NuShaman (2021-04-05 14:28:24)

0

10

С.Т. написал(а):

В Рефале нет массивов.

Рек. вызов функций делает это неявно.

0

11

NuShaman написал(а):

Мне нужен EXE-файл (интерпретатор или компилятор РЕФАЛа)
для любой Windows,
желательно для десятки.

Подсистема Linux позволяет запускать ELF-файлы. ELF может иметь произвольное расширение, в т.ч. .exe. Если же нужен "родной" для подсистемы Win32 файл Portable Executable, то в интерпретаторе использование библиотечных функций языка Си сведено к минимуму, он взаимодействует с ОС по возможности без лишних прослоек. Потому придётся среди прочего реализовать mremap(). В том же Cygwin это почему-то не сделано; значит реализацию на MapViewOfFileEx() желательно гонять не в WinE, а в живой системе, которую я удалил волевым решением 7 лет назад. Либо завязаться на CRT, тогда как Лис уже почти убедил меня отказаться от её остатков.

MihalNik написал(а):

Рек. вызов функций делает это неявно.

Здесь имеется ввиду эквивалентность по Чёрчу-Тьюрингу. Реализованные в Рефале нормальные алгорифмы Маркова действительно позволяют делать неявно императивные вычисления. Отсюда следует интересный вывод: что бы называть ЯП русским, не обязательно переводить основанную на модели английского математика формализацию алгоритмов на кириллицу, достаточно использовать НАМ,

0

12

С.Т. написал(а):

достаточно использовать НАМ,

предложение оборвалось, не завершившись,
а хочется интригующего продолжения :)

0

13

Там не было продолжения. Мысль вполне логически закончена, НАМ это акроним для словосочетания "нормальные алгорифмы Маркова", а запятая вместо точки это просто опечатка (они рядом на клавиатуре).

0


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » обработка текста » поиск с учётом словоформ