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

Давайте. Переводчик. Моно.

Автор Алексей Гринь, мая 7, 2010, 19:03

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

Алексей Гринь

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

Для начала предлагаю Эсперанто<=>Русский.
肏! Τίς πέπορδε;

Алексей Гринь

Допустим, так:

Цитироватьusing System;

namespace Lingvoforum.Language
{
    public enum Case
    {
        Abessive,
        Ablative,
        Absolutive,
        Accusative,
        Addirective,
        Adelative,
        Adessive,
        Adverbial,
        Antessive,
        Associative,
        Aversive,
        Benefactive,
        Caritive,
        Causal,
        CausalFinal,
        Comitative,
        Comparative,
        Dative,
        Direct,
        Distributive,
        DistributiveTemporal,
        Equative,
        Ergative,
        Essive,
        EssiveFormal,
        EssiveModal,
        Evitative,
        Final,
        Formal,
        Genitive,
        Inessive,
        Instructive,
        Instrumental,
        InstrumentalComitative,
        Intransitive,
        Intrative,
        Modal,
        Multiplicative,
        Nominative,
        Oblique,
        Ornative,
        Partitive,
        Pegative,
        Pertingent,
        Possessive,
        Postdirective,
        Postelative,
        Postessive,
        Postpositional,
        Prepositional,
        Privative,
        Prolative,
        Prosecutive,
        Proximative,
        Separative,
        Sociative,
        Subdirective,
        Sublative,
        Temporal,
        Terminative,
        Translative,
        Vialis,
        Vocative
    }
}
肏! Τίς πέπορδε;

Demetrius

Ы-ы-ы-ы-ы... Вы уверены, что обязательно все языки так описывать?

А вообще, я с C# очень плохо знаком.

Алексей Гринь

И ещё:


Цитировать
    public enum Number
    {
        None,
        Singular,
        Dual,
        Plural
    }


    public enum Gender
    {
        None,
        Masculine,
        Feminine,
        Neuter
    }

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

Цитата: Demetrius от мая  7, 2010, 19:40
Ы-ы-ы-ы-ы... Вы уверены, что обязательно все языки так описывать?

А вообще, я с C# очень плохо знаком.
Да, я именно хочу библиотеку, чтобы играться с языками. Чтобы можно было одно к другому лихо прикручивать.

Цитата: Demetrius от мая  7, 2010, 19:40
А вообще, я с C# очень плохо знаком.
Учиться, учиться и ещё раз учиться! Моно можно компилить в натив (тогда рантайм не нужен), и там хорошая поддержка строк (самое главное-то), поэтому решение принято окончательное.
肏! Τίς πέπορδε;

Алексей Гринь

Обязательно промежуточное представление какое-то. Что это может быть?

Ближе к "байткоду" или к "синтаксическим деревьям"?
肏! Τίς πέπορδε;

Алексей Гринь

Цитата: Demetrius от мая  7, 2010, 19:40
Ы-ы-ы-ы-ы... Вы уверены, что обязательно все языки так описывать?
Падежи например русского языка жутко полисемичны (генитив это ещё и партитив, к примеру). И это сложно сохранить «в уме». Поэтому было бы хорошо, если бы при трансляции можно было бы русское «налей воды» однозначно определить как партитив, потому что в других языках партитив может реализовываться иначе, нежели генитив. Поэтому нужно включить как можно больше специализированных падежей всяких-разных.
Т.е. семантически используется весь набор, а вот морфологически только 6 (касательно русского).
肏! Τίς πέπορδε;

Demetrius

Тогда уж:
Цитировать
    public enum Number
    {
        None,
        Singular,
        Dual,
        Trial,
        Quadral, //вроде бы нигде нет, но конлангеров не обижаем
        Paucal,
        GreaterPaucal,
        Plural,
        DistributivePlural
    }

Цитата: Алексей Гринь
    public enum Gender
    {
        None,
        Masculine,
        Feminine,
        Neuter
    }

А как же:
Цитата: Википедия(wiki/en) Grammatical_gender#Australian_Aboriginal_languages
I — animate objects, men
II — women, water, fire, violence
III — edible fruit and vegetables
IV — miscellaneous (includes things not classifiable in the first three)
IMHO роды вообще стоит делать цифрами.

Цитата: Алексей Гринь от мая  7, 2010, 19:42
Архитектуру думать надо. По уму у нас есть базовые обобщённые классы для существительных, прилагательных, и т. д. и каждый язык в собственных сборках должен реализовывать их сам. Чем лучше делать - интерфейсами или наследуемыми родителями?
Не знаю. Я вообще проектировать программы нормально не умею. :-[

Цитата: Алексей Гринь от мая  7, 2010, 19:51
Падежи например русского языка жутко полисемичны (генитив это ещё и партитив, к примеру). И это сложно сохранить «в уме». Поэтому было бы хорошо, если бы при трансляции можно было бы русское «налей воды» однозначно определить как партитив, потому что в других языках партитив может реализовываться иначе, нежели генитив. Поэтому нужно включить как можно больше специализированных падежей всяких-разных.
Т.е. семантически используется весь набор, а вот морфологически только 6 (касательно русского).
Может, тогда оставить для морфологических категорий нумерацию?

Цитата: Алексей Гринь от мая  7, 2010, 19:46
Ближе к "байткоду" или к "синтаксическим деревьям"?
Байткод? Никогда о нём не думал...

Байткод — это типа хомская ядерная структура? Или как?


По мере возможностей, я участвую. Но C# я-таки плохо знаю.

Алексей Гринь

Цитата: Demetrius от мая  7, 2010, 19:58
Тогда уж:
Добавил.

Цитата: Demetrius от мая  7, 2010, 19:58
как же:
Цитата: Википедия
Цитировать(wiki/en) Grammatical_gender#Australian_Aboriginal_languages
I — animate objects, men
II — women, water, fire, violence
III — edible fruit and vegetables
IV — miscellaneous (includes things not classifiable in the first three)
IMHO роды вообще стоит делать цифрами.
Точно. Про африканские/австралийские забыл. Род правильно назвать было бы не родом, а классом, наверное. Хотя была бы путаница с понятием класс в программировании... В общем, род пусть будет. :)
Так вот, в отношении слишком специфичных родов, которые не обобщаются, надо думать. Точно не перечислениями. Какой-то механизм расширения... Хм...

Цитата: Demetrius от мая  7, 2010, 19:58
IMHO роды вообще стоит делать цифрами.
Тогда нельзя будет легко состыковать два языка, придётся писать мап-таблицы для каждой пары самостоятельно... А моя идея в том, что рантайм сам разрешает языковые соответствия и можно комбинировать Китайский > Татарский, Чукотский > Идо и т. д. без каких-либо усилий.

Цитата: Demetrius от мая  7, 2010, 19:58
Может, тогда оставить для морфологических категорий нумерацию?
Не, это только запутает. Потом распишу идею подробнее.

Цитата: Demetrius от мая  7, 2010, 19:58
Байткод? Никогда о нём не думал...

Байткод — это типа хомская ядерная структура? Или как?
Да не обязательно все эти теоретические изыски, просто некоторый вспомогательный язык (можно сказать, конланг), который бы легко парсился и был недвусмысленен.

Цитата: Demetrius от мая  7, 2010, 19:58
Не знаю. Я вообще проектировать программы нормально не умею. :-[
Тогда я пойду есть.
肏! Τίς πέπορδε;

myst

:??? Что-то ты не с того начал... Надо с алгоритма перевода начинать, мне кажется. Что будет в основе, статистика, словари или ещё что?

Алексей Гринь

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

Цитата: myst от мая  7, 2010, 20:12
Что будет в основе, статистика, словари или ещё что?
В идеале — wiki-словарь.
肏! Τίς πέπορδε;

Demetrius

Цитата: Алексей Гринь от мая  7, 2010, 20:10
Тогда нельзя будет легко состыковать два языка, придётся писать мап-таблицы для каждой пары самостоятельно... А моя идея в том, что рантайм сам разрешает языковые соответствия и можно комбинировать Китайский > Татарский, Чукотский > Идо и т. д. без каких-либо усилий.
Так проблема в том, что род иногда обозначает вполне реальные вещи, а иногда это просто морфологическая характеристика, которую в переводе и не надо передавать.


Цитата: Алексей Гринь от мая  7, 2010, 20:10
Да не обязательно все эти теоретические изыски, просто некоторый вспомогательный язык (можно сказать, конланг), который бы легко парсился и был недвусмысленен.
Интересно. И как это будет выглядеть?
«Я–номинатив мгновенье1–аккузатив помнить–прошлое, мгновенье1 чудное, ты–женский-род я–фиг-знает-что-за-падежив явиться–прошлое». Так?


Demetrius

Цитата: myst от мая  7, 2010, 20:35
Цитата: Алексей Гринь от мая  7, 2010, 20:17
В идеале — wiki-словарь.
Так он же для человека. :o
По-моему, Алексей имел в виду не Wiktionary, а просто любой словарь на основе технологии вики. Или я не прав?

arseniiv


Demetrius


злой

Может, еще прикрутить состав слова и флексии для полного счастья?

Entre los individuos, como entre las naciones, el respeto al derecho ajeno es la paz.   - Benito Juárez

arseniiv

Построение такого переводчика. Буду очень радоваться, когда что-нибудь получится работающее. :) Верю пока в возможность его создания.

Michael Glazunov

Цитата: Алексей Гринь от мая  7, 2010, 19:03
Давайте забацаем свой переводчик. Хочу хитрое ядро, чтобы можно было легко втыкать языки. Хочу контексто-зависимый перевод.

Так это же очень на идею языка-посредника похоже. Было много копий сломано, но мысль манит как магнит, согласен   ;up:

Надо бы тогда начать с того, что же такое словоформа и морфема раз уж что-то универсальное затеяли. Как будем проводить первый этап обработки - токенизацию? Ведь в русском и многих других есть пробелы, что отчасти облегчает эту процедуру, но в китайском, японском и многих других все пишется слитно. Я уже молчу про маргинальные случаи вроде чукотского, где совсем непонятно, что словоформа, а что морфема и как выделять эти единицы? Или полагаться будем на готовые NLP решения вроде Python'вского NLTK?  :-\


Demetrius

Цитата: Michael Glazunov от мая  8, 2010, 21:55
Надо бы тогда начать с того, что же такое словоформа и морфема раз уж что-то универсальное затеяли. Как будем проводить первый этап обработки - токенизацию? Ведь в русском и многих других есть пробелы, что отчасти облегчает эту процедуру, но в китайском, японском и многих других все пишется слитно.
Ну, тут всё сравнительно просто. Для каждого языка будет свой модуль, который и будет дробить текст на слова и возвращать его в промежуточном представлении. Хотя с чукотским, конечно, будет сложно.

Насколько я понял, идея была такая: вся информация из служебных слов переносится в смысловые. То есть, если там было «весной на деревьях цветут цветы», то в промежуточном представлении будет «весна-Temporal дерево-Locative,pl цвести-... цветы-Nominative-pl». То есть, если я правильно понимаю идею, сохраняться только значимые слова.

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


HackOnnerDib

Хм. С си шарп тоже не знаком, так как пишу на си++ :). Хотя это, в принципе, одно и то же.
Какая моя идея: не надо конвертировать исходную фразу в так называемый "машинный язык", или "язык-посредник".
Нужно определить, от какого слова к какому задается вопрос, а потом переводить предложение "на ходу".
То есть надо выделять окончания, суффиксы, анализировать и т.д. Такое написать удобнее на Лиспе(Lisp), нежели на си шарп(C#) и си++(C++).
А если вы решили создать МУЛЬТИЯЗЫКОВОЙ переводчик, то есть не только русский <=> эсперанто, то лучше сделать этим "посреднеческим" языком сам эсперанто.Не выдумывать старое, а взять самый легкий из естесственных(а так же плановых и искусственных) языков.
Esperu ĉiam!
Говори, что думаешь и думай, что говоришь! ©
Кто я такой: //www.hackonnerdib.info

arseniiv

Offtop
Умеют ли люди читать тему до написания своего сообщения?.. :???

Алексей Гринь

Эх, пока особо времени нету. Посмотрим, как станется.

Цитата: arseniiv от мая  7, 2010, 20:57
Боюсь я, что это никогда не закончится...
Тьфу-тьфу!

Цитата: Demetrius от мая 10, 2010, 14:13
Правда, я всё равно слабюо представляю, что делать со всеми этими падежами. Некоторые из них очень даже дублируют друг друга.
Например?

Цитата: HackOnnerDib от мая 15, 2010, 13:14
Нужно определить, от какого слова к какому задается вопрос, а потом переводить предложение "на ходу".
Ага, и получится Джон Баптист вместо Иоанна Крестителя...
肏! Τίς πέπορδε;

Алексей Гринь

Пока разбираюсь с общим устройством, до самого парсинга текста далеко ещё...

В общем, есть абстрактные классы Language, Alphabet, которые должны реализовываться конкретными языками, в данном случае это пока RussianLanguage и RussianAlphabet.

Alphabet это объект, который содержит инфорацию о текущем алфавите. Есть такие методы у него:


        public abstract bool IsCharacter(char c);
        public abstract bool IsLetter(char c);
        public abstract bool IsPunctuation(char c);
        public abstract bool IsDigit(char c);


1) Он существует для валидации текста при токенизации. Т.е. "родные" слова переводятся, а внеалфавитные токены игнорируются и оставляются как есть.
2) Я не нашёл, можно ли с помощью встроенного CultureInfo "вытащить" набор символов внутри языка (на //stackoverflow.com говорят, что низзя), поэтому набор символов инициализируется вручную (обычные массивы чаров). Для языков типа русского это просто, для всяких китайских надо думать (наверное, просто читать с базы). Да и моно не факт, что поддерживает все возможные языки, лучше самим всё делать.
3) Встроенные .NET'овские char.IsDigit, char.IsLetter работают сразу на весь уникод, они не учитывают конкретно взятый алфавит. По крайней мере, я не нашёл иных способов. Кто знает, если можно - укажите. Т.е. для русского языка (сделано через поиск во вручную инициализируемом массиве):


var lang = RussianLanguage.GetLanguage();
Console.WriteLine(lang.Alphabet.IsDigit('२'));


напечатает False, а встроенное


Console.WriteLine(char.IsDigit('२'));


напечатает True, и язык ограничить никак нельзя (२ это число деванагари, а нам-то нужны только русские числа). Причём он такой интересный, не рассматривает китайское 三 как число. Не знаю, может, так прописано в Уникоде...
Поэтому, в общем, приходится велосипедить и индусить.

4) Языки инициализируются с аргументом (string kind), а "сорта" могут иметь разные алфавиты. Т.е. допустим для сербского можно было бы написать так:


var lang = SerbianLanguage.GetLanguage("Latin");


Тогда lang.Alphabet возвращал бы объект класса что-то типа SerbianLatinAlphabet (закастенное в просто Alphabet).

5) Что насчёт суррогатных пар? Суррогатные пары невыражаемы одним char'ом, тут уже нужны string'и. Как делают валидацию в этом случае?
肏! Τίς πέπορδε;

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

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

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

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

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