Giter Site home page Giter Site logo

hse_disambiguation's People

Contributors

dariaryzhova avatar egorlakomkin avatar olgayasko1 avatar sandello avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar  avatar

hse_disambiguation's Issues

Собрать статистику для HMM: тег->тег

Собрать статистику переходов по скрытым состояниям в HMM: P(тег|предыдущий тег).

Написать скрипт, собирающий статистику a_ij = P(y_j | y_i) — вероятность перехода из i-го состояния (тега) в j-й. NB: при пересчете частотных статистик в вероятность лучше сохранять результат как log-вероятность (log p = log (k / n) = log k - log n), потому что числа вероятности буду очень маленькие и очень быстро можно огрести проблем с численной точностью

Упраженение про алгоритм Витерби

Вам предлагается сделать упражнение на реализацию алгоритма Витерби.

Пусть множества X и Y, матрицы A и B и начальное распределение p заданы извне. К примеру, в примере с солнышком:

from collections import defaultdict
Y = set([ 'sun', 'rain' ])
X = set([ 0, 1 ])
A = defaultdict(lambda: defaultdict(float))
A['sun']['sun'] = 0.5
A['sun']['rain'] = 0.5
A['rain']['sun'] = 0.5
A['rain']['rain'] = 0.5
B = defaultdict(lambda: defaultdict(float))
B['sun'][0] = 0.2
B['sun'][1] = 0.8
B['rain'][0] = 0.8
B['rain'][1] = 0.2
p = defaultdict(float)
p['sun'] = 0.5
p['rain'] = 0.5

def get_viterbi_probability(x, X, Y, A, B, p):
  pass # Посчитать max_y P(y|x)

def get_viterbi_path(x, X, Y, A, B, p):
  pass # Посчитать y = argmax_y P(y|x)

Разложить корпуса в Dropbox

Статус по корпусам:

  • OpenCorpora: перетащить из GH в Dropbox (@EgorLakomkin)
  • Диалог: надо найти и положить в Dropbox (@DariaRyzhova)
  • НКРЯ: у Оли взять текущий кусок и положить в Dropbox + написать Оле Ляшевской по поводу большого корпуса (@olgayasko1)

Разложить корпуса в: data/raw — исходные, data/processed — обработанные.

Этап #1 "Новогодний"

Глобальный TODO

Давайте назовем тегсетом (tag set) набор грамматических тегов в одном разборе слова (S,ед,м.р.,…). В чем у нас сейчас проблема? В том, что на сложной разметке у нас теряется соответствие между тегами в разных корпусах и mystem-е. Давайте временно на это забьем и будем сравнивать тегсеты только по существенной их части: по части речи, падежу, числу, роду и лицу со временем.

Работаем с корпусом standard2.rar.

  • Прогнать корпус через mystem.
  • Померить baseline (частотное снятие).
  • Померить HMM.

Локальное TODO

@sandello:

  • Посмотреть на Витерби от Даши (сделаю в начале следующей недели). По возможности вообще посмотрю на весь ваш текущий код и раздам медальки. :)
  • Узнать про lemmer-test и посмореть на запускалку mystem-а.

@EgorLakomkin:

  • Разобраться с файлами из Синтагруса.
  • Расширить скрипт оценки качества; в частности, нужно уметь в цикл, где происходит подсчет качества, передавать функцию M(word, true lemma, predicted lemma, true tagset, predicted tagset), которая будет измерять совпадение истинного разбора (true lemma, true tagset) и предсказанного разбора (predicted lemma, predicted tagset) для данного слова (word).
  • Реализовать M(w, tl, pl, tt, pt) = 1 <=> (tl == pl) && (tt == pt). Это метрика точного совпадения; та, что используется сейчас.
  • Реализовать M(w, tl, pl, tt, pt) = 1 <=> (tl == pl) && (tt == pt). Это совпадение в смысле совпадения существенных признаков; существенные признаки -- это как раз часть речи, падеж, число, род, лицо, время (см. глобальный TODO).
  • Сделать ф-ию N(tagset), которая будет канонизировать tagset по каким-либо правилам. Вместо ф-ии M(w, tl, pl, tt, pt) будем использовать сравнение N(tt) и N(pt).
  • Сделать N(t), которая оставляет только часть речи.
  • Сделать N(t), которая оставляет только существенные признаки.
  • Расширить скрипт оценки качества. чтобы можно было передавать туда фунцию P(word, true lemma, true tagset), которая будет говорить, нужно ли учитывать данное слово в оценке или нет.
  • Реализовать P(w, tl, tt) == 1. Это учет всех слов.
  • Реализовать P(w, tl, tt) == 1 <=> (в tt нету ciph, init, abbr). Это учет всего кроме цифр, аббревиатур, etc.
  • Вставить в Витерби ограничение на промежуточные состояния (наши варианты разбора).
  • Сохранение/загрузка статистик для частотной и HMM моделей через cPickle.
  • Обучить по НКРЯ частотную и HMM модель.
  • Собрать по standard2.rar уникальные грам. признаки и сравнить с mystem-овскими.
    • Какие есть грам. теги? (из текущей утилиты)
    • Какие есть нормализованные тегсеты в каждом из корпусов? Какие общие, какие нет? (сделать)
    • Понять, нужно ли адаптировать N(.) под наши нужды (написать письмо с результатами и обсудить).

@DariaRyzhova:

  • Добавить в скрипт оценки качества проверку на совпадение границ предложений и словоформ в золотой и предсказанной разметках. Это нужно для того, чтобы ты смогла запустить скрипт и найти еще места, где твой скрипт, работающий с mystem-ом, дает странный вывод.
  • Завести на Вики (https://github.com/EgorLakomkin/hse_disambiguation/wiki) страничку, где записывать информацию про соответствие тегов между корпусами (см. в конце письма резюме того, что мы обсудили в прошлую среду. См. записи #4 .
  • Научиться резать вывод mystem на предложения.
  • Разобраться со словом "рассс-топппп-татттть", узнать, почему у него в первой колонке не сохраняется оригинальная словоформа.
  • Разобраться, куда деваются цифры в результате разбора.
  • Прогнать НКРЯ через mystem.

Этап #3 "Переосмысление"

== Мул. :)

python generate_folds.py \
    --train_data_path=data_mystem/mystem_txt/ \
    --test_data_path=data_mystem/gold/ \
    --experiments_path=experiments/ \
    --number_of_folds=5
  1. Печатает сообщения, если каких-то файлов не хватает в 1 из директорий.
  2. Для тех файлов, что есть и там, и там: делаем |number_of_folds|
    Генерируем в ${experiments_path}/folds/${i}/train.txt
    Генерируем в ${experiments_path}/folds/${i}/test.txt
    Списки файлов.

Разбиваем сначала случайным образом, потом на примерно равные по размеру группы.

== Как устроен эксперимент

${experiments_path}/${experiment_name}/
 - README.txt
 - log.txt
 - run.py
 - train/
 - test/
 - eval/

О run.py:

  • какой алгоритм берем (и его параметры),
  • как обрабатываем данные (фильтры грам. тегов)

== Бул. :)

python bull.py --action=train --experiment_name=gorky17
Обучит модель.
${experiments_path}/${experiment_name}/

python bull.py --action=test --experiment_name=gorky17
Снимет омонимию по файлам из test.txt.

python bull.py --action=eval --experiment_name=gorky17
Оценит качество.

== Сул. :)

python compare.py --action=t_test --experiment_name=gorky17 --experiment_name=gorky18
python compare.py --action=print_errors --experiment_name=gorky17 [ --fold 0 ]
python compare.py --action=summary_errors --experiment_name=gorky17 [ --fold 0 ]
python compare.py --action=diff_errors --experiment_name=gorky17 --experiment_name=gorky18 [ --fold 0 ]

Собрать статистику для HMM: тег->слово

Написать скрипт, собирающий статистику b_ij = P(x_j | y_i) — вероятность появления j-го наблюдения (функции от слова, для начала окончания) из i-го состояния. NB: при пересчете частотных статистик в вероятность лучше сохранять результат как log-вероятность (log p = log (k / n) = log k - log n), потому что числа вероятности буду очень маленькие и очень быстро можно огрести проблем с численной точностью.

Этап #2 "Аист"

Глобальный TODO

Хотим сделать статью на http://aistconf.org. Идея: сравнить на НКРЯ снималки омонимии на основе HMM, MEMM, CRF. Дедлайн подачи статьи -- 10 февраля.

Локальный TODO

@sandello:

  • :)

@EgorLakomkin:

  • Посчитать частотную снималку по словам.
  • Посчитать HMM по POS-тегам и простым тегам (часть речи, род, число, падеж, время, лицо).
  • Добавить возможность использовать MEMM в пайплане.

@DariaRyzhova:

  • Упражнение с мороженым. :)
  • Изучить, что есть в литературе на тему снятия омонимии (HMM, MEMM).
  • Расширить eval.py, чтобы он считал качество еще на словарных/несловарных словах, а также выводил корпусные статистики: количество слов всего/словарных/несловарных.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.