Правдивая история о том, что происходило между выпуском версий
0.3.0 и версией 0.4.0
0) Версия 0.3.0 имела несколько недостатков:
1) Терялась структура текста. Из-за того, что терялось оформление (заголовки
и абзацы) в переведенном тексте было трудно ориентироваться. Что в
сочетании с невысоким качеством перевода затрудняло ручную правку текста.
2) Игнорировались знаки препинания
3) В английском языке стояла проблемма контекстного значения слов.
4) В английском принадлежности слова к части речи никак грамматически не
оформлено. Это значит, что слово может присутствовать в словаре как
(например) глагол, а в тексте это-же слово будет в роли существителього,
прилагательного или наречия. По-русски это надо адекватно выразить.
5) В Эсперанто стояла та-же проблемма "только в профиль". Словарь может
содержать слово с этим корнем, например глагол. А в тексте слово с тем же
корнем, но существительное. Разница лишь в том, что в Эсперанто мы точно
знаем требуемую часть речи.
Как мы боролись с этим своим счастьем
1) Проблемму со структурой мы решили более или менее успешно (то есть без шагов
в сторону) .
2) В языках есть знаки препинания. Эта проблемма тоже была "как-то" решена. Для
этого понадобилось всего-навсего:
0) Пройтись по нескольким учебникам английского и Эсперанто, и убедиться в
том, что учебники эту тему практически игнорируют.
1) Пройтись по имеющимся текстам, и самому составить правила употребления
знаков препинания (разумеется, не на 100% правильные).
2) Модернизировать ядро (раньше знаки препинания просто убивались).
3) Переписать файлы описания грамматики для английского и Эсперанто.
4) Ну, отладка - это само собой.
3) Бывает, что в словаре есть не то, слово, что в тексте, а родственное ему.
В русском языке тоже есть родственные слова. Но грамматические способы
выражения родственности (смысловой связи) очень разные. Например есть такие
смысловые пары "студент" - "студентка", "школьник" - "школьница", "король" -
"королева", "конь"-"лошадь". Видите, как по-разному образуется женский род?
Чтобы в такой ситуации правильно подбирать нужное русское слово мне
понадобился словарь русских смысловых связей. Ну, Вы представляете, сколько
времени требуется на составление такого словаря.
Дело кончилось тем, что эта работа была остановлена и законсервирована. Нет,
не потому, что мне надоело и я бросил. Я дошел почти до конца. Меня
остановили омонимы. Что такое "переделать" - это "сделат еще раз", или
"переделать всю работу"? Чтобы программа правильно работала, надо обозначить
все смыслы. В конце концов, я написал сам себе документацию, о том, что
достигнуто, и выключил этот кусок из программы. Остатки этого труда вы
можете видеть в файле semantika.cpp
Сейчас программа в таких случаях делает лишь "аналитический" перевод. То есть
она пишет "большой дом", а не "домище". Сложносоставные слова, такие как
"газопровод" сейчас просто проигнорированы.
Все эти проблеммы сейчас возложены на интерактивное формирование словаря. Ну
да, теперь программа справляется со всеми этими случаями и со множеством
других. Но она при этом требует вмешательства человека.
4) Бывает, что программа неправильно разбирается в структуре переводимой фразы.
В английском это случается часто, в Эсперанто реже. Хотелось сделать
"конструкор" фраз, с помощью которого можно собирать русскую фразу из
переведенных фрагментов - слов и словосочетаний.
Чтобы это работало, надо было как-то описать грамматику русского языка.
Причем описать не так, как для перевода. Компьютеру ведь все равно сколько
конструкций ему надо помнить. А человек не может работать более, чем с
десятью вариантами одновременно.
Дело кончилось тем, что и "конструктор фраз" и описание грамматики оказалось
ненужными. Человек формирует фразу последовательно. Для этого ему нужно
только уметь поставить переведенный кусок в нужный падеж.
5) Ну и по многочисленным просьбам программа стала юникодной. Юникод - это
отдельная песня. Во-первых прочитайте, что такое юникод. Это надо же было
так упростить! Во-вторых gcc и отладчик не понимают юникодных строк. Мне
пришлось извращаться, чтобы снаружи был юникод, а внутри все та-же
однобайтная кодировка. Ну да, внутри программы я использую представление
специальных символов как в Латехе. Иначе я отлаживаться не смогу.