![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
LisaST,
Понятно. Ты рассматриваешь слова с точки зрения контекста. Поэтому суш. "мама" и "мама" из разных предложений - это у тебя разные слова. Еще пара вопросов: 1. Можно ли понятие "контекст" определить, как "взаимное расположение текущего слова по отношению к другим словам в тексте". 2. Реально ли взять текст от goldStandart (как вариает, убрав из него все тэги) и "скормить" tagger'у, чтобы онн выдал результат по такому же тексту, как и goldStandart? Если так (пп. 1, 2), то все артефакты складываются в математически правильную постановку, которая выдаст правильный результат. Мало того, результат для всех частей речи можно будет получить за один проход по файлам. Затраты памяти - минимальны и максимальна скорость работы. Это результат того, что мы будем работать с множеством, на котором определено отношение порядка. Если нет, никакого нормального результата ты вообще не получишь! Грубо говоря, нужно скормить текст tagger'у и goldstandart и только затем сравнивать файлы! В обратном случае, сомневаюсь, что по случайным, даже большим выборкам, можно получить правдивый результат. Т.к. из четырех чисел, участвующих в формуле, только одно значение (а именно, кол-во слов, которое наш tagger считает сущ.) можно определить. Слишком велика неопределенность, чтобы говорить о достоверном результате. Это сообщение отредактировал(а) Zuzu - 22.1.2007, 13:21 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
LisaST |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 8.4.2006 Где: Munich Репутация: нет Всего: нет |
1. можно 2. так я только потому и могу применять такое грубое сравнение , т.к. это один и тот же текст (голдстандард берется , т.к. в нем теги определены почти на 100%верно), только обработанный разными теггерами, по-другому вообще невозможно было бы определить что-либо |
|||
|
||||
Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 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 можно не беспокоится. Простой кусок кода, приведенный ниже, решит эту проблему. С помощью хэша. Таги приводятся к тому типу, который нужен! Уменьшить кол-во значений множества - не увеличить. Это задача проста до тривиальности.
P.P.P.S Держись! Осталось совсем немного! --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
LisaST |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 8.4.2006 Где: Munich Репутация: нет Всего: нет |
1. авторы голдстандард утверждают, что у них использовался brown corpus , я пользовалась им же, только когда до обработки я удалила все пустые строки из голдстандард, там все-равно было на несколько сотен строк больше, но мне кажется из-за некоторых небуквенных знаков типа "./." , которые в их варианте были помещены на отдельную строку, я конечнно могу удалить из обоих текстов все знаки кроме слов и сравнить кол-во слов еще раз для проверки. 2. нет, этот большой текст состоит из отдельных рубрик и порядок расположения "кусков" текста неодинаков в моем тексте и голдстандард 3. но если, например, экстрагировать все сущ в отсортированном виде, то должны получится файлы, подходящие для сравнения или? не совсем поняла, здес' мы печатаем все теги через "-->" ?
|
||||
|
|||||
Zuzu |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
LisaST,
1. Вопрос: tagger - это такая программа (или механизм, web-интерфейс и т.п.), который тебе доступен. Ему можно скормить любой текст и получить результирующий текст, им обработанный (c тэгами, расставленными tagger'ом после каждого слова), так? Если так, то можно просто взять текст от goldStandart? К слову. Если прогаммировать задачу по описанной выше модели (начиная с начального описания с учетом тех артефактов, которые мы с тобой обсуждали после этого), то программа сама "скажет", на какой строке файла данных произошла ошибка и можно будет последовательно приводить в порядок данные.
Нет. Если извлечь все существительные, да к тому же их отсортировать, то будут, как минимум потеряны слова, которые стоят между ними (да к тому-же изменится их, существительных, порядок относительно друг друга) - мы нарушаем понятие контекста слова (как взаимного его расположения относительно других слов). При нарушении контекста нельзя определить релевантность, т.е. правильность определения слова таггером. Вся система рушится, т.к. ничего посчитать уже не представляется возможным. Короче, нужны абсолютно одинаковые тексты (с, возможно, разного типа тэгами, которые tagger и goldstandart подписали к словам), именно они должны быть отданы обрабатывающей программе! Я пользуюсь только теми определениями, которые мы с тобой обсуждали выше и вытекающими из них следствиями. И на их основе поверяю (без компьютера, просто на "листочке с помощью ручки") работу модели. Про мой код. Он "сузит" определения существительных. Про те части речи, которым его "не научили", вернет "undefined". Вот результат работы:
P.S. Понятие "артефакт" в определении Рационального Унифицированного Процесса (проектирования и разработки ПО, в частности) есть закон, описание, модель, документ и т.п. - нечто описывающее определенное понятие предметной области. Это сообщение отредактировал(а) Zuzu - 23.1.2007, 16:36 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
||||
|
|||||
LisaST |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 8.4.2006 Где: Munich Репутация: нет Всего: нет |
1.
это программа, внизу ссылка на первый из тестируемых теггеров, текст можно "скормит" любой на англ языке, для других языков надо тренировать модель. Использовать голдстандард очень хорошая идея, только надо удалить все теги (~85) и затем тестировать. crf Tagger 2. да, вся контекстная информация будет утеряна, и, конечно, сравнение становится очень "грубым". в идеале, если тексты полностью идентичны, то можно делать построчное сравнение (одно предложение на строке,заменив например разные виды тегов для сущ (мн.ч, имена собственные) на один вариант тега), но я наверное не смогу реализовать это в перле самостоятельно |
|||
|
||||
Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
LisaST, все! Наступило счастье! Все сложилось в стройную, математически правильную модель!
(ссылку не смотрел - достаточно того, что ты сказала, что это возможно) Во-первых, возьми текст от goldStandart и удали оттуда все тэги, чтобы получился "просто текст". Программка должна быть простая. Типа того, что написано снизу для одной строки файла (извини, набивал прямо в форум, поэтому не проверял - может неправильно работать). Сначала протеституй на одной строке, затем на маланьком куске файла, затем на всем goldStandart. Возможно, придется разбираться с пунктуацией. В том смысле, что придется "удалить пробел перед запятой".
Во-вторых, составь (на листочке) соответствие между "разными тэгами", для tagger и goldStandart. Для замены "многих тэгов, на один нужный". Для всех интересующих тебя частей речи. Запись не имеет значения. Достаточно, чтобы тебе было понятно. Типа: tagger: (сущ-ед-числ, сущ-мн-числ) => сущ. goldStandart: (существ-ед, существ-множ) => сущ. Постараюсь сегодня вечером, при наличии времени, свести воедино все исходные артефакты математической модели. --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Это то легко сделать. Чтобы заменить разные виды тегов, можно из командной строки исполнить
Это сообщение отредактировал(а) amg - 24.1.2007, 12:55 |
|||
|
||||
Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 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 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
LisaST |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
LisaST, сначала отвечу на вопросы.
Определение соответствия между тэгами - твоя, как специалиста-лингвиста, забота ![]() Тебе здесь, к сожаленю, ничем помочь не могу. Я просто не знаю предметной области. (Если у кого-то складывается обратное впечатление, когда я пользуюсь терминами типа Recall и Precision - оно обманчиво! Я пользуюсь только теми понятиями, которые ты мне сообщила! При этом стараясь изо всех сил не увеличивать объем своих знаний в области лингвистики - так быстрее будет найдено решение! ) Нет, в рамках математической модели (а затем, собственно, на этапе проектирования и реализации) эти слова не будут пропущены. Вернее, могут быть пропущены, а могут быть посчитаны. Но никогда не будут посчитаны, как релевантные. Запуталась? Приведу пример: Пусть tagger (неверно) определил "двадцать" как глагол, в то время как goldStandart это слово (правильно) определил как числительное. Пусть числительные нас не интересуют. Напомню, Recall - отношение кол-ва правильно выбранных к общему кол-ву выбранных, Precision - отношение кол-ва правильно выбранных к кол-ву всех правильных. Для глаголов и для числительных эти понятия концептуально различны и считаются независимо друг от друга. Как бы ты анализировала это результат "руками"? Наверно так, в три шага: 1. В рамках модели (а именно, для определения Recall для глаголов) необходимо посчитать сколько слов в тексте наш tagger определил как глагол. Наш tagger определил слово, как глагол. Поэтому к количеству глаголов, которое определил tagger в тексте, прибавим 1. Идем дальше... 2. По идее, если бы мы считали числительные, нам нужно было посчитать (для определения Precision числительных), сколько реальных числительных у нас в тексте. Но числительные нас не интересуют - значит информация о том, что в тексте найдено реальное числительное (слово-то goldStandart определил, как числительное!) просто теряется. Ничего никуда не прибавляем... И последний шаг... 3. Для определения и Recall и Precision глаголов необходимо знать, правильно ли tagger определил слово, как глагол. Он определил неправильно, т.к. то значение (типа слова), которое он выдал не совпадает со значением от goldStandart. Единичку к кол-ву правильно определенных tagger'ом глаголов прибавлять не будем. Все, со словом разобрались. Можно переходить к другому слову. Собственно, это и написано в "сыром" алгоритме. Написано, но не описано, поэтому он и назван "сырым". Аналогично, если хочешь, можешь самостоятельно рассмотреть три других случая (глагол-глагол, числительное-глагол, числительное-числительное). Случаи аналогичные. Думаю, после ответа на предыдущий вопрос, стало все понятно ![]() Легко! Этот исходный артефакт (дополнительное условие) усложняет задачу только на этапе реализации! Математической модели не противоречит ни вычисление Recall и Precision на любом этапе обработки слов, ни постороение графиков, ни занесение этих промежуточных результатов в базу данных, ни что либо еще, связанное с извлечением результатьв в любой момент обработки! Мы же имеем дело с множеством, на котором определено отношение порядка! Как это решить - задача проектировщика, а скорее реализатора, а не аналитика. ![]()
И правильно, что не удалились! Когда я писал это регулярное выражение, я, как реализатор, вынужден был находитс в рамках математической модели, в которой было сказано, что все, что от пробеда до / - слово, все, что после (до пробела) - тэг. Слова-то удалять из текста нельзя, т.к. нарушается контекст. А лингвистику, как реализатор, я не знаю (и знать, собственно, не обязан). Для разрешения этого вопроса (чтобы не посылать программистов-реализаторов на четыре года в вуз для изучения лингвистики), собственно, и создается математическая модель. Если бы я, как реализатор, удалил знаки припинания, ты, как лингвист, могла бы мне сазать: "Дорогой друг! Ты удалил все знаки препинания! У слов, в связи с этим поменялся контекст и, как результат, весь мой труд по опредеделню качества таггера пошел коту под хвост! Это, по крайней мере, обидно..." Не совсем понял, т.к. в грамматике английского не силен, но этот артефакт настораживает, т.к. потенциально может нарушить целостность математической модели. Приведи, пожалуйста, пример, одного (короткого) предложения, обработанного tagger и goldStandart для этого случая. Два слова (to be) определены одним тэгом или каждому приписан свой тэг? С полным математическим описанием модели повременю до разрешения этого вопроса.... Это сообщение отредактировал(а) Zuzu - 25.1.2007, 12:18 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
Собственно, вопрос с to be, ИМХО, не особенно важен - можно и проигнорировать этот артефакт на этапе (объектной) реализации
Предлагаю вашему вниманию, дамы и господа, скелет программы, как бы я это все реализовывал. Предвидя вопросы типа, "почему так сложно", "можно написать по-другому" - да ради бога! Перл предлагает массу способов реализации одной идеи! Каждый выбирает для себя сам то, что ему ближе. Лично мне "ближе" мыслить объектами, в рамках тех реальных объектов (сущностей) для которых пишется задача. И в своей работе я готов смириться с тем, что придется писать больше кода (ведь каждый класс необходимо реализовать!). Тем более, как показал предыдущий пост от LisaST, внести коррективы в код в связи с появлением нового артефакта, который укладывается в математическую модель, не представляет большого труда (hазговор про подсчет промежуточных результатов).
P.S. Код, естественно, не тестировал. Классы-то не созданы и их свойства, методы и интерфейсы не определены! Вот так. Спасибо тем, к то осилил чтение кода до конца! Это сообщение отредактировал(а) Zuzu - 25.1.2007, 14:13 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Ух ты! Zuzu, это круто!
Я, собственно, вклиниваюсь в обсуждение, чтобы предложить простенький вспомогательный скрипт, предназначение которого - навести статистику тэгов. Надеюсь, пригодится, хотя бы затем, чтобы получить список всех употребленных тэгов. Тестировался этот скрипт над результатом работы CRFTagger, для других тэггеров, возможно, придется немного поменять код. Печатает он сам тэг и сколько раз этот тэг встретился в файле. Если нужна статистика по словам, помеченным этим тэгом, то нужно в 3-й строке заменить 0 на 1. Файл скрипту нужно подавать в качестве параметра.
Zuzu, респект! Благодаря твоим стараниям даже мне стали примерно понятны условия задачи. Еще бы кусочек пресловутого goldStandart... |
|||
|
||||
Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
amg, спасибо за отзыв! Рад, что "пролил свет" на задачу. Самому было интересно разобраться. Неравнодушен я к поянтиям типа "релевантность".
Кстати, я там, как разработчик, немного слукавил с подсчетом промежуточных результатов. Считаю их для каждых 1000 строк, а не для обозначенных процентов. Дело вот в чем. Если нужно реально считать именно по процентам, то нужно знать количество строк (или слов) в исходном тексте. Для этого его необходимо пройти сверху вниз еще один раз перед тем, как анализировать сами слова. Как говорится, дополнительный проход по файлу в 9Mb.. Оправдано ли это? Если бы таковы были начальные условия, то при реализации хранилища (класса Storage, от которого, собственно, порождены классы TagStorage и GoldStorage) я бы, конечно, это сделал, но написал бы в коде ехидный комментарий типа: "Эх вы! Горе-заказчики! Если бы вы убрали из начальной спецификации это условие, программа бы работала в 2 раза быстрее!". ;) --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
LisaST |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 8.4.2006 Где: Munich Репутация: нет Всего: нет |
я не имела ввиду полностью удалить знаки препинания, просто "/" удалился , а знаков везде по 2 осталось например:
надо будет просто дополнить <regex>
к проблеме объединенных тегов: iz goldstandard
------------------------------------------------------------------------- iz test
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>
Это сообщение отредактировал(а) LisaST - 25.1.2007, 21:55 |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |