Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите Ускорить Замену текста 
:(
    Опции темы
paulvasykov
  Дата 17.9.2007, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.9.2007

Репутация: нет
Всего: нет



Код

$stsen[0] = текстовой файл.(около 7mb)
$verb[1] = 'advertise'; #Существительное, или что там....

$stsen[0] =~s/ $verb[1] / \[verb\] /gi;
$stsen[0] =~s/ $verb[1]s / \[verb\]s /gi;
$stsen[0] =~s/ $verb[1]ing / \[verb\]ing /gi;
$stsen[0] =~s/ $verb[1]es / \[verb\]es /gi;
$stsen[0] =~s/ $verb[1]ed / \[verb\]ed /gi;
$stsen[0] =~s/ $verb[1]d / \[verb\]d /gi;
$stsen[0] =~s/ $verb[1]er / \[naon\] /gi;


Выполняеться это дело на winXP до 900секунд.
Я пробовал так, но чтото не то. 
Код

$stsen[0] =~s/ $verb[1] | $verb[1]s / \[verb\] |[verb\]s /gi;
...

PM MAIL   Вверх
amg
Дата 17.9.2007, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Вот так попробуй, может, будет лучше.
Код

%verb = (
advertise => {''  => '[verb]', 
              s   => '[verb]s', 
              ing => '[verb]ing', 
              es  => '[verb]es', 
              ed  => '[verb]ed', 
              d   => '[verb]d', 
              er  => '[noun]'},
);
my $stsen = '';
while ($stsen[0] =~ /\b(\w+)\b/g) {
  my $word = $1;
  foreach (keys %verb) {
    if ($word =~ /^$_(.*)/i) {
      $word = $verb{$_}{$1};
      last;
    }
  }
  $stsen .= "$word ";
}
$stsen[0] = $stsen;
А вообще, существуют специальные программы (тэггеры), которые примерно такую работу делают.

PM MAIL   Вверх
Nab
Дата 17.9.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Ну во первых я считаю что обрабатывать файл нужно построчно, а не весь сразу, во вторых думаю поможет ключик /o.
И в третьих вот мой приблизительный вариант:

Код

s/ $verb[1](s|ing|es|ed|d|er)? / ($1 and $1 eq 'er')?'[naon]':('[verb]'.($1||'')) /ogie;


Это конечно если я задачу понял правильно...

Лучше приведите кусок файла и примерный результат, а то я даж не знаю на чем протестить, и верно ли я понял задачу :(


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
paulvasykov
Дата 17.9.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.9.2007

Репутация: нет
Всего: нет



Вот полный код с загрузкой 

Код

open (SINPUT,$fdir."text01.txt");
$stsen[0] = join("\n",<SINPUT>);
close(SINPUT);

$stsen[0] =~s/\./ \./gi;
$stsen[0] =~s/,/ ,/gi;
$stsen[0] =~s/\!/ \!/gi;
$stsen[0] =~s/\?/ \?/gi; 

open (VFILE,$fdir."vrb.txt");
while ($verb[0] = <VFILE>){
 $verb[1] = Funct::trim($verb[0]);
 $stsen[0] =~s/ $verb[1] / \[verb\] /gi;
 $stsen[0] =~s/ $verb[1]s / \[verb\]s /gi;
 $stsen[0] =~s/ $verb[1]ing / \[verb\]ing /gi;
 $stsen[0] =~s/ $verb[1]es / \[verb\]es /gi;
 $stsen[0] =~s/ $verb[1]ed / \[verb\]ed /gi;
 $stsen[0] =~s/ $verb[1]d / \[verb\]d /gi;
 $stsen[0] =~s/ $verb[1]er / \[naon\] /gi;
}

Должен получиться шаблон вида : 
...and was [verb]d well  .You might ....
...professionals to [verb]ing web sites...
тоесть вместо сущ вписать [сущ] и окончание ing,es, если есть.

to nab:
Работает быстрее на 1 сек для 1 verb.
Перед словом должен стоять пробел, т.к. заменяет также и в середине слова: (mee[verb]s)?.

Пример text01.txt :
In today's busy world the internet is a major necessity when it comes to doing business. 
Especially for large corporations. 
Many times, most corporations have affiliate business partners over seas and have to hold conferences, board meetings, etc. 
Many times the meeting needs to be held in a timespan that is not conducive to traveling half way around the globe. 
By using a web conference call service you save big bucks on the cost of air travel. 

Пример verb.txt :

Это сообщение отредактировал(а) paulvasykov - 17.9.2007, 15:19

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  vrb.zip 8,91 Kb
PM MAIL   Вверх
vadiml
Дата 17.9.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



Может лучше вместо  добавления кучи пробелов отслеживать начало и конец слова?
думаю здесь можно использовать \b
т.е. выкинуть
$stsen[0] =~s/\./ \./gi; 
и написать
$stsen[0] =~s/\b$verb[1]\b/\[verb\]/gi;
$stsen[0] =~s/\b$verb[1]s\b/\[verb\]s/gi;

ЗЫ посмотрите Программирование на Perl Ларри Уолла, гл5 Поиск по шаблону, Границы: утверждения \b и \B

Nab
Весьма часто несколько простых шаблонов работают гораздо быстрее 1-го сложного.
Здесь главный тормоз процесса -- подстановка $verb[1] на этапе исполнения, что сводит на нет предкомпиляцию.


PM MAIL Jabber   Вверх
Nab
Дата 18.9.2007, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



То что нужно использовать \b еще amg, в своем ответе показал, просто paulvasykov, не внимательно ответы читает :(

Цитата(vadiml @  17.9.2007,  22:40 Найти цитируемый пост)
NabВесьма часто несколько простых шаблонов работают гораздо быстрее 1-го сложного.Здесь главный тормоз процесса -- подстановка $verb[1] на этапе исполнения, что сводит на нет предкомпиляцию.


Да я знаю smile

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

Код

$suffixes = qr((s|ing|es|ed|d|er);


Также непонятно зачем используеться массив, вместо простых скаляров?
И последнее, я когда говорил что читать построчно, то имел ввиду текстовые файлы, а не словарь... 
Словари нужно по возможности хранить в памяти... Я понимаю что операционка их скорее всего закеширует сама, но уверенности нет, поэтому этот вопрос тоже нужно продумать...






--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 18.9.2007, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



paulvasykov, все же поищи в интернете! Сделать хороший тэггер (программу, определяющую часть речи слов в предложении) - сложно, это тянет на диссертационную работу. И тэггеров для английского языка много, есть и свободные, например, CRFTaggerLingua::BrillTagger.

Если очень хочется самому, то можно попробовать использовать тот факт, что в обычном литературном тексте уникальных слов не очень много. Если у тебя 7 М текста (сочиненного человеком, а не функцией rand) то в нем порядка миллиона слов, а уникальных - ну, скажем, 10 тыс. И если слово уже встречалось, то можно не прогонять его через словарь, а взять уже готовый результат (твой же "тэггер" не контекстно зависимый?). Вот скрипт, реализующий это:
Код

open (VFILE,$fdir."vrb.txt") or die $!;
while (<VFILE>){
  my $verb = Funct::trim($_); # Эта функция отрезает окончания?
  $h{$verb}++ || push @verb, $verb; # Массив без повторов
}
close VFILE;
undef %h;

%ending = (''  => '[verb]', 
           s   => '[verb]s', 
           ing => '[verb]ing', 
           es  => '[verb]es', 
           ed  => '[verb]ed', 
           d   => '[verb]d', 
           er  => '[noun]',
);

open (SINPUT,$fdir."text01.txt") or die $!;
while (<SINPUT>) {
  my $stsen = '';
  while (m/\b(\w+)\b/g) {
    my $word = $1;
    if (exists $h{$word}) {
      $word = $h{$word};
    }
    else {
      foreach $verb (@verb) {
        if ($word =~ /^$verb(.*)/ and exists $ending{$1}) {
          $h{$word} = $ending{$1};
          $word = $ending{$1};
          last;
        }
      }
      $h{$word} = $word unless exists $h{$word};
    }
    $stsen .= "$word ";
  }
  print "$stsen\n";
}
close(SINPUT);
Конечно, на маленьком тексте этот скрипт будет работать гораздо медленнее, чем твой, но на большом, может, будет выигрыш.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0826 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.