Category: история

Category was added automatically. Read all entries about "история".

Забавный и редкий случай с глаголом "являться"

Собираю статистику структуры предложений.
В предложениях выделяются именные группы, чтобы свести варианты аргументов глагола к общему знаменателю.
После обработки примерно 50 миллионов предложений вижу такой top 30 шаблонов (решетка отделяет NP-чанки и прочие токены):
Collapse )Обратите внимание на два стоящих рядом шаблона:

1414    NP,Ins#является#NP,Nom,Sing#.
1233    NP,Nom,Sing#является#NP,Ins#.

В них именные группы зеркально отображены относительно глагола, а частоты (ранги?) очень близки.
Редкий случай действительно свободного порядка ИГ для глагола. Для других глаголов носители языка явно тяготеют к тому или иному положению подлежащего, дополнения или PP, возможно используя "неканоничный" порядок для передачи особых "сигналов".

PS от 31-03-2020. Собрана дополнительная статистика (~8 миллионов предложений). Как и раньше, паттерны с глаголом "являться" значимо выбиваются из общей картины своей симметричностью:
Collapse )

Еще можно заметить странное доминирование конструкций с глаголами состояния, обладания. Есть подозрение, что это артефакт порядка текстов в корпусе.

Модели синонимичности фраз на Keras и PyTorch

Любой ML'щик время от времени делает две вещи - меняет работу и свой deeplearning фреймвок (js-фронтэндеры понимающе улыбнутся). Работу я поменял в прошлом году, теперь настало время посмотреть на модный PyTorch.

Серьезно говоря, единственная фишка питорча, ради которой захотелось его освоить - хайповые динамические графы. С их помощью делать GAN'ы должно быть намного проще, чем в keras'е, где приходится выкручиваться с необучаемыми частями графа и т.д.

Для разминки сделал на питорче сиамскую рекуррентную сетку, определяющую синонимичность двух фраз. Пример датасета лежит тут, это часть текущего 220-тысячного корпуса.
Старая реализация модели на Keras с кучей экспериментального мусора - тут.
Реализация на PyTorch - тут.
Collapse )

Странная разница в скорости pickle.load в Python 2 и 3

В ходе экспериментов с оптимизацией загрузки словаря в проекте ruword2tags столкнулся с неожиданным эффектом.
Контекст такой:
Collapse )
5) Неожиданный эффект заключается в том, что во 2й версии питона pickle.load работает примерно 60 секунд, в 3й - 6 секунд.

Сделай сам Вольфрам Математику: о пользе цветных маркеров

Вспомнил первый курс института, матан для решения одной из задачек. Час времени утром до начала работы, несколько листов, две ручки и четыре маркера:
Collapse )
И поле битвы:
Collapse )

Странная фича для определения перефразировки вопросов в каггле Quora Question Pairs

Соревнование по определению похожести вопросов закончилось, теперь можно поизучать чужие решения. И пересмотреть еще раз некоторе нюансы в своем решении тоже.

Итак, есть один признак, который я добавил в датасет, не ожидая особого эффекта. Но он оказался достаточно сильным, и это странно.

Вот топ списка фич, выдаваемых xgboost и отсортированных в порядке убывания веса:

Collapse )

Выделенные болдом признаки kenlm_* представляют из себя оценки достоверности фрагментов фразы. Они вычисляются с помощью предварительно построенной языковой н-грамной модели KenLM. Вычисление делается вот так:

Collapse )

То есть берем начало вопроса из нескольких слов. Значения для начальных фрагментов длиной в 8, 16 и 32 слова вычисляются отдельно. Вычисляем оценку для первого вопроса, для второго, сохраняем их в датасете, а также добавляем разницу оценок. Учитывая логарифмический характер оценок, мы фактически определяем относительную оценку.

И ничто в этом алгоритме не подразумевает какой-либо внятной связи получаемых оценок с фактом семантической близости двух вопросов. Вопросы могут формулироваться с использованием разных слов и оборотов, что неизбежно должно давать совершенно нерелевантные фичи.

Но тем не менее xgboost в ходе построения деревьев на каком-то уровне делает вывод, что выгода от учета значения kenlm-фичи больше, чем, например учет похожести предложений на базе информации в WordNet (синонимия и так далее) - см. положение фичи wordnet_sim_0.

Статистика по сочетаемости глаголов и предложных паттернов

Продолжаем обработку статистики. Собираем сочетания глагола (сказуемое или деепричастный оборот) с группой предлог+существительное.
У существительного могут быть атрибуты и дополнения, их в данной статистике мы не учитываем.
Top-100  по абсолютной частоте:

Collapse )

Статистика по коллокациям предлог+сущ

Из результатов синтаксического парсинга собраны предложные дополнения, содержащие только предлог и существительное.
ТОП-100 по частоте:
Collapse )

Можно заметить, что предлоги "лемматизированы", то есть для коллокации "во сне" в статистике появилось "в|сне". Формы существительного оставлены как есть, поэтому "за окно" и "за окном" являются отдельными коллокациями.

Эта же статистика, но ранжировка по mutual information:
Collapse )

2-граммы по 3,000,000 синтаксическим деревьям

Примерно 3 миллиона предложений длиной от 6 до 11 слов обработаны синтаксическим парсером.
В полученных леревьях найдены определенные ребра и собрана статистика их встречаемости.

прилагательное + существительное
Collapse )

существительное + существительное_в_род_падеже
Collapse )

существительное_подлежащее + глагол_сказуемое
Collapse )

глагол_сказуемое + существительное_прямое_дополнение
Collapse )

Пыльца и мёд /// word2vec

У меня появляется ощущение, что по мере роста обработанного корпуса, создаваемые кластеры становятся более осмысленными.

Хотя даже на уровне 700-800 Мб в utf-8 фактор исходников слишком значителен.

Далее некоторые примеры кластеров, которые образовались для лемматизированного корпуса в 750 Мб.

Collapse )

Новые эксперименты с continuous word representation

Закончился пересчет вероятностной модели по полному корпусу (~205 тысяч предложений). POS Tagger заработал почти в полную силу, да вдобавок после чисток в движке процесс пошел явно бойчее, примерно по 500 Мб в сутки. Поэтому я начал с 0 формирование лемматизированного корпуса текстов, которые обрабатывает word2vec.

Утилита для лемматизации корпуса лежит тут: https://github.com/Koziev/Word2Vec/tree/master/Text2Lemmas. Это простая консольная прожка, написаная на C# и использующая solarix_grammar_dictionary.dll для частеречной разметки.

Чтобы было удобнее оценивать кластеризацию визуально, я добавил в toolchain еще одну утилитку для визуализации результатов: https://github.com/Koziev/Word2Vec/tree/master/PrintClusters. Она читает список кластеров из word2vec, читает использованный корпус для составления частот лемм. Затем выводит кластеры построчно с сортировкой слов по убыванию частоты. В итоге, в начале каждого кластера видны самые частотные элементы, а всякий случайный мусор удачно копиться в хвостах.

На ~628 Мб корпусе результаты в целом такие же полосатые, как и раньше.

Под катом примеры "хороших" кластеров для эксперимента с 2000 классов и векторами размером 200. Список слов в каждом показанном кластере усечен, на самом деле их обычно несколько десятков-сотен. Первое число - это условный номер кластера.
Collapse )
Как можно заметить, глаголы, существительные, прилагательные и наречия идут вперемешку. К ним коварно примешиваются предлоги, хотя это выглядит явным артефактом.