this is for holding javascript data
Andrew Krizhanovsky added section_Thesaurus_expansion_algorithm_word2vec__.tex
about 8 years ago
Commit id: 19978e07179c9f6253fd4cd4951bedee84ad3fe7
deletions | additions
diff --git a/section_Thesaurus_expansion_algorithm_word2vec__.tex b/section_Thesaurus_expansion_algorithm_word2vec__.tex
new file mode 100644
index 0000000..2728c1e
--- /dev/null
+++ b/section_Thesaurus_expansion_algorithm_word2vec__.tex
...
\section{Thesaurus expansion algorithm}
Цитата из Стругацких:... (примерно: ответы есть. На какие вопросы?..)
Благодаря интеграции данных корпусов (в модели, построенной программой word2vec) и тезаурусов (тезаурус Викисловаря) мы с минимальными усилиями получаем ответы на множество важных вопросов. Например, такая прикладная задача как поиск семантически близких слов:
\textbf{Гипотеза 1:} пусть в синсете два или более синонимов. Разобъём синсет на два непустых множества. (1) При добавлении слова к первому или второму набору расстояние между наборами уменьшается тогда и только тогда, когда (2) добавляемое слово является синонимом.
\textbf{Закон векторных синсетов (неформально):} близость слова к среднему вектору синсета определяется степенью его синонимичности этому набору синонимов.
Пусть $\vec{v_1}, \vec{v_2}, \ldots, \vec{v_n}$~--- это вектора для слов $w_1, w_2, \ldots, w_n$, входящих в набор синонимов (синсет) $S$. Средний вектор векторов $\vec{v_1}, \vec{v_2}, \ldots, \vec{v_n}$ обозначим $\vec{v_{avg}}$. Слову $y$ будет соответствовать вектор $\vec{Y}$.
\textbf{Закон векторных синсетов (формально):} Для синсета $S$ существует такое $\epsilon$, что любой вектор $\vec{Y}$, находящийся на расстоянии $\epsilon$ (1) от среднего вектора $\vec{v_{avg}}$ или (2) от любого из векторов $\vec{v_1}, \vec{v_2}, \ldots, \vec{v_n}$, или (3) от n-мерного выпуклого конуса, задаваемого векторами $\vec{v_1}, \vec{v_2}, \ldots \vec{v_n}$, будет соответствовать слову $y$ синонимичному синсету $S$.
Примечания:
\begin{enumerate}
\item Подсчитать определитель матрицы, составленной из векторов $\vec{v_1}, \vec{v_2} ... \vec{v_n}$. Если не ноль, то конус, составленный из векторов $\vec{v_1}, \vec{v_2} ... \vec{v_n}$ будет n-мерным. В противном случае размерность будет ниже.
\item Выпуклость конуса даёт возможность рассматривать \textit{линейные комбинации} векторов (слов) с положительными коэффициентами.
\end{enumerate}
Алгоритм проверки гипотезы (2)$\implies$(1):
\begin{enumerate}
\item Input data: $L$~--- list of synonyms (synset) (What about antonyms, hyponyms, hyperonyms?)
\item Split L to two subsets: $l_1$ and $l_2$. Известно, что оба этих списка являются синсетами (synset) для одного и того же слова $w$. (Можно рассмотреть аналогичные списки антонимов, гиперонимов...)
\item Обойти все слова в словаре. Для каждого слова $w$:
\item Вычислить расстояние между двумя подмножествами слов с помощью функции n_similarity так: $sim_0$ = model.n_similarity ($l_1, l_2$)
%\footnote{Currently, gensim takes the mean vector of each set of vector, and then computes the cosine similarity of the resultant vector means. Source: \href{https://groups.google.com/forum/#!topic/gensim/LYD6bIZC8aI}{Gensim's approach to cosine similarity for sets of vectors (ie, n_similarity)} // gensim Google Group, 2015}
\item То же, но заданное слово $w$ добавляется к первому подмножеству: sim_1 = model.n_similarity ($l_1 + w, l_2$)
\item Ко второму: sim2 = model.n_similarity ($l_1, l_2 + w$)
\item if( $sim_1 < sim_0$ AND $sim_2 < sim_0$ ) then $ w \rightarrow L$ // Если добавление слова $w$ сближает подмножества, то это слово является синонимом (добавляем это слово в синсет $L$).
\end{enumerate}
\begin{definition}
Границей синсета $S$ называется множество $Bd S= S\setminus Int S$ (synset's edge)~$s$~--- это такие синонимы из $s$, добавление которых в любые непустые разбиения синсета не сближает средние вектора этих разбиений.
\end{definition}
Проверка гипотезы с помощью "положительного" эксперимента (слово $w$ заведомо является синонимом):
\begin{itemize}
\item перебрать все синсеты Викисловаря:
\item Берём синсет, исключаем из него одно слово.
\item Пробуем включить это слово обратно в синсет с помощью указанного выше алгоритма.
\item Получаем статистику - для скольких синсетов и слов алгоритм дал добро на включение (в идеале - 100 процентов), но исходные данные могут быть с ошибками.
\item Получаем список слов и синсетов, на которых алгоритм "спорит" с редакторами Викисловаря и не включает слово в список синонимов. Анализируем этот список вручную. Считаем ошибки.
\end{itemize}
Проверка гипотезы с помощью "нейтрального" эксперимента (берётся произвольное слово $w$): ..?
Открытые вопросы к алгоритму (нужна экспериментальная проверка):
\begin{itemize}
\item Разбиение исходного списка L. Если перебирать все разбиения, то условие включения слова в синсет: (1) должно выполняться для всех разбиений или (2) хотя бы для одного разбиения?
\item ещё?
\end{itemize}
Рассказать про RusVectores\cite{Kutuzov_2015}.
+ Ссылка на работу RadimHurek (Gensim).