Где испольуется майнинг текста?
Во всех разделах анализа текста.

Интересно, фамилия первого автора специально подобрана под содержимое книги или так получилось?
Я немного умею складывать, но от вычитания у меня всегда кружится голова
Во всех разделах анализа текста.
Интересно, фамилия первого автора специально подобрана под содержимое книги или так получилось?
Прокрастинация — это склонность откладывать дела на потом, даже если они важны и срочны. Это происходит, когда человек избегает выполнения задач, предпочитая заниматься чем-то менее важным, но более приятным или удобным.
Например: кто-то откладывает написание отчета до последнего дня, хотя он мог бы сделать это заранее, занимаясь другими делами, которые не приносят пользы в данный момент.
«Между тем немедицинские вмешательства, например снижение стресса или улучшение рациона питания, физической нагрузки, сна или качества воздуха, оказывает более ощутимое влияние на здоровье, и тем не менее пациенты и чиновники от медицины обращают на них гораздо меньше внимания.»
Симлер К. Хэнсон Р. «Слон в голове. Скрытые мотивы в повсевдневной жизни.»
Американское математическое общество (AMS) выработало стандарт для классификации разделов математики. Он регулярно обновляется.
https://mathscinet.ams.org/mathscinet/msc
Текущая версия стандарта MSC 2020 включает 97 разделов, подразделы которых перечислены на более, чем 200 страницах.
Приятного изучения.
Если вам понравилась заметка, то вы можете купить мне пироженку, задонатив в телетайп-канале «Математический рок-н-ролл».
За последние несколько месяцев я опубликовал более 30 классных популярных математических заметок для ВК канала «Ежик в матане». Но ленточное устройство ВК оставляет их активным сутки, иногда чуть больше, после чего они канут в Лету, то есть становятся практически недоступными. Это неудобно.
Чтобы избежать потери заметок, начинаю переносить их в Телетайп, в блог «Матеатический рок-н-ролл».
Первый пост называется «Оценка средних и карьера Вики». Он содержит краткий обзор различных средних значений.
Это была моя самая первая заметка для «Ежика», благодаря которой стал одни из его пишущих редакторов.
Заходите. Будет интересно.
Целоисчисленная матрица — это матрица, все элементы которой являются целыми числами.
Определитель целоисчисленной матрицы — тоже целое число. (Очевидно же.)
Используем класс целоисчисленных матриц, элементы которых могут принимать только значения из заданного множества целых чисел. (Такие матрицы называют богемными.)
Очевидно, что если множество возможных элементов матриц конечно, то и число возможных богемных матриц заданного размера тоже конечно.
Пусть мы ищем среди всех богемных матриц только те, определитель которых равен нулю. Ищем при помощи кода на Питоне. Определитель матрицы вычисляем так:
dt = np.linalg.det( a )
И вот тут возможна ошибка.
Если мы будем выбирать матрицы по условию dt==0, то получим неверный результат.
Using that test (dt==0) Python got the right number of [...] matrices when mdim=2 or mdim=3, but the test dt==0 failed a few times when mdim=4, and (after a long time computing) reported 15,015,617 singular matrices; the true number is 15,099,201. This is because np.linalg.det is computing the determinant from a numerical factoring (which introduces rational numbers and rounding error) and the roundoff error means that sometimes a zero determinant was not being reported as precisely zero.
Правильный результат получится если мы используем условие dt<0.5.
Это техническая заметка-напоминалка о некоторых возможностях пакета data.table.
Есть несколько таблиц data.table с данными. Назовем их dt_meta, dt_x, dt_y, dt_area.
В каждой таблице есть колонка the_index.
Из таблицы dt_meta выбираю строки, удовлетворяющие критерию. Например, все строки, в которых значение the_length > 120:
dt_meta[the_length > 120]
Задача заключается в том, чтобы из остальных таблиц выбрать строки с теми же номерами.
Использую специальный символ .I
.I возвращает номера строк. Но у него есть особенности.
Код
dt_meta[the_length > 120, .I]
вернет последовательные номера строк в новой таблице: 1, 2, 3, ....
Код
dt_meta[, .I[the_length > 120]]
вернет номера строк в исходной таблице: 5, 9, 13, 63, ....
Для решения нужен второй вариант кода. Вот решение.
# Номера строк исходной таблицы, в которых the_length > 120
indexes <- dt_meta[, .I[the_length > 120]]
# Выбираю такие же строки из других таблиц
new_x <- dt_x[indexes]
new_y <- dt_y[indexes]
new_area <- dt_area[indexes]
Обратите внимание на прекрасный канал, вход в который перекрывает водоворот Харибда.
Вот эта же часть на спутниковой карте
Закорючка на месте, а вот суши у Сицилии прибавилось.
Эта часть Сицилии сейчас пронизана тоннелями. А может и на карте Кирхера показан тоннель, а не канал?
Между Солнцем и Венерой — планета Вулкан.
Между Марсом и Юпитером — четыре планеты: Веста, Юнона, Церера и Паллада.
Указана правильная длительность венерианский суток — 224 земных дня.
(Это в 1849 году, причем сейчас Венера покрыта плотной непроницаемой для оптики атмосферой!)
Подсказал тг «Эпоха недоверия».
Джисон-лайнс состоит из строк, разделенных символом новой строки \n.
Каждая строка является отдельным объектом джисон.
Джисон-лайнс можно обрабатывать построчно,
это основное достоинство формата.
jsonl — расширение файлов джисон-лайнс.
Один файл — один объект; каждая строка — элемент этого объекта; пока не загрузится весь файл, доступа к строкам не будет.
[
{"id": 1, "position": [{"x": 17, "y": 256}], "status": "grow"},
{"id": 2, "position": [{"x": 78, "y": 341}], "status": "sleep"},
{"id": 3, "position": [{"x": 45, "y": 650}], "status": "moved"},
...
]
Каждая строка — отдельный объект джисон; можем читать файл построчно.
{"id": 1, "position": [{"x": 17, "y": 256}], "status": "grow"},
{"id": 2, "position": [{"x": 78, "y": 341}], "status": "sleep"},
{"id": 3, "position": [{"x": 45, "y": 650}], "status": "moved"},
...
Нашел у себя в запастниках карту с названиями Севастопольских бухт. Рисовал сам. К сожалению карта только в виде растра, вектор потерялся.
Если найду или сделаю вектор, поделюсь.
Нашел неплохой справочник по УДК
https://perviy-vestnik.ru/udc/
Достоинство — динамический поиск: набрал текст — увидел результат.
Недостаток — УРЛ странички статичен, не меняется при переходе к разделу справочника, и не удобно скакать по разделам.
УРЛ все время такой:
Хочется, чтобы было так:
Продолжаю рассуждать об алгоритме идентификации огромного числа видов диатомовых
Я медленно распаковываю присланный архив и передо мною открывается пятьсот фотографий диатомовых водорослей. Боже, они все такие разные, и я не знаю, какие виды на них изображены. А через два месяца мне нужно написать отчет и упомянуть большую часть из этих видов. Но как к ним подступиться, с чего начать? Ведь диатомовых очень много, а я знаю так мало. Караул!
В аннотации к статье Tyree et al. (2020) Reduction of taxonomic bias in diatom species data приведена следующая рекомендация:
«postcount identification and documentation of taxa (as opposed to an approach in which analysts assign names while they enumerate)».
Полностью она звучит так:
Precount voucher floras. [...] Each analyst was instructed to provide the project leader with a digital image of a representative specimen for all taxa that made up 5% or more of an individual count. [...] Multiple images were collected to document the size and morphological range of each taxon, which were then assigned aunique mOTU code. The images were assembled into image catalogs, or precount voucher floras, and made available to analysts. Analysts then had the opportunity to comment and reformulate mOTUs and their member images before the formal analysis began. Once analysis of microslides started, newly encountered taxa were photographed, assigned a code, added to the flora, and made available to project analysts for use throughout the analysis period.
Это натолкнуло меня на мысль о порядке определения видов диатомовых. Он подходит только для определения видов по фотографиям.
(1) Сначала объединяем фотографии особей в группы по схожести видимых признаков, невзирая на таксономическую принадленость изображенных организмов.
Фактически, на первом этапе мы выделяем морфотаксоны.
(2) После, пересматриваем организмы группы. Если какой-то организм из группы чем-то значимо отличается от остальных организмов этой группы, переносим его в другой морфотаксон.
На втором шаге присваиваем имена морфотаксонам.
(3) В финале, определяем видовую принадлежность организмов группы и называем виды, либо оставляем название морфотаксона, если вид определить не удалось.
Такой же алгоритм упомянут на сайте diatoms.org:
Steps to Eliminate Taxonomic Bias
Tyree et al. (2020) дает рекомендации по именованию морфотаксонов:
Formal scientific names. [...] analysts [...] enumerated taxa based on the mOTU codes from the shared voucher floras. When analyses were completed, mOTU codes were reconciled, and formal scientific names were assigned during collaborative workshops. During the workshops, project analysts [...] assigned scientific names to mOTUs. For each scientific name assigned, analysts recorded their initials and the taxonomic concept reference used when identifying the taxon. Any mOTU that did not correspond with a validly published species was referenced by its project-specific code (e. g. “Achnanthidium sp. 1 SESQA”). Such names were entered into [...] Taxonomic Database [...] as a bench name, with the voucher flora serving as the image representation of the name.
Последовательность шагов для определения диатомовых выглядит так:
Эта последовательность подходит для идентификации других групп организмов.
В предыдущих сериях:
Викиданные — это база разнообразных лексических концепций, которые могут прочитать как люди, так и машины. Фактически это база для обучения машин человеческим понятиям.
Работает так: мы активно пишем статьи, семантически размечаем приведенные в тексте понятия, а викиботы их вытягивают и заносят в базу. Затем эти данные специальные алгоритмы используют для обучения нейросетей, с которыми мы потом и взаимодействуем.
Примерно так же мы учим детей, только здесь нам никто не говорит, что все, что мы объясним, потом может быть использовано против нас.
Викибаза — это набор программ, позволяющие извлекать и работать с данными из Викиданных.
Все это открыто и бесплатно. Ну то есть поддержка софта, базы и серверов оплачивается специальными фондами (там ах-ные суммы), а все, кто данные вносят, делают это открыто и бесплатно)
Лилия — это замаскированная пчела.
Пчела — это символ одного из ответвлений суфизма, из которого вышли массоны — вольные каменщики.
* * *
Информация из интервью уважаемой АсСалам.
Дендрограмма — это результат объединения данных при помощи иерархического кластерного анализа. Обычно на листьях дендрограммы написаны имена переменных — названия объектов. Рассказываю, как вместо названий показать изображения.
В конце заметки — финальный код на R ↓
Знание языка Эр.
Установленный пакет ggtree.
Каждому листу дендрограммы сопоставлю маленький рисунок объекта. Для этого буду использовать два набора изображений: один — для тестирования, другой — для финальной отрисовки.
Тестовые изображения
Тестовые изображения содержат номера, идущие по порядку. Они нужны для того, чтобы было понятно, куда именно разработанный код помещает картинки.
Вот код для генерации 99-ти пнг-файлов размером 20×20 пикселей. Имя файла с изображением совпадает с нарисованым номером.
imgs_path = "img_indexed/"
for (i in 1:99) {
# Создаю новый пнг-файл img_{i}.png с нулевыми отступами
png(file = paste0(imgs_path, "img_", i, ".png"), width = 20, height = 20)
par(mar = c(0, 0, 0, 0))
# Созданию рисунок числа
plot(0, 0, type = "n", xlim = c(0, 1), ylim = c(0, 1), xlab = "", ylab = "", axes = FALSE)
text(0.5, 0.5, i, cex = 1)
# Сохраняю пнг-файл
dev.off()
}
Вот сами изображения.
Вод код для их загрузки.
imgs_indexed = c()
imgs_path = "imgs_indexed/"
for(i in 1:75) {
imgs_indexed = c(imgs_indexed, paste0(imgs_path, "img_", i, ".png"))
}
Изображения объектов
Изображение объекта — это уменьшенный рисунок прикрепительного крючка паразитического червя (моногенеи). Вот они все:
Общая картинка создана с помощью Имедж-меджик: montage -tile 20x2 -geometry +0+0 *.png all-anchors.png
Название файла с крючком совпадает с наванием вида. Эти названия храню списком в текстовом файле labels.txt. Для загрузки изображений объектов использую следующий код.
imgs_path = "img_objects/"
# Загружаем имена меток
img_objects <- readLines("labels.txt")
# и добавляем расширение '.png'
img_objects <- paste0(imgs_path, img_objects, ".png")
Изображения готовы, перейдем к дереву.
В книге «Data integration, manipulation and visualization of phylogenetic trees» описано, как прикрутить картинки к дендрограмме с помощью ggtree.
К сожалению, приведнный в книге код у меня не заработал. Он подразумевает, что мы загружаем филодерево из файла. А я строю дерево при помощи иерархической кластеризации и преобразую ее в объект дендрограммы.
data — это матрица данных: в ее строках — объекты, в столбцах — признаки.
# Выполняю иерархический кластерный анализ
dist <- dist(data)
hc <- hclust(dist, method = "complete")
library(dendextend)
# Преобразую результат в дендрограмму
dend <- as.dendrogram(hc)
Из дендрограммы делаю филодерево.
library(ggtree)
phylo <- as.phylo(dend)
Рисую дерево.
ggtree(phylo)
И получаю пустой каркас.
Добавлю к листьям каркаса текстовые подписи при помощи функции geom_tiplab(∙). Чтобы подписи поместились на канве, оставлю пустое место справа при помощи xlim(∙).
ggtree(phylo) + xlim(0, 0.7) + geom_tiplab(geom="label", size=2.2)
Получилось так себе: текст мелкий и бесит рамка вокруг него, но как от нее избавиться — не понял.
Метки мелкие и иногда перекрывают друг на друга. От перекрытия меток избавит пакет ggrepel. Но в результате получается каша.
У функции geom_tiplab(∙) есть параметр geom, задающий тип метки:
one of ’text’, ’label’, ’shadowtext’, ’image’ and ’phylopic’.
При помощи опции ’image’, можно на месте листьев нарисовать картинки.
На нашей дендрограмме 38 листьев. Значит передадим ей массив из 38 тестовых изображений: imgs_indexed[1:38].
Параметр size управляет размером картинок. Пришлось с ним повозиться, пока не подобрал подходящее значение.
ggtree(phylo) + geom_tiplab(geom="image", aes(image=imgs_indexed[1:38]), size=.03)
В результате выполнения кода получил ошибку:
Error in `label_geom()`:
! Problem while computing aesthetics.
i Error occurred in the 3rd layer.
Caused by error in `check_aesthetics()`:
! Aesthetics must be either length 1 or the same as the data (75)
x Fix the following mappings: `image`
После длительного анализа определил, что массив изображений должен состоять из 75 элементов, что написано в сообщении об ошибке. (
ggtree(phylo) + geom_tiplab(geom="image", aes(image=imgs_indexed[1:75]), size=.03)
Вуаля.
Подставлю сюда изображения объектов.
ggtree(phylo) + geom_tiplab(geom="image", aes(image=img_objects[1:75]), size=.03)
Цель достигнута.
library(ggplot2)
library(ggtree)
# Формируем массив с названиями файлов с рисунками объектов.
imgs_path = "img_objects/"
img_objects <- readLines("labels.txt")
img_objects <- paste0(imgs_path, img_objects, ".png")
# Выполняю иерархический кластерный анализ
dist <- dist(data)
hc <- hclust(dist, method = "complete")
# Преобразую результат в филодерево
phylo <- as.phylo(dend)
# Рисую дерево с картинками
ggtree(phylo) + geom_tiplab(geom="image", aes(image=img_objects[1:75]), size=.03)
Результат не нравится.
Дендрограмма вверху заметки — красивая, а эта — средненькая. Поэтому в следующий раз покажу, как сделать красивую дендрограмму с картинками при помощи пакета dendextend.
Если после прочтения этой прекрасной заметки вам вдруг непреодолимо захотелось меня поблагодарить, переведите мне 200 руб. на круасан с чаем. А я пока напишу что-то новенькое.
Рассказываю, что делать, если ваш каталог с пакетами Эр закрыт для записи
Эр работает со множеством вспомогательных пакетов. Для этого Эр скачивает пакеты в специальный каталог на компьютере.
По-умолчанию Эр помещает пакеты в системный каталог Виндоус. Обычно — это каталог текущего пользователя. Например, у меня на Виндоус 10 — это:
C:\User\Anton\AppData\Local\R\win-library\4.3\
По какой-то причине данный каталог иногда закрыт для записи, поэтому я не могу установить туда новые пакеты.
Чтобы исправить это досадное недоразумение, создадим новый каталог и укажем Эр, что теперь пакеты нужно устанавливать в него.
Первоисточник.
How do I change the default library path for R packages.
Доп. чтение:
Migrating R libraries
R Installation and Administration. 6 Add-on packages
Painless way to install a new version of R?
—-
Если вам вдруг непреодолимо захотелось меня поблагодарить, переведите мне 200 руб. на чашеку кофе.
Артем Горбунов — дизайнер, основатель и руководитель Бюро Горбунова.
Вот его жизненные принципы.
Это полная запись выступления.
Во время анализа больших дендрограмм у меня возникает необходимость выделить отдельную ветвь для подробного изучения. Например у нижеследующей дендрограммы намерен оставить ветку, отмеченную красным, а также по одному листу из соседних ветвей, отмеченных синим.
Примечание. Размер шрифта на денрограмме уменьшил при помощи R-кода ↓.
# Размер подписей на оси
par(cex.axis=0.8)
# Размер подписей листьев
dend <- set(dend, "labels_cex", 0.9)
# Рисует дендрограмму
plot(dend)
В R (вроде бы пока еще) нет специальной процедуры для вырезания ветвей. Зато в пакете dendextend есть функция prune.
Prune обрезает дерево, то есть удаляет из него указанные листья. Так, если в качестве параметра передать названия листьев, отмеченных на рис. красным, prune именно их и вырежет.
dend_pruned <- prune(dend, c("L_grandis__da", "L_kedahensis__TG__da", "L_chabaudi__da", "L_fenestrum__KM221913__da"))
plot(dend_pruned)
Получается, чтобы оставить только отмеченные листья, мне нужно перечислить все остальные. Когда дендрограмма большая, перечислять листья вручную я буду довольно долго.
«Пусть потеет машина», гласит дизайнерская мудрость. Поручим компьютеру сделать необходимые перестроения.
Для этого предлагаю функцию invert_prune. Она получает на вход список листьев, которые нужно оставить в дендрограмме, и возвращает список листьев, которые должна обрезать функция prune.
invert_prune <- function(dend, remained_leaves) {
setdiff( labels(dend), remained_leaves )
}
Пользуемся ею так:
dend_pruned <- prune(dend,
invert_prune(dend, c("L_grandis__da", "L_kedahensis__TG__da", "L_chabaudi__da", "L_fenestrum__KM221913__da"))
)
plot(dend_pruned)
Вуаля, и все нужные ветки остались.
—-
Если вам вдруг непреодолимо захотелось меня поблагодарить, переведите мне 200 руб. на чашеку кофе.