Как стать автором
Обновить

Комментарии 39

НЛО прилетело и опубликовало эту надпись здесь

Не, до ленты не дотягивает. Только что: 17:27 Жена полковника Захарченко оказалась успешным бухгалтером с конем

Шедевральные заголовки получились
Как будто Рент-тв посмотрел))
А это
Нетрезвый задержанный спровоцировал Госдуму

вообще видимо документалка
Как-то мимо прошло. Посмотрю, спасибо за наводку.
а это не тоже самое только на чистом TF?
Нужен конкурс «Найди настоящую новость среди фейковых»
Плот-твист — все новости настоящие
> минимальный набор продуктов в россии резко подорожал почти до 72 лет

и тут мне стало страшно
Я тоже заметил резкое падение уровня на ленте. А куда ушла старая команда?
Meduza

При чем на самом деле резкое падение случалось в последние 2-3 месяца. С 2014 года было плавное снижение, а вот сейчас явно редакторская политика.

Да, я тоже что-то в прошлом году не помню обилия постов «ученые выяснили, к чему приводит секс» и все в таком духе.
Тоже развлекался с этой темой… Интересно бы почитать о принципах подбора параметров для разных типов сетей. (кол-во слоев, нейронов, размерность вектора для embedding)
В ноутбуках на гитхабе я пробовал разные конфигурации (кол-во слоев, их размер), но все они давали примерно одинаковые результаты. Если есть желание, можете попробовать более глубокую сеть сделать — там нужно лишь изменить гиперпараметры и немного поправить код. Я пробовал и 3 скрытых слоя с 256 ячейками в каждом, но в этом случае сеть начала просто запоминать заголовки, даже с дропаутом.
Ну вот я о том же… Может наталкивались на какие-то теории касательно этого?
По моим ощущениям, в моем случае, при работе со словами как символами мне, как минимум, не хватало корпуса текстов для обучения. Я пытался сократить словарь разбивая слова на «основу» и «окончание» и использовать их как отдельные символы или даже делать отдельные сетки на «основы» и «окончания» и потом из них собирать… пробовал разбивать просто на «псевдослоги» и т.п. Вобщем, всячески пытался уменьшить размер словаря, т.к., ИМХО, соотношение размера корпуса текстов к словарю нужно максимизировать.
Но так пока и не понял принципа подбора размеров сетей и кол-ва слоев от размера словаря, к примеру.
Еще пробовал играться с сеткой seq2seq. Тоже, неплохие результаты, но хорошими их не назовешь :)
Здесь наверно сначала стоит решить, что мы хотим улучшить?
Это может быть более точная формулировка смысла, или просто лучшая согласованность слов в предложении, или еще что-то… И в любом случае, размер сети вряд ли здесь будет определяющим фактором. Я написал, что пробовал, например, приводить слова в нормальную форму. Но это ничего не дало.
Скорее, понадобится больше пре- и пост-обработки.
Например, в для смысла необходимо будет использовать семантически размеченные корпусы (они есть, но это работа в процессе). Для согласования слов можно попробовать поиграться с pymorphy2, но тут опять же нужна семантика, разбор предложения на части, выделение иерархии, чтобы согласование проводить по подчинительным связям.
В общем, мне кажется, что в плане повышения качества генерации я уперся в потолок, а дальше моих знаний NLP пока не достаточно, чтобы проделать то, что я описал выше.
выделение иерархии, чтобы согласование проводить по подчинительным связям

ИМХО вот это вот как раз и не нужно.
Наш девиз — проще, выше, умнее.
AOT безусловно молодцы, но не стоит усложнять. Нам не нужно понять смысл, нам нужно сгенерить правдоподобный текст. Максимум генерить текст в контексте чего-то из реального мира (например генерить новости по курсу биткоина или другому хайпу). Гораздо больший эффект даст доработка словаря (Пескова думаю в большинстве морфологических словарей не будет, и его если и разберут, то как кузявую калушку).
Ну, размер, тип используемых сетей и другие параметры, на мой взгляд, все-таки важны, как и данные на которых учить. У меня, игры с кол-вом слоев LSTM и их размерами, добавление туда Embedding слоя и игры с его размерами давали отличные(разные) результаты, но проследить понятную закономерность я не смог.
Меня напрягает, что я смотрю на все это, фактически, как на черный ящик… Нет, я поверхностно понимаю основные принципы слов NN, RNN, embedding, LSTM и т.п., но как подбирать их комбинации и их параметры это для меня открытый вопрос, и что-то я пока понятных материалов по этому поводу не нашел…
И в приложении к этой или похожей задаче, ооочень не хочется выходить за рамки NN. Даже привлекать pymorphy2 не хотелось бы, в конце-концов, слабо нейронке самостоятельно найти закономерности согласования слов в предложении :)
Еще, мне видится, что нужно частично задействовать идею из seq2seq, т.е. работа, в некотором роде, со смыслами фраз.
Но, вот тоже уперся в потолок знаний.
И в приложении к этой или похожей задаче, ооочень не хочется выходить за рамки NN. Даже привлекать pymorphy2 не хотелось бы, в конце-концов, слабо нейронке самостоятельно найти закономерности согласования слов в предложении :)

Вы ошибаетесь.
Человек при работе с текстом/речью пользуется большим массивом знаний которые полностью отсутствуют в тексте. Не только в текущем тексте, но в том числе и в обучающем корпусе. Даже сферическая «идеальная сеть» не сможет решить эту задачу. А наши сети не идеальные. Например живая сеть оперирует импульсами а мы плавным аналоговым сигналом (ну или квантованным, но все равно в сравнении с биологическим меандром — плавным). Обычно мы проводим аналогию между частотой импульсов живой сети и не учитываем их комбинации.
Это еще больше убивает информацию в сети.
В общем без дополнительного источника информации (морфологический разбор, который суть размеченная база морфологических признаков, т.е. по сути предобученная морфологии сеть) ничего путного не выйдет.

Про детерминированность кратко:
Пусть у нас есть база неких анкет на которых мы хотим научиться предсказывать два признака — пол человека и цвет его кожи.
Допустим у нас есть только эти четыре входа:
а) Мужчина
б) Женщина
в) Черный
г) Белый

Допустим на вход из всех возможных вариантов (урезаю заготовку статьи) у нас есть только четыре, и они встречаются с такими вероятностями:
2 — мужчина, черный — 40%
3 — мужчина, белый — 10%
9 — женщина, белый — 40%
10 — женщина, черный — 10%
Тогда мы получаем такой ответ:
50% что это мужчина,
50% что это женщина,
50% что белый,
50% что черный.
Хотя более глубокая интерпретация дала бы нам ответ «с 80% вероятностью у нас или черный мужчина или белая женщина».
Ну или давайте возьмем такую комбинацию:
2 — мужчина, черный — 40%
3 — женщина (цвет кожи неизвестен)— 10%
9 — женщина, белый — 40%
10 — черный (пол неизвестен) — 10%
Мужчина — 40%
Женщина — 50%
Черный — 50%
Белый — 40%
т.е. с небольшим перевесом у нас побеждает вариант «черная женщина».
А такого варианта у нас вообще нет. Это химера.
Правильный ответ «с 90% вероятностью у нас или черный мужчина или белая женщина».
Mendel в комменте ниже хорошо написал.
Автор, полегче, так можно оставить без работы хаброгиктаймовских редакторов-копипастеров!
Больше не буду, опасная тема, действительно.
Заголовки интригующие, жаль на нажимаются :)
Ну что, теперь дело за основным текстом новостей! Мне кажется, здесь тоже можно добиться успеха :)
Хорошо бы сделать генератор заголовков на основе текста новости, вот это действительно будет полезный инструмент.
Эта задача (которую я упоминаю в начале статьи) — text summarization — действительно имеет гораздо большую практическую ценность. В этой области уже довольно много наработок, есть готовые алгоритмы и даже онлайн инструменты (вбейте automatic text summarization в гугле). И я согласен, что это логичный следующий шаг. Осталось найти на это время :)
Надеюсь, что в сообществе найдутся люди, которые этим займутся. Датасет есть, теперь дело в технике.
А как на счет генерации текста новости на основе заголовка?
НЛО прилетело и опубликовало эту надпись здесь
«Brioni получил гран-при азербайджана»
«Теннисист порошенко обвинил авакова в подготовке госпереворота»
«Полицейского-молодожена свою фирменную полоску» — это как в анекдоте про гранату.
«Комик определили девять друзей тесака»
«Кетчуп санкциями из-за поломки лайнера»
Ну и конечно мое любимое: «Пупырышка-гройсман в гонке кибератаки». Это так мило. А главное, что практически все заголовки очень актуальны. И санкции вам! И кибератаки!
Спасибо автору! Теперь я знаю как они это делают )
Для увеличения «семантичности» выдачи (все время вспоминается как адвего у меня передрали статистический анализ текстов и назвали его «семантический анализатор») нужно работать с морфологией и словосочетаниями.
Промежуточной проблемой будет морфологическая омонимия.
Как красиво подавать на вход морфологическую омонимию в детерминированной сети я даже и не знаю. Если просто сложить все морфемы всех вариантов слова (с учетом весов вертоятности) то мы получим смешанный образ.
Возможно такая сеть могла бы отдельно помочь с морфологической омонимией, а уже после отработки омонимии обучать для генерации…
Мысли вслух — морфология дальше границы фразы не распространяется, так что на первом этапе банально разбираем обучающую выборку на фразы. Далее натравливаем морфологический анализатор на наши слова. Из полученных массивов слов с учетом весов (если нет весов, то условно тем вариантам которые идут дальше даем меньше вес, делим на все варианты условные 100%, чтобы у слова у которого только один вариант было 100% веса) создаем все возможные комбинации размеченных слов в фразе (т.е. все варианты разбора фразы) с учетом весов (перемножаем веса входящих слов).
Из полученного набора фраз убираем сами слова, оставляя только наборы морфем.
На этом массиве обучаем сетку.
Далее уже с помощью этой сетки улучшаем разметку морфем у входного текста (по сути снижаем «шум» сигнала, выбирая более вероятный вариант морфологии с учетом контекста).
Это поможет значительно снизить проблему «Песков=>песок».
Что меня явно здесь смущает так это первое слово фразы. У него реально нет контекста (прошлая фраза плохой контекст, его лучше игнорировать), хотя по факту следующие за ним слова тоже могли бы помочь. Единственное что приходит в голову это сделать две сети, обучаемые слева-направо и справа-налево. Ну и складывать/умножать их ответы. Нужен эксперимент.
По словосочетаниям я несколько в сомнениях. С одной стороны это значимая семантическая единица, и их было бы неплохо выделять. С другой стороны выделение здесь банальное — превышение частоты взаимной встречи определенного порога и соответствие некоему шаблону морфологической согласованности. И скорее всего такие вещи сеть сможет отследить сама, без нашего вмешательства.
В идеале было бы скармливать текст сети в виде слова со всеми его морфологическими признаками, и получать на выходе слово плюс морфемы и уже это приводить к согласованной форме, но я не уверен что морфологическая библиотека потянет подобные «кузявые калушата». Отдельная сетка под это дело (на подобии первой, с буквами) была бы самое то, но увеличит сложность разработки.
ПС: Если удастся просто и эффективно решить проблему морфологической омонимии, то это уже будет отличным практическим применением.
Спасибо за конструктивный комментарий.
По поводу учета морфологии — отличная идея! Вполне возможно обучить еще одну сеть только на наборах морфем, а затем соединять результаты сети, работающей со словами, с результатами работающей с морфемами, и получать более красивые результаты. Единственное, что сходу приходит в голову — вероятность переобучиться становится выше. Но это решаемо.
Случайный выбор первого слова фразы сделан для простоты. Обычно заголовки очень короткие — 3-7 слов, и если задавать контекст несколькими словами, то заголовки либо будут выходить длинными, либо не останется пространства для фантазии для сети. Более длинная входная строка скорее применима для генерации самой новости по заголовку.
И да, обучение еще одной сети «справа-налево» тоже могло бы дать более интересные результаты.
В общем, простор для дальнейших исследований большой. Одному (тем более с моими ограниченными знаниями в области комп.лингвистики) это не осилить, так что надеюсь, что найдутся желающие и поделятся результатами. :)
Я предлагал обучение в обратную сторону для того чтобы иметь возможность по контексту разрешать морфологическую омонимию не только для следующих слов, но и для первого (ну и последующим тоже контекст следующего за ним слова будет полезным). Для генерации проще — можно первому слову задать сразу его морфологические свойства и не заморачиваться.

Вообще говоря, мы пробовали добавлять морфологию в своем генераторе поэзии: https://habrahabr.ru/post/334046/
Очень даже хороший прирост качества сгенерированного был. Там есть ссылка на репозиторий с сетью — можно попробовать её за основу взять. У нас сеть училась на очень специфичных стихах — даже интересно, что получится при обучении на заголовках :)

Мысли вслух, очень грубыми штрихами… Если абстрагироваться — человеку приходит мысль(образ), после этого он подбирает под нее слова и строит из них фразу. Обратный процесс тоже работает. Близко к этому алгоритму работают алгоритмы перевода у гугла(если не ошибаюсь) и есть упрощенная готовая схема seq2seq…
И согласование слов дать на откуп NN, вопрос только на чем и как учить…
Ну размеченных корпусов полно.
Но как-то не особо выходит.
ИМХО одной из причин усложняющих задачу является то, что наши сети детерминированные, а биологические нет. Это лишает возможности сделать хорошую обратную связь между разными уровнями. Например в вашем случае — выбрал слова, но на этапе построения фразы понял что это слово плохо сочетается с другим словом. Заменил его на другое, ведь у нас не просто выбор самого весомого, а сразу все варианты слов идут.
Вообще в вопросе построения фраз мне нравится наблюдать за детьми.
Например у моего младшего (2,5лет) есть устойчивое выражение — «открой мне», которое «по-русски» означает «отпусти меня». Но даже на детском диалекте оно вполне себе понятно… в контексте. Когда у него вырастет словарный запас его сеть будет по прежнему предлагать ему и этот вариант, но более правильный будет перевешивать.
Вместе с тем если не давать человеку контекста то интерпретация фразы будет невозможна:
1) «я взял ребенка на руки, чтобы он не баловался со спичками, и он мне сказал: Открой мне!» — в принципе можно догадаться что имеется ввиду «отпусти меня»
2) «ребенок сказал: открой мне!» — скорее всего мы поймем что ребенок просит открыть что-то что ему дали или он взял. Конфету, сок и т.п.
3) «ребенок 2,5 лет сказал: открой мне!» — наверное просит что-то открыть, но может вообще «молись и кайся»… если что-то похожее встречалось в опыте, то будет два варианта — или открыть что-то, или отпустить. Но без контекста выбрать не удастся.

Ну а контекст уже у другой сети (в другом полушарии, в другой зоне мозга, на другом чипе, в другом слое — не суть). Он даже вполне может быть. Но в другой сети. И мы его потеряли выбрав одну интерпретацию.
Киберпанк, который мы заслужили
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.