egorlakomkin / hse_disambiguation Goto Github PK
View Code? Open in Web Editor NEWhse_disambiguation
hse_disambiguation
Статус по корпусам:
Разложить корпуса в: data/raw
— исходные, data/processed
— обработанные.
Вам предлагается сделать упражнение на реализацию алгоритма Витерби.
Пусть множества 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)
data/mystem_xml
Хотим сделать статью на http://aistconf.org. Идея: сравнить на НКРЯ снималки омонимии на основе HMM, MEMM, CRF. Дедлайн подачи статьи -- 10 февраля.
Написать скрипт, собирающий статистику b_ij = P(x_j | y_i) — вероятность появления j-го наблюдения (функции от слова, для начала окончания) из i-го состояния. NB: при пересчете частотных статистик в вероятность лучше сохранять результат как log-вероятность (log p = log (k / n) = log k - log n), потому что числа вероятности буду очень маленькие и очень быстро можно огрести проблем с численной точностью.
На выходе нужно получить:
Собрать статистику переходов по скрытым состояниям в HMM: P(тег|предыдущий тег).
Написать скрипт, собирающий статистику a_ij = P(y_j | y_i) — вероятность перехода из i-го состояния (тега) в j-й. NB: при пересчете частотных статистик в вероятность лучше сохранять результат как log-вероятность (log p = log (k / n) = log k - log n), потому что числа вероятности буду очень маленькие и очень быстро можно огрести проблем с численной точностью
<se>..</se>
)Собрать информацию, какие грам. признаки в каких корпусах есть, и как они соотносятся, чтобы в перспективе сделать приведение к одному формату.
== Мул. :)
python generate_folds.py \
--train_data_path=data_mystem/mystem_txt/ \
--test_data_path=data_mystem/gold/ \
--experiments_path=experiments/ \
--number_of_folds=5
Разбиваем сначала случайным образом, потом на примерно равные по размеру группы.
== Как устроен эксперимент
${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 ]
Давайте назовем тегсетом (tag set) набор грамматических тегов в одном разборе слова (S,ед,м.р.,…). В чем у нас сейчас проблема? В том, что на сложной разметке у нас теряется соответствие между тегами в разных корпусах и mystem-е. Давайте временно на это забьем и будем сравнивать тегсеты только по существенной их части: по части речи, падежу, числу, роду и лицу со временем.
Работаем с корпусом standard2.rar.
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.A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.