Numb3rs, OpenData и HowItWorks

Материал из 0x1.tv

 
(не показано 13 промежуточных версий этого же участника)
[[File:{{#setmainimage:Numb3rs, OpenData и HowItWorks.png}}|right|640px]]

Бывает авторы интересуются статистикой просмотра своих докладов, любопытные — полной статистикой, чтобы поиграться в датасайнс, ну а те, кому надо поиграть в NLP/Text Analysis, или быстро поднять MVP-стартапа на тему «монетизируем контент конференций»
— интересуются, как бы взять все, без гемора с «краулингом-скрейпингом-парсингом».

Или есть даже желание что-то запатчить и законтрибьютить?

Хороший повод кратко рассказать, как все работает и откуда все взять.

== Как все устроено ==
Технически — сайт состоит из self-hosted CMS, где лежат описания докладов и спикеров, [[Blog:HowItWorks/Слайды_на_витрине._Почему_россыпью%3F_PDF_forever!|слайды]], [[Blog:HowItWorks/Vimeo_или_Youtube_—_как_мы_публикуем_видео|видео, залитого на Vimeo и Youtube]], сервиса комментариев на Disqus<ref>Ну, 8 лет назад это был ведущий сервис комментариев, и была надежда, что «самый стандартный сервис комментариев» [[Blog:HowItWorks/Less_is_More._Конференция_—_это_обратная_связь._Будем_ждать_комментариев.|побудит к фидбеку]].</ref>, ну и всякой мелочи. 
Если кратко — то доклады у нас — это обычные статьи, слайды и пикрелейтед к ним лежат в неймспейсе «файл», докладчики у нас — статьи-категории, лежащие в категории 
[[:Category:Докладчики]] (тем, кому уже не напишешь — в [[:Category:RIP]]), конференции у нас — категории в категории [[:Категория:Конференции]] (они могут группироваться в [[:Категория:Линейки_конференций]]), ну а практически все остальные категории
используются для тематической классификации.

{{SideBar40|Тут открытая задача, научится делать краткую выжимку из аннотации под заданное число символов — для публикации в твиттер и прочие соцсети. Сейчас это просто вырезание середины, что конечно, убого.}}

В самой странице текст — mediawiki-разметка, на которой последовательно…
* Cсылка на категорию-автора (или авторов), через шаблон <nowiki>{{Speaker| }}</nowiki>
* блок тега  <nowiki><blockquote></blockquote></nowiki> — аннотация. 
* Встраивание видео с vimeo  и ссылка на видео с ютуба (с шаблонами там думаю, можно понять). 
* Ссылка на слайды если есть. 
** Иногда бывают обьемные тезисы или стенограммы, но в целом это редкость. 
* Ссылка на пикрелейтед, с указанием, чтобы эту картинку выбирали соцсети для превью,
* Ссылки-связи  с тематическими категории. 


В самом конце статьи или категории, идет статистика, в сыром виде  выглядящая как-то так:
<pre><nowiki>
{{stats|disqus_comments=12|median_plays=312|refresh_time=2020-07-07T18:45:21.060970|vimeo_comments=1|vimeo_plays=392|youtube_comments=10|youtube_plays=232}}
</nowiki></pre>
где наверное, все понятно, кроме «median_plays» — это свойство возникает у категорий, как медиана просмотра докладов в этой категории (остальные параметры для категории — это сумма, соотвествующих параметров по включаемым статьям).

Эти в этой категории).

Важное  эти свойства сами не возникают, и realtime не обновляются — приходится отдельным софтом бегать за ними в ютуб-вимео-disqus<ref>Может когда-нибудь и в соцсети, за количеством комментариев, но пока в соцсетях с комментариями у меня тухло</ref>.

---- 
Тут открытая задача, со всякими хитростями (глюки и ограничения API и т.п.).

Итак, если вы захотите помочь мне с открытыми задачами, или что-то поковырять свое, посчитать какие-нибудь метрики, и порисовать картинки и графики, конечно, 
можно слить всю базу через [[Special:Export]]<ref>А если нужно слить все видео  [[Blog:HowItWorks/Как_скачать_видео%3F_Все,_целиком,_или_по_отдельности|вам сюда]]</ref>, потом распаковывать, парсить XML, парсить разметку… наверно это скучно.

Поэтому я предлагаю вам готовый, python-pickle dataset, с самым важным  тексты, статистика-просмотров комментариев, вложенность категорий.

=== Датасет ===

{{SideBar40|Open problems — предложить категории для страницы — максимально узкие и походящие, может несколько. 
* Основной вариант — из существующих категорий.
* Возможно дополнительно показать близкие статьи — чтобы уже вручную создать новые категории.
* Тут явно ML c элементами NTLK
** Т.е. надо и парсить текст, убирать стоп-слова.
** И как-то отклассифицировать, учесть имеющиеся категории
** Большие категории (высокоуровневые, в которых вкладывается много более узких), должны котироваться слабее.
…
Пока делал заходы студентами, получилось не очень.

----
Теперь о статистике 


{{stats|disqus_comments=1|median_plays=312232}}

}}

* http://video.ispras.ru/channels/misc/datasets/0x1tv-dataset.pickle0x1
* Python pickle 
** Два списка  статьи и категории
<code-python>
        self.dataset = {
            'articles': [],
            'categories': [],
        }
(структура не плоская, плюс текст, все это в CSV плохо ложиться), проще в нативный питон.
* Словарь:
;ключ: статьи по заголовкам. 
;значение: словарь с текстом-заголовком и еще одним словарем 'stats', со всей вытащенной статистикой.
Ну как-то так:
<code-python>
import pprint
import pickle
ds = pickle.load(open('0x1', 'rb'))
pprint.pprint(sorted(list(ds.keys()))[:4 абзаца</blockquote></nowiki></pre>
** списка категогий, к которым относится эта статья или категория.
<code-python>
            article = {
               ])

['0MQ  Сокеты на стероидах (Сергей Гулько, OSDN-UA-2012)',
 '10 шагов к лучшему качеству кода приемочных тестов (Вагиф Абилов, '
 'AgileDays-2014)',
 '100%-ный просмотр кода. Зачем и как? (Леонид Савченков, SECR-2013)',
 '19 личностных потребностей, или чего на самом деле хотят пользователи '
 'ИТ-продуктов (Тамара Кулинкович, ProductCampMinsk-2014)']

pprint.pp(ds['19 личностных потребностей, или чего на самом деле хотят пользователи ИТ-продуктов (Тамара Кулинкович, ProductCampMinsk-2014)'])

{
 'id': 42, 
 'title': page.page_title,
              '19 личностных потребностей, или чего на самом деле хотят '
          'пользователи ИТ-продуктов (Тамара Кулинкович, '
          'ProductCampMinsk-2014)',
 'text': ';Докладчик: {{Speaker|Тамара Кулинкович}}\n'
         '<blockquote>\n'
         '</blockquote>\n'
         '== Видео ==\n'
         '\n'
         '{{vimeoembed|104593083|800|450}}\n'
         '{{youtubelink|C5j2u-wrj2I}}{{letscomment}}\n'
         '\n'
         '== Слайды ==\n'
         '[[File:19 личностных потребностей,  или чего на самом деле хотят '
         'пользователи ИТ-продуктов (Тамара Кулинкович, '
         'ProductCampMinsk-2014).pdf|left|page=-|256px]]\n'
         '\n'

         '\n'
         '\n'
         '<!-- topub -->\n'
'{{stats|disqus_comments=0|refresh_time=2020-07-07T18:45:21.060970|vimeo_comments=0|vimeo_plays=39207T19:27:42.310424|vimeo_comments=1|vimeo_plays=119|youtube_comments=0|youtube_plays=87}}',
 'stats': {'disqus_comments': 0,
           'refresh_time': '2020-07-07T19:27:42.310424',
           'vimeo_comments': '1',
           'vimeo_plays': 119,
           'youtube_comments': 0,
           'youtube_plays': 87},
 'categories': {'Категория:HasSpeaker',
                'Категория:ProductCampMinsk-2014',
                'Категория:Тамара Кулинкович',
                'Категория:Управление продуктами'}}

</code-python>
* Каждая статья и категория (
Обратите внимание на еще один фиг) состоит из
** заголовка
** текста  там весь текст статьи, но можно легко вытащить аннотацию  она в 
<pre><nowiki><blockquote>вот тут аннотация обычно на 2-3-page.text(),     
               'categories': []
            }
</code-python>атрибут  <tt>id</tt> статьи. В отличие от имени-названия-урла он неизменен (даже при переименованиях), и он нужен, чтобы ссылаться на ветки комментариев в Disqus (чтобы при переименовании статьи не пропадали комментарии).


{{wl-publish: 2021-08-24 09:28:33 +0000 | StasFomin }}

Текущая версия на 09:48, 24 августа 2021

Numb3rs, OpenData и HowItWorks.png

Бывает авторы интересуются статистикой просмотра своих докладов, любопытные — полной статистикой, чтобы поиграться в датасайнс, ну а те, кому надо поиграть в NLP/Text Analysis, или быстро поднять MVP-стартапа на тему «монетизируем контент конференций» — интересуются, как бы взять все, без гемора с «краулингом-скрейпингом-парсингом».

Или есть даже желание что-то запатчить и законтрибьютить?

Хороший повод кратко рассказать, как все работает и откуда все взять.

Как все устроено

Технически — сайт состоит из self-hosted CMS, где лежат описания докладов и спикеров, слайды, видео, залитого на Vimeo и Youtube, сервиса комментариев на Disqus[1], ну и всякой мелочи.

CMS для сайта основана на MediaWiki c дополнениями из проекта http://wiki.4intra.net, вот Special:Version — детально набор расширений с версиями.

Буду очень рад верстальщику с опытом верстки под мобильные устройства, много лет сам не могу осилить. Ну или дизайнеру. Или даже дизайнеру логотипов/faviconoв, студию лебедева не предлагать.

Вот код дизайна «скина», который использует сервис генерации уникальных бекграундов.

Сверхкраткий ликбез про концепции MediaWiki (википедия и почти все викисайты в интернете).

Основной атом информации там — страница. Page. Уникально идентифицируемая своим заголовком (он же по сути URL страницы). Это очень радикальный ход — уровнять имена, названия, заголовки, идентификаторы и ссылки (то, что всегда разделялось в классических технологиях документирования), и наверное, очень удачный — сильно упрощает гиперссылки, которые становятся двухсторонние, как должно было быть в правильном интернете[2], а проблемы временной нецелостности при переименованиях решают перенаправлениями и догоняющими исправлениями.

Технически, у страницы есть неймспейсы — это то, что в заголовке идет до двоеточия, что выделяет, например, страницы-файлы (картинки-документы и т.п.) из неймспейса «File:»/«Файл:» и категории — неймспейс «Category:»/«Категория:», и страницы-шаблоны (технически ничего специального в них нет, в MediaWiki можно включать внутрь статьи, с параметризацией, любую другую статью, но просто для удобства, совсем уж технические шаблоны-макросы, решено отсадить в отдельный неймспейс).

[svg]


В основном, неймспейсы определяют контекст для операции «ссылка».

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

Да, в отличие от убогих фолксономически классификаций через плоские теги[3], тут достаточно мощный механизм для классификации-категоризации-онтологизации любой предметной области, что и демонстрирует википедия. Хотя конечно, над этим требуется работать.


Если кратко — то доклады у нас — это обычные статьи, слайды и пикрелейтед к ним лежат в неймспейсе «файл», докладчики у нас — статьи-категории, лежащие в категории Category:Докладчики (тем, кому уже не напишешь — в Category:RIP), конференции у нас — категории в категории Категория:Конференции (они могут группироваться в Категория:Линейки_конференций), ну а практически все остальные категории используются для тематической классификации.

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

В самой странице текст — mediawiki-разметка, на которой последовательно…

  • Cсылка на категорию-автора (или авторов), через шаблон {{Speaker| }}
  • блок тега <blockquote></blockquote> — аннотация.
  • Встраивание видео с vimeo и ссылка на видео с ютуба (с шаблонами там думаю, можно понять).
  • Ссылка на слайды если есть.
    • Иногда бывают обьемные тезисы или стенограммы, но в целом это редкость.
  • Ссылка на пикрелейтед, с указанием, чтобы эту картинку выбирали соцсети для превью,
  • Ссылки-связи с тематическими категории.


В самом конце статьи или категории, идет статистика, в сыром виде выглядящая как-то так:

{{stats|disqus_comments=12|median_plays=312|refresh_time=2020-07-07T18:45:21.060970|vimeo_comments=1|vimeo_plays=392|youtube_comments=10|youtube_plays=232}}

где наверное, все понятно, кроме «median_plays» — это свойство возникает у категорий, как медиана просмотра докладов в этой категории (остальные параметры для категории — это сумма соотвествующих параметров по статьям в этой категории).

Важное — эти свойства сами не возникают, и realtime не обновляются — приходится отдельным софтом бегать за ними в ютуб-вимео-disqus[4], со всякими хитростями (глюки и ограничения API и т.п.).

Итак, если вы захотите помочь мне с открытыми задачами, или что-то поковырять свое, посчитать какие-нибудь метрики, и порисовать картинки и графики, конечно, можно слить всю базу через Special:Export[5], потом распаковывать, парсить XML, парсить разметку… наверно это скучно.

Поэтому я предлагаю вам готовый, python-pickle dataset, с самым важным — тексты, статистика-просмотров комментариев, вложенность категорий.

Датасет

Open problems — предложить категории для страницы — максимально узкие и походящие, может несколько.

  • Основной вариант — из существующих категорий.
  • Возможно дополнительно показать близкие статьи — чтобы уже вручную создать новые категории.
  • Тут явно ML c элементами NTLK
    • Т.е. надо и парсить текст, убирать стоп-слова.
    • И как-то отклассифицировать, учесть имеющиеся категории
    • Большие категории (высокоуровневые, в которых вкладывается много более узких), должны котироваться слабее.

ключ
статьи по заголовкам.
значение
словарь с текстом-заголовком и еще одним словарем 'stats', со всей вытащенной статистикой.

Ну как-то так:

import pprint
import pickle
ds = pickle.load(open('0x1', 'rb'))
pprint.pprint(sorted(list(ds.keys()))[:4])['0MQ — Сокеты на стероидах (Сергей Гулько, OSDN-UA-2012)',
 '10 шагов к лучшему качеству кода приемочных тестов (Вагиф Абилов, '
 'AgileDays-2014)',
 '100%-ный просмотр кода. Зачем и как? (Леонид Савченков, SECR-2013)',
 '19 личностных потребностей, или чего на самом деле хотят пользователи '
 'ИТ-продуктов (Тамара Кулинкович, ProductCampMinsk-2014)']pprint.pp(ds['19 личностных потребностей, или чего на самом деле хотят пользователи ИТ-продуктов (Тамара Кулинкович, ProductCampMinsk-2014)'])
 
{
 'id': 42, 
 'title': '19 личностных потребностей, или чего на самом деле хотят '
          'пользователи ИТ-продуктов (Тамара Кулинкович, '
          'ProductCampMinsk-2014)',
 'text': ';Докладчик: {{Speaker|Тамара Кулинкович}}\n'
         '<blockquote>\n'
         '</blockquote>\n'
         '== Видео ==\n'
         '\n'
         '{{vimeoembed|104593083|800|450}}\n'
         '{{youtubelink|C5j2u-wrj2I}}{{letscomment}}\n'
         '\n'
         '== Слайды ==\n'
         '[[File:19 личностных потребностей,  или чего на самом деле хотят '
         'пользователи ИТ-продуктов (Тамара Кулинкович, '
         'ProductCampMinsk-2014).pdf|left|page=-|256px]]\n'
         '\n''\n'
         '\n'
         '<!-- topub -->\n'
'{{stats|disqus_comments=0|refresh_time=2020-07-07T19:27:42.310424|vimeo_comments=1|vimeo_plays=119|youtube_comments=0|youtube_plays=87}}',
 'stats': {'disqus_comments': 0,
           'refresh_time': '2020-07-07T19:27:42.310424',
           'vimeo_comments': '1',
           'vimeo_plays': 119,
           'youtube_comments': 0,
           'youtube_plays': 87},
 'categories': {'Категория:HasSpeaker',
                'Категория:ProductCampMinsk-2014',
                'Категория:Тамара Кулинкович',
                'Категория:Управление продуктами'}}
 

Обратите внимание на еще один атрибут — id статьи. В отличие от имени-названия-урла он неизменен (даже при переименованиях), и он нужен, чтобы ссылаться на ветки комментариев в Disqus (чтобы при переименовании статьи не пропадали комментарии).


  1. Ну, 8 лет назад это был ведущий сервис комментариев, и была надежда, что «самый стандартный сервис комментариев» побудит к фидбеку.
  2. концепции проекта Zanadu
  3. Самые популярные теги на фотохостингах — «я» и «фото», а на видеохостингах — «я» и «видео»
  4. Может когда-нибудь и в соцсети, за количеством комментариев, но пока в соцсетях с комментариями у меня тухло
  5. А если нужно слить все видео → вам сюда