Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > транслит латиница в русский


Автор: burakov 30.11.2009, 11:57
Добрый день, задумал
написать программку транслитерации, которая бы переводила 
текст набранный латиницей в русский. 

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

Смысл в следующем есть имена файлов (mp3 композиции), которые набраны латиницей - их нужно перевести в русский , но стандарт латиницы не соблюдается (так практически не используется знак апострофа для обозначения твердого и мягкого знаков - ну и наверное много всяких других неточностей)

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

ВОПРОС как подключить словарь (есть ли модули словарные какие то? или где вообще набор слов этих взять в текстовом виде, чтобы можно было хотя бы из текстового файла прочитать их и по сравнивать с имеющимся именем файла и его фрагментами) 

посоветуйте ??? с какого бока тут подойти, с чего начать???
Спасибо.

Автор: ginnie 30.11.2009, 13:41
burakov, можно посмотреть в сторону Text::Aspell. Найти русский словарь для aspell труда не составит.

Автор: DEER 30.11.2009, 15:19
Lingua::RU::PhTranslit
Lingua::Translit

вобще модулей всяких вроде много...

Автор: burakov 2.12.2009, 12:10
Добрый день,
что то понял, что то нет, но решил идти по следующему пути.

Скачал словарь словоформ сгенерированный из словаря ispell - размер 10Мбт.

и дальше пытаюсь изобрести каким образом привести "неверные" с точки зрения меня и словаря переводы из транслита в русские ...

делаю следующее...

Код

use strict; 
use warnings;
use Encode qw (encode decode); 

my $dic = 'win.full_dic'; 
my @dic = ();
my $str = undef;

open (FILE, $dic) or die;
while ($str = <FILE>) {
    $str =~ s/\n//g;
    push (@dic, $str); 
}
close (FILE); 

my $workdir = 'c:/111'; 
my @file = ();
my $file = undef;
opendir (DIR, $workdir) or die; 
while ($file = readdir (DIR)) {
    if ($file =~ /\.mp3$/) {
        $file =~ s/\.mp3$//;
        push (@file, $file); 
    }
}
closedir (DIR); 


my @str = ();
foreach $file (@file) {
    @str = (); 
    @str = split (' ', $file); 
    
    my $fragment = undef;
    foreach $fragment (@str) {
        
        foreach $str (@dic) {
            if ($fragment =~ /^$str$/) {
                print encode ('cp866', decode ('cp1251', $str."\n"));
            }
        }    
    }
}


но таким образом я нашел те фрагменты слова которые в словаре есть (собственно раз нашел те которые есть, значит теоретически нашел и те фрагменты имени файла, которых в словаре нет - пока в коде этого не отражено smile).

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


ПОНИМАЮ, что загрузил всех тут своими мыслями ВЫШЕ КРЫШИ, но 
вопрос - я вообще в том направлении думаю или изобретаю велосипед?

кроме того, такой вот метод перебора (когда словарь 10Мбт)
работает ОЧЕНЬ ДОЛГО.
на одно имя файла в том примере что привел я (а это просто печать найденных в словаре фрагментов имени файла - собственно маленькая часть задачи) уходит эдак секунд по 30.

А если файлов 2000 штук ??!! на ночь что ли комп оставлять??? smile

Спасибо.






Автор: ginnie 2.12.2009, 12:36
burakov, почему Вы не хотите использовать готовые решения? В Text::Aspell уже все сделано для Вас:

Код

    # check a word
    print $speller->check( $word )
          ? "$word found\n"
          : "$word not found!\n";

    # lookup up words
    my @suggestions = $speller->suggest( $misspelled );


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

Автор: burakov 2.12.2009, 13:52
Дело в том, что я не смог найти Text::Aspell для Windows
ну то есть, чтобы все это дело в ppd находилось

ну и кроме того непонятно (по аналогии c Lingua-Ispell-0.07 кроме Text::Aspell еще чего то нужно устанавливать?)
Lingua::Ispell.pm - a module encapsulating access to the Ispell program.

ginnie, не могли бы Вы подробнее объяснить чего откуда качать и как подключать...
у меня сейчас в наличии есть словарь от ispell (файлы lang.aff, lang.dict)
Будет ли он работать под Text::Aspell?

и есть ли версия Text::Aspell под windows?

Конечно хотелось бы воспользоваться готовым решением (тем более что про расстояние левенштейна я ничегошеньки не знаю) smile

Спасибо.

Автор: ginnie 2.12.2009, 14:04
burakov, по поводу установки Text::Aspell под Windows смотрите в http://cpansearch.perl.org/src/HANK/Text-Aspell-0.09/README специальный подраздел. Я сам этого не делал, поэтому практических советов по установке дать не могу.

Автор: mercenariess 8.9.2012, 23:51
Здравствузте уважаемые пользователи форума. У меня к вам есть вопрос. Сначало расскажу о своей проблеме. Я живу в Германии и у меня клавиатура немецкая и к ней я уже привык, но хотелось бы писать на моей клавиатуре по-русски. Т.е. чтобы текст при печатании в каком-либо документе или на сайте преобразовывался автоматически сразу в русский. На пример я если буду писать в чате например: Privet, kak dela? , текст печатался бы сразу же так: Привет, как дела? А то я устал транслировать текст на сайте www.translit.ru, а потом все копировать и вводить в то место, где я общаюсь.Заранее всем спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)