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

Поиск:

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


Шустрый
*


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

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



LisaST
Цитата(LisaST @  20.1.2007,  23:18 Найти цитируемый пост)
 меня Precision dlja "bad tagger" = 2/2  Recall = 2/4, (4 здесь число сущ в goldstandard)


Понятно. Ты рассматриваешь слова с точки зрения контекста. Поэтому суш. "мама" и "мама" из разных предложений - это у тебя разные слова.

Еще пара вопросов:

1. Можно ли понятие "контекст" определить, как "взаимное расположение текущего слова по отношению к другим словам в тексте".

2. Реально ли взять текст от goldStandart (как вариает, убрав из него все тэги) и "скормить" tagger'у, чтобы онн выдал результат по такому же тексту, как и goldStandart?

Если так (пп. 1, 2), то все артефакты складываются в математически правильную постановку, которая выдаст правильный результат. Мало того, результат для всех частей речи можно будет получить за один проход по файлам. Затраты памяти - минимальны и максимальна скорость работы. Это результат того, что мы будем работать с множеством, на котором определено отношение порядка. 

Если нет, никакого нормального результата ты вообще не получишь! Грубо говоря, нужно скормить текст tagger'у и goldstandart и только затем сравнивать файлы!  В обратном случае, сомневаюсь, что по случайным, даже большим выборкам, можно получить правдивый результат. Т.к. из четырех чисел, участвующих в формуле, только одно значение (а именно, кол-во слов, которое наш tagger считает сущ.) можно определить. Слишком велика неопределенность, чтобы говорить о достоверном результате.




Это сообщение отредактировал(а) Zuzu - 22.1.2007, 13:21
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
LisaST
Дата 22.1.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

1. Можно ли понятие "контекст" определить, как "взаимное расположение текущего слова по отношению к другим словам в тексте".

2. Реально ли взять текст от goldStandart (как вариает, убрав из него все тэги) и "скормить" tagger'у, чтобы онн выдал результат по такому же тексту, как и goldStandart?


1. можно

2. так я только потому и могу применять такое грубое сравнение , т.к. это один и тот же текст (голдстандард берется , т.к. в нем теги определены почти на 100%верно), только обработанный разными теггерами, по-другому вообще невозможно было бы определить что-либо
PM MAIL   Вверх
Zuzu
Дата 23.1.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



LisaST, понятно. Не сочти за нудность, но ответь, пожалуйста, на второй вопрос в другом, более сторогом математическом варианте.

Т.е. реально можно считать, что таггеру и goldStandart "скармливается" в точности один и тот же текст
А именно:

1. Оба текста состоят из одних из тех же слов (одно слово считается равным другому с точки зрения определения лексикографического равенства, т.е. слова равны, если они побуквено, слева направо, равны)

2. Слова в первом тексте идут в друг за другом в одном и том же порядке (т.е., если пронумеровать слова с начала текста от 1 до N, где N - общее количество слов, для всякого n от 1 до N word1(n) = word2(n). Так?

3. Если пп. 1, 2 нарушаются хотя бы для одного слова в тексте, либо кол-во слов в текстах разное, то можно считать, что никакого результата мы не получили из-за проблем с исходными данными  

P.S. Я думал дела обстоят намного хуже и тексты разные! На одном и том же тексте можно применить абсолютно точное сравнение!

P.P.S. О разном множестве тэгов, генерируемым taggeром и GoldStandart можно не беспокоится. Простой кусок кода, приведенный ниже,  решит эту проблему. С помощью хэша. Таги приводятся к тому типу, который нужен! Уменьшить кол-во значений множества - не увеличить. Это задача проста до тривиальности.

Код

#!/usr/bin/perl
use strict;

my %type_from_tagger;
my $t;

# какие тэги от taggera обозначают существительные
$type_from_tagger{$_} = 'сущ.' foreach (qw/сущ сущ-множ-числ сущ-ед-числ/);

foreach $t (qw/сущ сущ-ед-числ прил глаг/) {
  print $t . ' --> ';
  if (exists $type_from_tagger{$t}) { 
    print $type_from_tagger{$t} . "\n";
  } else {
    print 'undefined' . "\n";
  }
}

exit;



P.P.P.S Держись! Осталось совсем немного!

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


Шустрый
*


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

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



Цитата

Т.е. реально можно считать, что таггеру и goldStandart "скармливается" в точности один и тот же текст. 
А именно:

1. Оба текста состоят из одних из тех же слов (одно слово считается равным другому с точки зрения определения лексикографического равенства, т.е. слова равны, если они побуквено, слева направо, равны)

2. Слова в первом тексте идут в друг за другом в одном и том же порядке (т.е., если пронумеровать слова с начала текста от 1 до N, где N - общее количество слов, для всякого n от 1 до N word1(n) = word2(n). Так?

3. Если пп. 1, 2 нарушаются хотя бы для одного слова в тексте, либо кол-во слов в текстах разное, то можно считать, что никакого результата мы не получили из-за проблем с исходными данными  


1. авторы голдстандард утверждают, что у них использовался brown corpus , я пользовалась им же, только когда до обработки я удалила все пустые строки из голдстандард, там все-равно было на несколько сотен строк больше, но мне кажется из-за некоторых небуквенных знаков типа "./." , которые в их варианте были помещены на отдельную строку, я конечнно могу удалить из обоих текстов все знаки кроме слов и сравнить кол-во слов еще раз для проверки.

2. нет, этот большой текст состоит из отдельных рубрик и порядок расположения "кусков" текста неодинаков  в моем тексте и голдстандард

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

не совсем поняла, здес'

 мы печатаем все теги через "-->" ?

Код
foreach $t (qw/сущ сущ-ед-числ прил глаг/) {
  print $t . ' --> ';

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


Шустрый
*


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

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



LisaST

1. Вопрос: tagger - это такая программа (или механизм, web-интерфейс и т.п.), который тебе доступен. Ему можно скормить любой текст и получить результирующий текст, им обработанный (c тэгами, расставленными tagger'ом после каждого слова), так? Если так, то можно просто взять текст от goldStandart?

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

Цитата(LisaST @  23.1.2007,  15:35 Найти цитируемый пост)
3. но если, например, экстрагировать все сущ в отсортированном виде, то должны получится файлы, подходящие для сравнения или?


Нет. Если извлечь все существительные, да к тому же их отсортировать, то будут, как минимум потеряны слова, которые стоят между ними (да к тому-же изменится их, существительных, порядок относительно друг друга) - мы нарушаем понятие контекста слова (как взаимного его расположения относительно других слов).  При нарушении контекста нельзя определить релевантность, т.е. правильность определения слова таггером. Вся система рушится, т.к. ничего посчитать уже не представляется возможным. Короче, нужны абсолютно одинаковые тексты (с, возможно, разного типа тэгами, которые tagger и goldstandart подписали к словам), именно они должны быть отданы обрабатывающей программе!

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

Про мой код. 

Он "сузит" определения существительных. Про те части речи, которым его "не научили", вернет "undefined". Вот результат работы:

Код

сущ --> сущ.
сущ-ед-числ --> сущ.
прил --> undefined
глаг --> undefined


P.S. Понятие "артефакт" в определении Рационального Унифицированного Процесса (проектирования и разработки ПО, в частности) есть закон, описание, модель, документ и т.п. - нечто описывающее определенное понятие предметной области.

Это сообщение отредактировал(а) Zuzu - 23.1.2007, 16:36
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
LisaST
Дата 23.1.2007, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



1. 
это программа, внизу ссылка на первый из тестируемых теггеров, текст можно "скормит" любой на англ языке, для других языков надо тренировать модель. Использовать голдстандард очень хорошая идея, только надо удалить все теги (~85) и затем тестировать. 

crf Tagger

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



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


Шустрый
*


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

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



LisaST, все! Наступило счастье! Все сложилось в стройную, математически правильную модель!

(ссылку не смотрел -  достаточно того, что ты сказала, что это возможно)

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

Код


$str1 =~ s#/[^\s]+##g;                # удаляет все тэги типа /foo-bar-tag из строки 
                                                        #  (/, за которым идут несколько непробельных символов) 
$str1 =~ s#\s+# #g;                      #  двойные внутренние пробелы - не нужны (зачем - не знаю)
$str1 =~ s#^\s+##;                       # начальные пробелы нам не нужны
$str1 =~ s#\s+$##;                        # конечные тоже не нужны



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

tagger: (сущ-ед-числ, сущ-мн-числ) => сущ.
goldStandart: (существ-ед, существ-множ) => сущ.

Постараюсь сегодня вечером, при наличии времени, свести воедино все исходные артефакты математической модели.

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


Эксперт
***


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

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



Цитата(LisaST @  23.1.2007,  20:12 Найти цитируемый пост)
если тексты полностью идентичны, то можно делать построчное сравнение (одно предложение на строке,заменив например разные виды тегов для сущ (мн.ч, имена собственные) на один вариант тега), но я наверное не смогу реализовать это в перле самостоятельно
Это то легко сделать. Чтобы заменить разные виды тегов, можно из командной строки исполнить
Код

perl -pe 's#/(NN|VB|JJ)\S+#/$1#g' file.pos > new_file.pos
 При этом, например, все NNP, NNS и NNPS заменятся на NN и результат запишется в new_file.pos (нужно только заменить одинарные кавычки на двойные, если у Вас Windows). Проделать эту операцию с двумя файлами, полученными от разных теггеров над одинаковым текстом (если у теггеров обозначения тегов разные, то модифицировать регулярные выражения, чтобы результат получился единообразным). Затем, чтобы сделать построчное сравнение, просто напустить на эти файлы команду diff (это в *nix, в win* не знаю, как она называется, есть соответствующие модули для Perl). 

Это сообщение отредактировал(а) amg - 24.1.2007, 12:55
PM MAIL   Вверх
Zuzu
Дата 24.1.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



...

P.S. Для нетерпеливых подскажу "сырой" алгоритм сразу:

1. Считывать слова и тип строго по одному из каждого текста.

2. Для считанного слова приводить его тип к каноническому виду
3. Релевантность опрелелять по простому равенству канонических типов. (получим  кол-во правильно определенных таггером слов для каждого типа)
4. Прибавить 1 к кол-ву кол-во слов определенного канонического типа для таггера (в итого получим общее кол-во слов для определенного канонического типа, которое определил таггер)
5. Прибавить 1 к кол-ву слов определенного канонического типа для goldStandart (в итого получим общее кол-во слов для определенного канонического типа, которое определил goldStandart

6. Считать еще по одному слову и его типу из каждого файла, перейти к п.2

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

7. посчитать Recall Precision для каждого канонического типа слова
8. Выдать результат.

Итого - все значения для всех канонических типов слов за один проход сверху вниз по двум файлам. Как вам, а?



Это сообщение отредактировал(а) Zuzu - 29.1.2007, 10:55
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
LisaST
Дата 24.1.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



алгоритм makes sense. спасибо. тебе потребуется список соответствий наподобие

tagger: (сущ-ед-числ, сущ-мн-числ) => сущ.
goldStandart: (существ-ед, существ-множ) => сущ.

у меня есть такое соответствие для сущ, теги, используемые в голдстандард немного отличаются от тех, кот. я дала по ссылке "amalgam". 


Я думаю определять Precision i Recall для основных категорий, сущ, глагол, прилагательное, предлог, наречие, для всех , кроме сущ надо составить соответствия. 

- кроме этох категорий еще есть множество тегов, кот. не будут учавствовать в анализе, напр. вопросительные слова who, whom, числительные етц, их программа будет пропускать?

- не совсем поняла, что имеется ввиду в п.4 и 5 под прибавить 1.

- в п. 7 имеется ввиду, когда все слова в обоих текстах были считаны? (в принципе Precision i Recall можно определять при 20% 40% 60% етц считанного текста, тогда можно построить график изменения этих величин по отношению к увеличеню выборки слов), но я думаю для простоты лучше определить их для всех слов, принадлежащих к опред. категории


-  с вашими перл regex выражениями я удалила почти все теги, но такие вещи как ?!" не удалились, теггер им тоже присваивал тег: например ./.  ?/? "/" етц

- ещё проблемы
т.к. в голдстандард намного больше тегов и ещё такого типа как
ppss+bem:    pronoun, personal, nominative, not 3rd person singular + verb "to be", present tense, 1st person singular

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


Это сообщение отредактировал(а) LisaST - 25.1.2007, 01:28
PM MAIL   Вверх
Zuzu
Дата 25.1.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



LisaST, сначала отвечу на вопросы.

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

Тебе здесь, к сожаленю, ничем помочь не могу. Я просто не знаю предметной области. (Если у кого-то складывается обратное впечатление, когда я пользуюсь терминами типа Recall и Precision - оно обманчиво! Я пользуюсь только теми понятиями, которые ты мне сообщила! При этом стараясь изо всех сил не увеличивать объем своих знаний в области лингвистики - так быстрее будет найдено решение! )

Цитата(LisaST @  25.1.2007,  00:37 Найти цитируемый пост)
 кроме этох категорий еще есть множество тегов, кот. не будут учавствовать в анализе, напр. вопросительные слова who, whom, числительные етц, их программа будет пропускать?


Нет, в рамках математической модели (а затем, собственно, на этапе проектирования и реализации) эти слова не будут пропущены. Вернее, могут быть пропущены, а могут быть посчитаны. Но никогда не будут посчитаны, как релевантные. Запуталась? Приведу пример:

Пусть tagger (неверно) определил "двадцать"  как глагол, в то время как goldStandart это слово (правильно) определил как числительное. Пусть числительные нас не интересуют. 

Напомню, Recall - отношение кол-ва правильно выбранных к общему кол-ву выбранных, Precision - отношение кол-ва правильно выбранных к кол-ву всех правильных. Для глаголов и для числительных эти понятия концептуально различны и считаются независимо друг от друга.

Как бы ты анализировала это результат "руками"? Наверно так, в три шага:

1. В рамках модели (а именно, для определения Recall для глаголов) необходимо посчитать сколько слов в тексте наш tagger определил как глагол. Наш tagger определил слово, как глагол. Поэтому к количеству глаголов, которое определил tagger в тексте, прибавим 1. Идем дальше...

2. По идее, если бы мы считали числительные, нам нужно было посчитать (для определения Precision числительных), сколько реальных числительных у нас в тексте. Но числительные нас не интересуют - значит информация о том, что в тексте найдено реальное числительное (слово-то goldStandart определил, как числительное!) просто теряется. Ничего никуда не прибавляем... И последний шаг...

3. Для определения и Recall и Precision глаголов необходимо знать, правильно ли tagger определил слово, как глагол. Он определил неправильно, т.к. то значение (типа слова), которое он выдал не совпадает со значением от goldStandart. Единичку к кол-ву правильно определенных tagger'ом глаголов прибавлять не будем. Все, со словом разобрались. Можно переходить к другому слову.

Собственно, это и написано в "сыром" алгоритме. Написано, но не описано, поэтому он и назван "сырым".

Аналогично, если хочешь, можешь самостоятельно рассмотреть три других случая (глагол-глагол, числительное-глагол, числительное-числительное). Случаи аналогичные.

Цитата(LisaST @  25.1.2007,  00:37 Найти цитируемый пост)
 не совсем поняла, что имеется ввиду в п.4 и 5 под прибавить 1.


Думаю, после ответа на предыдущий вопрос, стало все понятно smile

Цитата(LisaST @  25.1.2007,  00:37 Найти цитируемый пост)
- в п. 7 имеется ввиду, когда все слова в обоих текстах были считаны? (в принципе Precision i Recall можно определять при 20% 40% 60% етц считанного текста, тогда можно построить график изменения этих величин по отношению к увеличеню выборки слов), но я думаю для простоты лучше определить их для всех слов, принадлежащих к опред. категории


Легко! Этот исходный артефакт (дополнительное условие) усложняет задачу только на этапе реализации! Математической модели не противоречит ни вычисление Recall и Precision на любом этапе обработки слов, ни постороение графиков, ни занесение этих промежуточных результатов в базу данных, ни что либо еще, связанное с извлечением результатьв в любой момент обработки! Мы же имеем дело с множеством, на котором определено отношение порядка! 
Как это решить - задача проектировщика, а скорее реализатора, а не аналитика.  smile


Цитата(LisaST @  25.1.2007,  00:37 Найти цитируемый пост)
  с вашими перл regex выражениями я удалила почти все теги, но такие вещи как ?!" не удалились, теггер им тоже присваивал тег: например ./.  ?/? "/" етц


И правильно, что не удалились! Когда я писал это регулярное выражение, я, как реализатор, вынужден был находитс в рамках математической модели, в которой было сказано, что все, что от пробеда до / - слово, все, что после (до пробела) - тэг. Слова-то удалять из текста нельзя, т.к. нарушается контекст. А лингвистику, как реализатор, я не знаю (и знать, собственно, не обязан). Для разрешения этого вопроса (чтобы не посылать программистов-реализаторов на четыре года в вуз для изучения лингвистики), собственно, и создается математическая модель.

Если бы я, как реализатор, удалил знаки припинания, ты, как лингвист, могла бы мне сазать: "Дорогой друг! Ты удалил все знаки препинания! У слов, в связи с этим поменялся контекст и, как результат, весь мой труд по опредеделню качества таггера пошел коту под хвост! Это, по крайней мере, обидно..."

Цитата(LisaST @  25.1.2007,  00:37 Найти цитируемый пост)
- ещё проблемы
т.к. в голдстандард намного больше тегов и ещё такого типа как
ppss+bem:    pronoun, personal, nominative, not 3rd person singular + verb "to be", present tense, 1st person singular
...


Не совсем понял, т.к. в грамматике английского не силен, но этот артефакт настораживает, т.к. потенциально может нарушить целостность математической модели. Приведи, пожалуйста, пример, одного (короткого) предложения, обработанного tagger и goldStandart для этого случая.

Два слова (to be) определены одним тэгом или каждому приписан свой тэг?

С полным математическим описанием модели повременю до разрешения этого вопроса....





Это сообщение отредактировал(а) Zuzu - 25.1.2007, 12:18
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
Zuzu
Дата 25.1.2007, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Собственно, вопрос с to be, ИМХО, не особенно важен - можно и проигнорировать этот артефакт на этапе (объектной) реализации 

Предлагаю вашему вниманию, дамы и господа, скелет программы, как бы я это все реализовывал. Предвидя вопросы типа, "почему так сложно", "можно написать по-другому" - да ради бога! Перл предлагает массу способов реализации одной идеи! Каждый выбирает для себя сам то, что ему ближе. Лично мне "ближе" мыслить объектами, в рамках тех реальных объектов (сущностей) для которых пишется задача. И в своей работе я готов смириться с тем, что придется писать больше кода (ведь каждый класс необходимо реализовать!). Тем более, как показал предыдущий пост от LisaST, внести коррективы в код в связи с появлением нового артефакта, который укладывается в математическую модель, не представляет большого труда (hазговор про подсчет промежуточных результатов).

Код


#!/usr/bin/perl

use strict;

#
# "самописные" классы
use GoldStorage;        # хранилище для goldStandart
use TaggerStorage;    # хранилище для tagger
use Tag;                      # класс Tag - для создания объектов Tag для каждого канонического тэга
use TagZoo;                # в объект aTagZoo мы поместим все тэги
use Transformer;         # класс для создания объекта aTransformer, который "знает" диалект таггера

# переменные с "приставкой" a ($aTag) используются для храниения ссылки на экземпляр объекты! 

#
# откроем хранилища
my $goldStandartFile = 'goldstandart.txt';
my $taggerFile           = 'tagger.txt';
my $aGoldStorage     = open GoldStorage (name => $goldStandartFile);
my $aTaggerStorage = open TagStorage  (name => $taggerFile);

#
# создадим трансформеры для типов (слов) от tagger и goldStandart
my $aTrGold     = new Transformer;
my $aTrTagger = new Transformer;

my $aTag;
my $aTagZoo = new TagZoo;      # "зоопарк" для наших тэгов

# для существительных
$aTag = new Tag (name => 'сущ.');       # создадим Tag, присвоим тэгу (каноническое) имя
$aTrGold->learn('сущ-ед-числ сущ-мн-числ'  => $aTag);      # обучим трансформер c goldStandart диалекту для сущ.
$aTrTagger->learn('существ-ед существ-мн' => $aTag);      # аналогично для трансформера диалекта c Tagger
$aTagZoo->push($aTag);    # поместим тэг в "зоопарк"

# для глаголов, прилагательных и т.д - аналогично

# предварительная работа завершена: тэги созданы, трансформеры обучены, хранилища открыты -
# можно приступать к работе

my ($goldWord, $goldType, $aGoldTag, $taggerWord, $taggerType, $aTaggerTag);
my ($lastReportedLine, $line, $isError, $errMess);

$lastReportedLine = 0;  # строка, для которой выводили отчет 
$reportedLine = 1000;   # отчет будем выводить для каждой 1000-й строки!
$isError = 0;      # флаг ошибки


# считываем по одной паре слово/тэг из кадждого хранилища, пока они не кончатся.
while ( ($goldWord, $goldType)  = $aGoldStorage->getNextPair or 
  ($taggerWord, $taggerType) = $aTaggerStorage->getNextPair) {
  #
  if ($goldWord ne $taggerWord) {      # не равны слова - эт ошибка в данных.
     $isError = 1;
     $errMess = 'Проблемы с данными';
     last;
  }
  #
  # трансформеры - за работу! определяйте канонический тип слова и связанный с ним тэг!
  # если в рамках диалекта соотв. тэгера трансформер ничего не найдет - вернет undef
  $aGoldTag     = $aTrGold->transform($goldType);
  $aTaggerTag = $aTrTagger->transform($taggerType);
  #
  if (defined $aGoldTag) {      # "если тэг слова из goldStandart определен в рамках диалекта goldStandart
    $aGoldTag->increaseNumberOfRightWords;            # "увеличиваем кол-во реально правильных слов" этого тэга
  }
  #
  if (define $aTaggerTag) {    # аналогично для Tagger
      $aTaggerTag->increaseNumberOfTaggetWords;     # увеличиваем кол-во выбранных тэггером слов этого тэга
    #
    if ($aGoldTag == $aTaggerTag) {    # тэги совпадают - выбор тэггером типа для слова релевантен
       $aTaggerTag->increaseNumberOfRelevantWords;   # "увеличим кол-во релевантных (выбранных релевантно)слов"
   }
   #
   # слова посчитали, проверим, не нужно ли выводить отчет для "внутренних строк"
   $line = $aGoldStorage->line;       # номер строки в goldStorage
   if ($line != $lastReportedLine and (($line % $reportedLine) == 0)) {
      #
      $lastReportedLine = $line;
      print "Line: $line \n";
      $aTagZoo->report;       # попросим "зоопарк" (все тэги) отчитаться о значениях Recall и Percision :)
  } 
}    # писал, писал, писал, ... все как-то вдруг неожиданно закончилось...

#
# была ли ошибка? напишем где была...
if ($isError) {
  warn $errMess . ' line: ' . $aGoldStorage->line . ',  tagger pair: ' . $aTaggerStorage->lastPair . 
     ', goldStandart pair: ' . $aGoldStorage->lastPair . "\n";

} else {        # ошибки не было, попросим зоопарк отчитаться :)
  print "Summary result \n";
  $aTagZoo->report;


# закроем хранилища - правила хорошего тона.
$aGoldStorage->close;
$aTagStorage->close;

exit;
# все экземпляры объектов умрут сами...



P.S. Код, естественно, не тестировал. Классы-то не созданы и их свойства, методы и интерфейсы не определены!

Вот так. Спасибо тем, к то осилил чтение кода до конца!


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


Эксперт
***


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

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



Ух ты! Zuzu, это круто!

Я, собственно, вклиниваюсь в обсуждение, чтобы предложить простенький вспомогательный скрипт, предназначение которого - навести статистику тэгов. Надеюсь, пригодится, хотя бы затем, чтобы получить список всех употребленных тэгов. Тестировался этот скрипт над результатом работы CRFTagger, для других тэггеров, возможно, придется немного поменять код. Печатает он сам тэг и сколько раз этот тэг встретился в файле. Если нужна статистика по словам, помеченным этим тэгом, то нужно в 3-й строке заменить 0 на 1. Файл скрипту нужно подавать в качестве параметра.
Код

@ARGV or die "Usage: $0 tagged_file [> result]\n";

$need_word_statistics = 0; # 1

while (<>) {
  chomp;
  $TAG{$2}{$1}++ while m/(\S+)\/(\S+)/g;
}

foreach $tag (sort keys %TAG) {
  $count = 0;
  $count += $_ foreach values %{$TAG{$tag}};
  print "$tag\t\t$count\n";
  if ($need_word_statistics) {
    foreach (sort keys %{$TAG{$tag}}) {
      print "\t$_\t$TAG{$tag}{$_}\n";
    }
  }
}

Zuzu, респект! Благодаря твоим стараниям даже мне стали примерно понятны условия задачи. Еще бы кусочек пресловутого goldStandart...
PM MAIL   Вверх
Zuzu
Дата 25.1.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



amg, спасибо за отзыв! Рад, что "пролил свет" на задачу. Самому было интересно разобраться. Неравнодушен я к поянтиям типа "релевантность".

Кстати, я там, как разработчик, немного слукавил с подсчетом промежуточных результатов. Считаю их для каждых 1000 строк, а не для обозначенных процентов. Дело вот в чем. Если нужно реально считать именно по процентам, то нужно знать количество строк (или слов) в исходном тексте. Для этого его необходимо пройти сверху вниз еще один раз перед тем, как анализировать сами слова. Как говорится, дополнительный проход по файлу в 9Mb.. Оправдано ли это? 

Если бы таковы были начальные условия, то при реализации хранилища (класса Storage, от которого, собственно, порождены классы TagStorage и GoldStorage) я бы, конечно, это сделал, но написал бы в коде ехидный комментарий типа: "Эх вы! Горе-заказчики! Если бы вы убрали из начальной спецификации это условие, программа бы работала в 2 раза быстрее!".

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


Шустрый
*


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

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



я не имела ввиду полностью удалить знаки препинания, просто "/" удалился , а знаков везде по 2 осталось например:

надо будет просто дополнить <regex>

Код

`` You mean some of the defendants made statements admitting this '' ? ?



к проблеме объединенных тегов:
iz goldstandard
Код

I'm/ppss+bem willing/jj to/to stake/vb my/pp$ political/jj career/nn on/in it/ppo ''/'' ./.


-------------------------------------------------------------------------
iz test 
Код

I/PRP am/VBP well/RB at/IN present/RB with/IN the/DT exception/NN I/PRP have/VBP got/VBD the/DT Dyerear/NNP and/CC I/PRP hope/VBP thease/DT few/JJ lines/NNS find/VBP you/PRP the/DT same/JJ ``/`` ./. 


The irregular present tense forms "am" and "are" are tagged as VBP in the Penn Treebank (see section ), just like any other non-third person singular present tense form.
----------------------------------------------------------------------------
<I'm> в тестфайле (CRFTagger) вообще не встречается, видимо программа заменяет все эти сокращенные формы на обычные перед присваиванием теггов-- это все усложняет задачу, предлагаю тогда глагол <to be> не анализировать, а объединенные формы в голдстандард считать за местоимение




т.е., если встречается глагол <to be> в любой форме, то исключить его в обоих файлах из статистики
-------------------------------------------------------
код прочитала до конца, логически очень все красиво написано, но я с такими понятиями как модули и интерфейсы в перле совсем не знакома, больше уже яву напоминает, создание новых объектов итц.

спасибо вам обоим с <amg>

моя задача сейчас определить соответствия 
------------------------------------------------------------
помещаю кусок голдстандард для<amg>


Код


The/at Fulton/np-tl County/nn-tl Grand/jj-tl Jury/nn-tl said/vbd Friday/nr an/at investigation/nn of/in Atlanta's/np$ recent/jj primary/nn election/nn produced/vbd ``/`` no/at evidence/nn ''/'' that/cs any/dti irregularities/nns took/vbd place/nn ./.


    The/at jury/nn further/rbr said/vbd in/in term-end/nn presentments/nns that/cs the/at City/nn-tl Executive/jj-tl Committee/nn-tl ,/, which/wdt had/hvd over-all/jj charge/nn of/in the/at election/nn ,/, ``/`` deserves/vbz the/at praise/nn and/cc thanks/nns of/in the/at City/nn-tl of/in-tl Atlanta/np-tl ''/'' for/in the/at manner/nn in/in which/wdt the/at election/nn was/bedz conducted/vbn ./.


    The/at September-October/np term/nn jury/nn had/hvd been/ben charged/vbn by/in Fulton/np-tl Superior/jj-tl Court/nn-tl Judge/nn-tl Durwood/np Pye/np to/to investigate/vb reports/nns of/in possible/jj ``/`` irregularities/nns ''/'' in/in the/at hard-fought/jj primary/nn which/wdt was/bedz won/vbn by/in Mayor-nominate/nn-tl Ivan/np Allen/np Jr./np ./.


    ``/`` Only/rb a/at relative/jj handful/nn of/in such/jj reports/nns was/bedz received/vbn ''/'' ,/, the/at jury/nn said/vbd ,/, ``/`` considering/in the/at widespread/jj interest/nn in/in the/at election/nn ,/, the/at number/nn of/in voters/nns and/cc the/at size/nn of/in this/dt city/nn ''/'' ./.


    The/at jury/nn said/vbd it/pps did/dod find/vb that/cs many/ap of/in Georgia's/np$ registration/nn and/cc election/nn laws/nns ``/`` are/ber outmoded/jj or/cc inadequate/jj and/cc often/rb ambiguous/jj ''/'' ./.


    It/pps recommended/vbd that/cs Fulton/np legislators/nns act/vb ``/`` to/to have/hv these/dts laws/nns studied/vbn and/cc revised/vbn to/in the/at end/nn of/in modernizing/vbg and/cc improving/vbg them/ppo ''/'' ./.


    The/at grand/jj jury/nn commented/vbd on/in a/at number/nn of/in other/ap topics/nns ,/, among/in them/ppo the/at Atlanta/np and/cc Fulton/np-tl County/nn-tl purchasing/vbg departments/nns which/wdt it/pps said/vbd ``/`` are/ber well/ql operated/vbn and/cc follow/vb generally/rb accepted/vbn practices/nns which/wdt inure/vb to/in the/at best/jjt interest/nn of/in both/abx governments/nns ''/'' ./.







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


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

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


 




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


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

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