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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сравнение файлов, странный результат 
:(
    Опции темы
amg
Дата 29.1.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



LisaST, во-первых, у меня была дурацкая ошибка в скрипте tag-uni. Исправил (см. соответствующий пост); во-вторых, была небольшая ошибка в tag-norm (исправил, см. там же). И наконец, скрипт, подсчитывающий в нормализованных файлах Recall & Precision. Его нужно проверять, не напутал ли я чего. Успехов!
Код

# tag-count: Recall & Precision for two normalize tagged files
# (see http://forum.vingrad.ru/topic-131764/45.html#)

$freq = 1;

$gold=shift and $tagg=shift or die "Usage: $0 gold.pos tagger.pos\n";

open GOLD, $gold or die "Can't open $gold: $!\n";
open TAGG, $tagg or die "Can't open $tagg: $!\n";

$print = 0;
print "tag=N/Recall/Precision  Print after every $freq strings\n";
while (defined($sgold = <GOLD>) and defined($stagg = <TAGG>)) {

  @agold = $sgold=~/\S+\/(\S+)/g;
  @atagg = $stagg=~/\S+\/(\S+)/g;
  die "Inconsistent files\n" if $#agold != $#atagg;
  #print "@agold\n@atagg\n";
  while (@agold and @atagg) {
    $tgold = shift @agold;
    $ttagg = shift @atagg;
    $N{$ttagg}++ if $ttagg eq $tgold;
    $NT{$ttagg}++;
    $NG{$tgold}++;
    
  }
  $print++;
  if ($print == $freq or eof(GOLD)) {
    foreach (sort keys %N) {
      printf "%s=%d/%.2f/%.2f  ", $_,$N{$_},$N{$_}/$NT{$_}*100,$N{$_}/$NG{$_}*100;
    }
    print "\n";
    $print = 0;
  }
}
close GOLD; close TAGG;


PM MAIL   Вверх
Zuzu
Дата 29.1.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



amg, пара замечанияй по последнему фрагменту. Так мелкие придирки...

Код

foreach (sort keys %N) {


Понятие "релевантность" - самое сильное из числа "найдено тэггером", "найдено goldStandart" и "найдено тэггером релевантных". Т.е. потенциально существует вероятность, что релевантных слов просто не будет для определенного типа. Вероятность небольшая (на большом тексте), но она есть. Проблема решается путем создания "множества типов слова" или T.  

Код

my %T;    # множество типов слов
    ...
    $tgold = shift @agold;
    $ttagg = shift @atagg;
    $N{$ttagg}++ if $ttagg eq $tgold;
    $NT{$ttagg}++;
    $NG{$tgold}++;
    #
    $T{$tgold} = 1;     # есть такой тип !
    $T{$ttagg} = 1;     # и такой тип тоже есть!
    ....
foreach (sort keys %T) {
    ....


И еще. Ты не проверяешь равенство слов (только их количество). В принципе, если исходные тексты были проверены "на пословное равенство",  это не критично. 

...
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
amg
Дата 30.1.2007, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Zuzu @  29.1.2007,  16:47 Найти цитируемый пост)
Понятие "релевантность" - самое сильное из числа "найдено тэггером", "найдено goldStandart" и "найдено тэггером релевантных". Т.е. потенциально существует вероятность, что релевантных слов просто не будет для определенного типа. Вероятность небольшая (на большом тексте), но она есть. Проблема решается путем создания "множества типов слова" или T.
Да, это разумно. Добавлю только, что тогда придется вводить проверки на существование тэгов в %N, %NT, %NG, а то получим предупреждения и ошибки при действиях с неопределенными величинами.

Цитата(Zuzu @  29.1.2007,  16:47 Найти цитируемый пост)
И еще. Ты не проверяешь равенство слов (только их количество). В принципе, если исходные тексты были проверены "на пословное равенство",  это не критично.
Тоже верно. По хорошему, надо бы проверять на равенство слов, но лень было.

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


Эксперт
***


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

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



Цитата(Zuzu @  29.1.2007,  13:50 Найти цитируемый пост)
Для дополнительной проверки можно посчитать кол-во удаленных слов. По специфике построения текста от tager, из него должно быть удалено слов в два раза больше, чем из текста от goldStandart. Это условие должно выполняться для каждого (неверного) предложения текста и, следовательно, для всего текста в целом. LisaST поправит, если это не так.
Можно и так. На всякий случай я добавил в нормализующий скрипт (tag-norm) вывод на stdout удаляемых слов. Это желательно еще и потому, что нормализация - очевидно, самая медленная операция, и будет лучше если программа будет подавать признаки жизнедеятельности. Также в этом скрипте исправил ошибки.
PM MAIL   Вверх
amg
Дата 30.1.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



И, наконец, некоторые соображения философского плана.
Zuzu отлично показал, как данный проект можно оформить с помощью ООП и модулей. Я использовал несколько иной подход, применимый для консольных приложений: каждую операцию делает отдельный независимый маленький скрипт, причем эти скрипты способны взаимодействовать друг с другом (через файлы, а лучше, где это возможно, и через pipe). В любом случае главное - не пихать все в одну программу. Такие скрипты легко скомбинировать в shell-сценарии, например, для GoldStandard и CRFTagger (почему то у меня создалось впечатление, что у LisaST *nix, поэтому bash-сценарий)
Код

#!/bin/sh

if [ $# -ne 2 ]; then
  echo "        Usage: $0 gold.pos CRF.pos"
  exit
fi

if [ `wc -l < $1` -ne `wc -l < $2` ]; then
  echo "        Different line numbers"
  exit
fi

echo -n "        Unification of tags in $1 ... "
tag-uni -G $1 > $1.uni
echo -e "done\n"

echo -n "        Unification of tags in $2 ... "
tag-uni -C $2 > $2.uni
echo -e "done\n"

echo "        Normalization of $1.uni and $2.uni"
tag-norm $1.uni $2.uni
#tag-norm $1.uni $2.uni > /dev/null
echo -e "Done\n"

echo -n "        Test of normalized files ... "
tag-rm $1.uni.norm > $1.uni.norm.txt
tag-rm $2.uni.norm > $2.uni.norm.txt
if [ `diff $1.uni.norm.txt $2.uni.norm.txt` ]; then
  echo "failure"
  exit
fi
echo -e "success\n"
rm $1.uni.norm.txt $2.uni.norm.txt

echo "        Count Recall & Precision"
tag-count $1.uni.norm $2.uni.norm

rm $1.uni $2.uni $1.uni.norm $2.uni.norm
echo -e "\n        That's all!"

PM MAIL   Вверх
LisaST
Дата 30.1.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Recall (как вообще выбирает)  Отношение кол-ва правильно выбранных (релевантных) слов к общему кол-ву выбранных тэггером для определенного типа.  Recall(t) = (N(t) / NT(t)) * 100%

Precision (насколько точно выбирает) Отношение кол-ва релевантно выбранных тэггером слов к общему кол-ву правильных слов для определенного типа.  Precision(t) = (N(t) / NG(t)) * 100%



только наоборот: Recall(t) = (N(t) / NG(t)) * 100%
                              Precision(t) = (N(t) / NT(t)) * 100%
Цитата

LisaST, обратите, пожалуйста внимание, насколько хорошо perl приспособлен для подобного рода задач! Одно короткое выражение разбирает строку и создает довольно нетривиальную структуру данных (все остальное - лишь представление результатов).
  


вау, я даже не знала, что в перле есть такая конструкция- очень практично

Цитата

И, наконец, некоторые соображения философского плана.
Zuzu отлично показал, как данный проект можно оформить с помощью ООП и модулей. Я использовал несколько иной подход, применимый для консольных приложений: каждую операцию делает отдельный независимый маленький скрипт, причем эти скрипты способны взаимодействовать друг с другом (через файлы, а лучше, где это возможно, и через pipe). В любом случае главное - не пихать все в одну программу. Такие скрипты легко скомбинировать в shell-сценарии, например, для GoldStandard и CRFTagger (почему то у меня создалось впечатление, что у LisaST *nix, поэтому bash-сценарий)


у меня в университете Linux, на работе windows, то есть, если что-то простое для обработки текста требуется- то стараюсь сделать в shell, но иногда приходится использовать уже готовые perl программы, поэтому пришлось в нем немного разобраться

а что здесь имелось ввиду, какой-то формат вывода данных?


 
Код

"%s=%d/%.2f/%.2f  "


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



я так поняла,что zuzu мог бы этим заинтересоваться


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


Эксперт
***


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

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



Цитата(LisaST @  30.1.2007,  19:21 Найти цитируемый пост)
а что здесь имелось ввиду, какой-то формат вывода данных?
"%s=%d/%.2f/%.2f  "
Именно. Печать по формату, (почти) так же, как в С. Означает печатать 1-ю переменную в виде строки, затем знак "=", 2-ю переменную как целое число, 3-ю как десятичное число с 2-мя знаками после запятой, 4-ю так же и, наконец, 2 пробела. Переменные перечисляются следом через запятую. См. perldoc -f sprintf (и man 3 printf для дополнительных подробностей). (sprintf отличается о printf только тем, что не выводит результат на печать, а возвращает его).

Цитата(LisaST @  30.1.2007,  19:21 Найти цитируемый пост)
у меня в университете Linux, на работе windows, то есть, если что-то простое для обработки текста требуется- то стараюсь сделать в shell, но иногда приходится использовать уже готовые perl программы, поэтому пришлось в нем немного разобраться
Кстати, при работе в windows можно использовать perl как замену grep/sed/awk/... Есть даже коллекциии консольных команд, так называемые однострочники (one-liners). (Только при использовании таких команд в windows нужно разобраться с кавычками.
PM MAIL   Вверх
Zuzu
Дата 31.1.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(LisaST @  30.1.2007,  22:21 Найти цитируемый пост)
только наоборот: Recall(t) = (N(t) / NG(t)) * 100%
                              Precision(t) = (N(t) / NT(t)) * 100%


Исправил. Прошу прощения за ошибку.

LisaST, у тебя получился то результат, который ты ожидала при обработке текста? Вопрос интересует, скорее из соображения, можно ли считать задачу решенной (по крайней мере на каком-то этапе). 

Если так, мои поздравления участникам! (занавес, аплодисменты, шампанское!). Благодарю amg за очень компактное решение задачи - мне бы так коротко не написать. А LisaST хочется поблагодарить за терпеливое отношение к моим, порой глупым и невмеру ехидным вопросам. Еще раз, всем спасибо.

А про статью - подумаю. 

--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
amg
Дата 31.1.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Zuzu @  31.1.2007,  12:56 Найти цитируемый пост)
Если так, мои поздравления участникам! (занавес, аплодисменты, шампанское!).
С удовольствием присоединяюсь!

Добавлено

Сроднился я уже с этим проектом, никак не отпускает  smile 
Вот проверил производительность скриптов на файлах, состоящих из 40 тыс.предложений (по ~1.2 млн. слов).

Unification of tags - по 3-4 s
Normalization - 38 s
Test of normalized files  - 3 s
Count Recall & Precision - 6 s

Как и следовало ожидать, самая времязатратная операция - нормализация. В принципе, если запускать все это с консоли, то, IMHO, вполне нормально. Хотя можно и ускорить (кое-что в скриптах сделано не оптимально). LisaST, надо ли?

Это сообщение отредактировал(а) amg - 1.2.2007, 15:08
PM MAIL   Вверх
LisaST
Дата 2.2.2007, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

LisaST, у тебя получился то результат, который ты ожидала при обработке текста? Вопрос интересует, скорее из соображения, можно ли считать задачу решенной (по крайней мере на каком-то этапе). 

Если так, мои поздравления участникам! (занавес, аплодисменты, шампанское!).


шампанское скорей от меня smile

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

Цитата

Как и следовало ожидать, самая времязатратная операция - нормализация. В принципе, если запускать все это с консоли, то, IMHO, вполне нормально. Хотя можно и ускорить (кое-что в скриптах сделано не оптимально). LisaST, надо ли?



я думаю, ускорять не надо...второй memm теггер вообще около часа теги присваивает, поэтому такая скорость очень хороша 

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


Шустрый
*


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

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



to amg: 

попробовала сегодня протестировать скрипт, если копирую то, что вы мне написали для shell, то окно просто закрывается, видимо выполняется exit


просто для тестирования попробовала таким способом (тестирую пока только сущ)

LisaN@Lisa /home/CRFTagger/evaluierung
$ cat gold.pos.txt | perl tag_good.pl | perl tag_uni.pl -G > goldstandard.pos.u
ni



Код
The/xx Fulton/nn County/nn Grand/xx Jury/nn said/xx Friday/nn an/xx investigation/nn of/xx recent/xx primary/nn election/nn produced/xx no/xx evidence/nn that/xx any/xx irregularities/nn took/xx place/nn




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


Эксперт
***


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

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



LisaST, рад приветствовать Вас !
Цитата(LisaST @  14.2.2007,  00:57 Найти цитируемый пост)
попробовала сегодня протестировать скрипт, если копирую то, что вы мне написали для shell, то окно просто закрывается, видимо выполняется exit
 С этим надо разобраться. Гораздо удобнее будет.
1. Убедитесь, что у Вас последние версии всех скриптов (я их неоднократно правил, сообщая об этом и внося изменения в тех постах, где они были приведены)
2. Какой у Вас shell? ls -l /bin/sh что говорит? У меня /bin/sh - это симлинк на bash.
3. Если bash, то добавьте 2-й строчкой set -x, чтобы посмотреть, где скрипт вылетает.

И еще. Думаю, что не стоит выбрасывать из текста какие-либо слова/теги (tag_good.pl), даже знаки препинания. Ведь существует же отличная от 0 вероятность, что какой-нибудь совсем дурной тэггер пометит, скажем, точку как существительное. И если это произойдет, то статистика после удаления точек будет неправильной.
PM MAIL   Вверх
LisaST
Дата 16.2.2007, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



добрый вечер,

я тестировала в cygwin bash shell, добавила set x,опять просто закрывается окно.
tag_good попробовала пока просто как тест...
PM MAIL   Вверх
amg
Дата 17.2.2007, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(LisaST @  16.2.2007,  21:55 Найти цитируемый пост)
я тестировала в cygwin bash shell, добавила set x,опять просто закрывается окно
Уж не знаю, что и думать. 
Может такое быть: если файл был сохранен в win(dos)-формате, а cygwin думает, что файл в unix-формате, и если 1-й строкой идет #!/bin/sh, то cygwin будет искать в качестве запускалки скрипта не "/bin/sh", "/bin/sh\n....", и естественно, не найдет и скрипт исполнять не будет. И наоборот, cygwin может ожидать, что файлы в win(dos)-формате, а они не такие. Выход - перевести файл в нужный формат (любой програмистский редактор это умеет). Скорее всего, в unix-формат (default для cygwin'а).

А если создать скрипт с единственной командой, например, date, он будет исполняться?

PM MAIL   Вверх
LisaST
Дата 19.2.2007, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вроде как теперь запускается, но пишет, что в строке 33 (строка , следующая за последней )ошибка, только я не знаю какая smile

 
Код

./shell.sh: line 33: syntax error: unexpected end of file

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


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

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


 




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


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

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