Pull to refresh

Comments 39

Вот бы в в топе статей была статья про топ статей.
UFO just landed and posted this here

Для нормализации можно использовать один из существующих стеммеров
Проще всего установить стеммер от Яндекса (yandex mystem), который достаточно хорошо работает с русскими словами и работает как сервис (все вычисления происходят на сервере)

Спасибо, поэкспериментирую. Хотя сомневаюсь, что они дадут сделать 200тыс запросов «без регистрации и SMS» :)

Если кому интересно попробовать, исходник в CSV тут: cloud.mail.ru/public/GgYT/KEXDzixsS

Mystem.exe я вызываю локально из R. Вполне хорошо работает. Для питона рекомендую pymorphy2. Это вообще огонь.

А я раньше дергал из R питоновский pymorphy2, но потом обнаружил udpipe, который очень прилично работает с русским языком.

Почему-то моя попытка использовать udpipe показала, что леммы получаются для некоторых слов странные, с опечатками. Я повторю, для некоторых. Но если эти странные словоформы увидят главные редактора (лингвисты и гуманитарии), мне будет очень не удобно.

Еще один нюанс. Оказалось, что вызов основного лемматизирующего метода в udpipe не параллелится, потому что модель факт. лежит на диске и к ней осуществляется вызов по ссылке, получается ошибка. А это очень жаль, потому что хотелось бы параллельное исполнение, ибо материала очень много. Я пробовал это с помощью doParallel если что.

Не быстро, но дадут)

Спасибо за файлик ) Теперь когда я хочу что то найти на хабре я делаю например так:
awk -F "," 'BEGIN {i=0} {if ($3 ~ /Redis/) {print $1 " " $3 " " $2;i++}} END {print "Total: " i "/" NR}' habr_all.txt
pymorphy2 весьма неплох

Заголовок спойлера
# coding: utf-8
import pymorphy2
import string

class Normalizer(object):

    def __init__(self, space_chars='\t\n\r', strip_chars=string.punctuation, min_word_len=3):                
        self.min_word_len = min_word_len
        self.parser = pymorphy2.MorphAnalyzer()
        self.translator = str.maketrans(space_chars, ' '*len(space_chars), strip_chars)
    
    def normalize(self, sentense):
        sentense = sentense.translate(self.translator)
        words = sentense.split(' ')
        norm_words = [
            self.parser.parse(word)[0].normal_form for word in words 
            if len(word) >= self.min_word_len
        ]
        return norm_words

norm = Normalizer()
print(norm.normalize('Хабрамегарейтинг: лучшие статьи и статистика Хабра за 12 лет. Часть 2/2'))

# >>> ['хабрамегарейтинг', 'хороший', 'статья', 'статистика', 'хабра', 'год', 'часть']

Спасибо. Уже попробовал, вполне неплохо работает.
Набрал в гугле «программа анализа текста» и получил кучу ссылок. Задача очень востребованная. Есть он-лайн и офф-лайн ПО, есть бесплатное, есть с бесплатным пробным периодом. Похоже есть что выбрать для данного исследования.

Давайте 3 часть: предсказание рейтинга публикации по тексту публикации, с токенизайией, ембеддингом и deep learning ом.

Отличная идея! Было бы интересно: загрузить в прогу черновик статьи и получить прогноз по рейтингу, а потом сравнить с реальностью. А если кроме прогноза будут советы по улучшению, то будет вообще бесценный инструмент. Выдают ведь компиляторы «варнинги» на строки в исходном коде, где высокая вероятность ошибки, м.б. и для естественного языка что-то подобное (пусть и несложное) возможно?

It's doable. Я реализовал эту идею в ТАССе: модель предсказывает рейтинг статей. Про остальное попозже отвечу.

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

С текстом посложнее. Как вариант текст будет многомерным временным рядом и обучаться будет рекурр.сеть. Как там оптимизировать входы это вопрос. Даже если все получится, не факт, что «оптимальный» с тчк.зр. нейронки текст вообще будет читаться. Но вопрос интересный, да. Как минимум, можно написать класс «новость» (хе хе я уже мыслю как на работе), который будет содержать метод перестановки абзацев и предложений, да и слов в предложении. Рекуррентная сетка будет давать разный отклик на один и тот же текст с разным позиционированнием слов.
Если я правильно понял, то есть модель, которая предсказывает рейтинг статей, но объяснить почему получился низкий или высокий рейтинг она не может. Это открытая проблема ИИ, на Хабре был ряд публиказий на эту тему. ИМХО цель не чтобы программа переписала статью, а чтобы она показала что конкретно ей понравилось и не понравилось в статье. Как компилятор сообщает «данная переменная нигде не используется», «функция может вернуть неопределенный результат». Чекер в Ворде пытается улучшать тексты, но получается у него не очень. ИМХО тут нужно найти золотую сердину не замахиваясь на слишком многое.
Ну, да. Проблема открытая, она жутко сложная по реализации, даже если понятны примитивы.

Ну, вот, пользователь читает ПРЕДЛОЖЕНИЯ. Например, «ии от компании х выиграл у людей в игре z. Тут все важно, комбинация слов важна, то есть, предложение. Сама по себе тема ИИ уже оскомину набила. Компания какая-то мало кому известна, игре уже 20 лет, а игроки сотнями партий проигрывают. Но в связке, можно сказать, максимизирует счастья энтропия предложения. Вот как это выделить в виде фактора требующего улучшения вопрос хороший.
Но в связке, можно сказать, максимизирует счастья энтропия предложения. Вот как это выделить в виде фактора требующего улучшения вопрос хороший.
А как существующая модель предсказания рейтинга выделяет? Или она не учитывает такую энтропию, а делает прогноз по другим параметрам и другим предложениям?

И не менее интересный вопрос: от чего в основном зависит рейтинг? Если смотреть по комментам, то у меня с большим отрывом от прочих моих комментов идет:

> как вы проверите?
Подключим центрифугу и посмотрим нормально ли она работает:)


Ну, удачно пошутил и не более того. Может удачная шутка в статье гораздо важнее оскомины от темы?
А как существующая модель предсказания рейтинга выделяет? Или она не учитывает такую энтропию, а делает прогноз по другим параметрам и другим предложениям?


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

Если подставлять разные последовательности слов и предложений НС выдает разный результат даже для текстов с одним и тем же смыслом. То есть это более гибкий подход, чем, например, старый добрый мешок слов, где поф. на последовательность, а важна частота термина.
Интуиция здесь отпадает потому что это просто игра в цифирь. Нейронка видит например вектор слов (которые сами вектора) длиной 300 пропускает это дело через рекуррентный слой, а на выходе решает регрессионную задачу минимизации СКО ошибок. То есть тут нет мега крутой философии и логики
Философия однако есть — интересный философский вопрос: почему предсказывает правильно (м.б. не всегда), если «просто игра в цифирь»? Если логически труднообъяснимо, то философски еще более интересно ;)
Это черный ящик, раз предсказывает хорошо, значит тексты несут в себе ту изюминку, которая разрастается в популярность. Я хотел попробовать подход прозрачный ящик, в ходе которого токенам присваивались бы веса значимости и тогда все становится понятно. Пример на новостях — текст содержит слова «самолет», «взрыв», «теракт». Можно сделать регрессионную модель, которая посчитает вклад каждого слова в финальный коэффициент популярности текста. И тогда все ясно- чем больше определенных слов, тем популярнее текст. А с нейронкой не так просто. Там очень сложная вложенная формула с сотнями нелинейных функций и тысячами параметров. Сложно разобрать.
А с нейронкой не так просто. Там очень сложная вложенная формула с сотнями нелинейных функций и тысячами параметров. Сложно разобрать.

Ok. Ожидаемый ответ. Часто отмечают:
Нейросети известны своей непостижимостью – компьютер может выдать хороший ответ, но не сможет объяснить, что привело его к такому заключению.

Вики пишет:
Иску́сственная нейро́нная се́ть (ИНС) — математическая модель, а также её программное или аппаратное воплощение, построенная по принципу организации и функционирования биологических нейронных сетей — сетей нервных клеток живого организма.
Однако строго не доказано, что это достаточно полная и адекватная модель, и что мозг человека работает так, как модельная нейросеть. Просто мы недостаточно знаем, как он работает.

Многие задачи могут быть решены разными способами. Нпр, тут я привел не-ИИ решение задачи, которую ранее решали генетическим алгоритмом.

Другой более известный пример на эту тему. М.М.Ботвинник безуспешно пытался научить ЭВМ игре в шахматы. Так как играет он сам. Потом это удалось с помощью альфа-бета алгоритма. Но не один живой шахматист не использует альфа-бету.
Я хотел попробовать подход прозрачный ящик
Непросто будет найти такой эффективный подход.

Не все обязательно решать НС. Но ее мощь велика. Точной теории почему она работает нет, но ясно, что там моделируются нелинейные зависимости, а градиентный спуск почти всегда даёт приемлемый ответ.

Но ее мощь велика.

Да.
Точной теории почему она работает нет

Важное замечание.
градиентный спуск почти всегда даёт приемлемый ответ
Ключевое слово "почти всегда". Действительно, если модель не всегда, а в 90 случаев из 100 будет давать верный прогноз рейтинга статьи — это будет отличный результат. И вопрос
почему нейронным сетям повсюду мерещатся овцы
будет выглядеть скорее теоретически-философским, чем практическим. От десятка неверных прогнозов катастрофы не произойдет. Но вот если робомобиль в 10 случаев из 100 не сможет объехать пешехода, то такой результат вряд ли стоит считать приемлемым. Ситуацию можно сравнить с эвристическими алгоритмами (не обязательно из области ИИ): для многих задач приемлемо, если алгоритм не всегда, но достаточно часто дает верное решение. При этом корректность такого алгоритма не доказывается: может потому, что автор не смог придумать доказательства (может оно и в принципе невозможно), а может и потому, что автору просто лень возиться с доказательством ;)
Отдельный вопрос: интересно, а сколько процентов от этих «топовых» статей сохранили актуальность?
Обсуждение QIP, инвайтов на Google+, множество других устаревших материалов…
Я думаю так — модель будет опираться не на сами ключевые термины (хотя отчасти и на них), а на контекст их использования. Поэтому некоторую обобщающую способность можно выжать, типа если речь про сетевые технологии, то средненько, а если про большие компании, то побольше.

Вот лично мне реально интересно, сможет ли НС научиться меняющимся моде и духу самого сообщества, включая также меняющийся лексикон и просто привычки. Юмор туда же. Думаю, хорошая статья, набравшая много лайков, затрагивает глубинные чувства людей (масс) и разговаривает на их языке. По этому принципу можно наклепать до черта материалов, которые будут просто приятным чтивом.

Если нейронка сможет обобщать эти абстракции то это будет большой вин для машин.обуч.
Вопрос.
А код запросов на синхронном питоне?
Просто для такого кол-ва запросов было бы неплохо асинхронный Python(aiohttp) или вообще на чем-нибудь быстрее питоне
Запросы специально делались в один поток, чтобы не нагружать сервер.
Интересно посмотреть на топ-n комментариев за все время
Спасибо, только сейчас узнал, что есть хабрастатьи на английском. При подписке на узкий список хабов можно что-то упустить.

Кстати, заметил два дубликата в списке по относительному рейтингу: «Про системного администратора, обыски...» и «Русский н##бизнес».
Это не ошибка парсинга, эти статьи действительно выкладывались повторно — ID разные, а редирект ведет на ту же самую статью.
Логично было бы оставить только таргет-статью, а в топ включить следующую по сортировке (21-ю в случае с одним дублем в топе).
Да, в рейтинг добавлена 21я статья, если внимательно посмотрите :)

Я оставил дубль т.к. сам эффект мне показался интересным, я например не знаю как редирект со статьи на статью сделать. Возможно некоторые популярные статьи перевыкладываются редакцией периодически.
Прошу прощения, проглядел этот момент.
Жаль, тот самый коммент, собравший больше +1000, окончательно выпилили. Раньше он был доступен из закладок, но увы.
UFO just landed and posted this here
Символично, что в топах статей на русском нет ни одной (я не нашёл), которая была бы посвящена алгоритмам, математике и прочим «серьёзным» вещам. Зато есть про фотографии Лоуренс, «IT-эмиграцию» и «русский наебизнес».
В то же время на английском есть про фильтры Калмана и каринг в C++14, хотя статьи на английском появились относительно недавно.
Sign up to leave a comment.

Articles