Andrew Krizhanovsky edited section_Thesaurus_expansion_algorithm_word2vec__.tex  about 8 years ago

Commit id: cd3c494e675d3bea4a80bf2b76ee99a62b4d21ef

deletions | additions      

       

\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).