В численном анализе, разреженная матрица это матрица преимущественно заполненная нулями (Stoer & Bulirsch 2002, с. 619). С другой стороны, если большее количество элементов отличаться от нуля, то он является общим для обозначения матрицы как плотной матрицы.
Группа нулевых элементов в матрице называется разреженность.
Группа ненулевых элементов в матрице называется плотность.
Рассмотрим группу пасажиров которые общаются между собой, поскольку пасажиры общаются к примеру в купе то в целом в поезде они слабо связаны. С другой стороны, внутри купе пассажиры связанны сильно между собой.
Для хранении и манипулирования разреженных матриц на компьютере, выгодно и часто необходимо использовать специализированные алгоритмы и структуры данных, исходя из особенностей структуры таких матриц. Алгоритмы, которые созданы для стандартных (плотных) матричных структур относительно медленны и потребляют большие объемы памяти при использовании с разреженными матрицами.
Основной структурой данных для хранения традиционных матриц является двумерный массив. Каждый элемент массива представляет собой элемент \( A_{i,j} \) матрицы. Традиционно, \( i \) указывает номер строки (сверху-вниз), а \( j \) указывает номер столбца (слева-направо) для каждого элемента в таблице. Таким образом, для матрица \( T \) размерностью \( (m,n) \) , необходимо памяти для хранения \( l=m*n \) записей. То есть если элемент матрицы занимает \( k \) байт то объем памяти можно оценить формулой
\( Mem=m*n*k \), где
\( m,n \) -размерность матрицы
\( k \) - количество памяти необходимое для храниения одного элемента.
Существенное сокращение требование к памяти может быть реализовано за счет сохранения только ненулевых элементов. В зависимости от количества и распределения ненулевых элементов, различные структуры данных могут быть использованы и дают огромную экономию памяти, когда по сравнению с базовым подходом. Форматы могут быть разделены на две группы: те, которые поддерживают эффективное изменение, и те, которые поддерживают эффективную работу матрицы.
Эффективная группа включает в себя различные модификации следующих основных способов:
Эти форматы и последний, как правило, используются для построения матрицы.
После создания матрицы, то ее, как правило, преобразуется в формат, такой как CSR (сжатый разреженных строк) или CSC (сжатый Разреженные колонка), которые является более эффективными для матричных операций.
Этот способ предполагает хранение ненулевых значений в качестве словаря (например, хэш-таблицы или дерева бинарного поиска) отображение (строка, столбец)-пар значений. Этот формат хорош для постепенного формирования разреженного массива. Обычно создает матрицу с этим форматом, а затем переходит в другой формат для обработки
LIL хранит список строк или записей, где каждая запись хранит индекс столбца и значение. Как правило, эти записи хранятся сортируются по колонке для более быстрого поиска. Это еще один формат, который удобно использовать для изменения или дополнения матрицы.
COO хранит список (row, column, value)
то есть кортежей. Как правила, кортежи сортируются по координатам чтобы улучшить время доступа к элементам. Этот формат очень хорошо использовать
в реляционых база данных.
CSR предполагает хранение (val, col_ind, row_ptr)
, где val
это массив (слева-на-право, и сверху-вниз) ненулевых значений матрицы; col_ind
номера колонок связанные со значениями;
а, row_ptr
указывает на начала строк. Этот формат является эффективным для арифметических операций, и умножения матриц между собой и на вектор.
Похож на предыдущий, но номер строки хранится для каждого значения, а также хранятся начала колонок. То есть в CSC (val, row_ind, col_ptr)
, где val
это массив (слева-на-право, и сверху-вниз) ненулевых значений матрицы; row_ind
номера строк связанные со значениями.
CSR и CSC можно применять вместе если необходимо изменять матрицу одновременно добавлением и строк и столбцов.
Рассмотрим на примере
library("Matrix")
## Loading required package: lattice
m1 <- matrix(0, nrow = 789, ncol = 789) # стандартная матрица
m2 <- Matrix(0, nrow = 789, ncol = 789, sparse = TRUE) # сжатая матрица
object.size(m1)
## 4980368 bytes
object.size(m2)
## 4784 bytes
m1[234, 234] <- 1
m2[234, 234] <- 1
object.size(m1)
## 4980368 bytes
object.size(m2)
## 4800 bytes
Библиотека Matrix позволяет определять разряженные матрицы. Эта библиоиека функций не единственная, существует также пакет slam
library("slam")
m1 <- matrix(0, nrow = 789, ncol = 789)
m2 <- simple_triplet_zero_matrix(nrow = 789, ncol = 789)
m1[234, 234] <- 1
m2[234, 234] <- 1
object.size(m1)
## 4980368 bytes
object.size(m2)
## 1056 bytes
# m2 %*% rnorm(789) m2 + m2 m2 - m2 t(m2)
Матрица термин-документ(ТДМ) или наоборото термин-документ матрица, представляет собой математическую матрицу, которая описывает частоты терминов, встречающихся в сборнике(корпусе) документов.
В ТДМ, строки соответствуют документам, а столбцы соответствуют терминам. Существуют различные способы для определения значения, что каждый элемент матрицы должны хранить. Одним из самых часто используемых подходов является расчет \( TF-IDF \) значения.
TF-IDF, термин частотно-обратная частота документа, является числовым значение, которое отражает то, как важно слово в документ в коллекции(корпусе). Это число часто используется в качестве весового коэффициента в информационном поиске и анализе текста.
\( TF-IDF \) это оценка, смещенный по частоте слова в корпусе, икоторая увеличивается пропорционально частоте встерчаемости темина в документе, что помогает контролировать то, что некоторые слова, как правило, встречаются чаще, чем другие.
Вариации \( TF-IDF \) схема взвешивания часто используется поисковыми системами в качестве основного инструмента в выигрыше релевантности и ранжирования документов, данных запроса пользователя. \( TF-IDF \) может быть успешно использован для стоп-слова фильтрации в различных предметных областях, включая обобщение текста и классификации.
Один из самых простых функций ранжирования рассчитывается путем суммирования \( TF-IDF \) для каждого термина запроса.
'''TF''' (''term frequency'' — частота слова) — отношение числа вхождения некоторого слова к общему количеству слов документа. Таким образом, оценивается важность слова \( t_{i} \) в пределах отдельного документа.
\[ \mathrm{tf}(t,d) = \frac{n_i}{cnt\_term}, \]
где \( n_i \) это количество упоминания термина в документе, а \( cnt\_term \) — общее число слов в данном документе.
''IDF'' (''inverse document frequency'' — обратная частота документа) — инверсия частоты, с которой некоторое слово встречается в документах коллекции. Таким образом IDF снижает вес частоупотребребляемых терминов.
\[ \mathrm{idf}(t, D) = \log \frac{D}{(d_{i}\supset t_{i})}, \]
где
Выбор основания логарифма в формуле не имеет значения, поскольку изменение основания приводит к изменению веса каждого слова на постоянный множитель, что не влияет на соотношение весов.
Таким образом, мера TF-IDF является произведением двух сомножителей:
\[ \mathrm{tfidf}(t,d,D) = \mathrm{tf}(t,d) \times \mathrm{idf}(t, D) \]
Большой вес в TF-IDF получат слова с высокой частотой в пределах конкретного документа и с низкой частотой употреблений в других документах.
Рассмотрим подход предложенный пакета lsa для формирования ТДМ матрицы, чтобы познакомится с дополнительными необходимыми понятиями. В тексте пакета в сотрудниками лаборатории были внесены изменения для повышения корректности работы библиотеки, эти изменения отосланы автору и он в ответ сообщил, что скорректирует следующую версию согласно с нашими предложениями. Далее мы будем рассматривать только заголовки функций. Рассмотрим первую функцию txtvector
# textvector <- function (file, stemming=FALSE, language='english',
# minWordLength=2, maxWordLength=FALSE, minDocFreq=1, maxDocFreq=FALSE,
# stopwords=NULL, vocabulary=NULL, phrases=NULL, removeXML=FALSE,
# removeNumbers=FALSE )
В качестве параметров эта функция принимает:
stemming - осуществлять стемминг или нет.В информационном поиске, стемминг - процесс
сведения склоняемого
слова к их основе или форме корня. Основа не должна быть идентичной
морфологическому корню слова. Алгоритмы для стемминига
были изучены в информатике с 1960-ых. Много поисковых систем рассматривают слова с той же
самой основой как синонимы как своего рода расширение вопроса, процесс, названный сплавом.
language - язык документа, важен для стеминга
minWordLength - миниммальная длина слова
maxWordLength - максимальная длина слова
minDocFreq - минимальная встречаемость в документе
maxDocFreq - максимальная встерчаемость в документе
stopwords - список стоп-слов. Стоп-слова это слова которые необходимо удалить из текста, к ним, как правило относят предлоги, союзы и такие например слова как ''тоже''. Необходимо помнить, что удаление в том числе и служебных слов могут значительно ухудшить качество решения.
vocabulary - словарь слов из которых необходимо построить вектор, в матрицу не войдут слова, которых нет в словаре.
phrases - фразы
removeXML - удаление тегов XML для HTML -XML тестов.
removeNumbers -удаление чисел
С использованием функции textvector можно построить матрицу ТДМ, для этого в пакете определена функция textmatrix.
# textmatrix <- function( mydir, stemming=FALSE, language='english',
# minWordLength=2, maxWordLength=FALSE, minDocFreq=1, maxDocFreq=FALSE,
# minGlobFreq=FALSE, maxGlobFreq=FALSE, stopwords=NULL, vocabulary=NULL,
# phrases=NULL, removeXML=FALSE, removeNumbers=FALSE) {
Эта функция имеет все те же параметры, что и фунуция textvector,за исключением параметра
mydir
-который указывает на директорию с текстовыми файлами, образующими корпус.
Теперь опишем алгорим действий в R для получение матрицы TДМ с метрикой \( TF-IDF \)
library("lsa");
tm = textmatrix('dir/');
tm = lw_logtf(tm) * gw_idf(tm);
У API Twitter есть методы, при помощи которых можно программно получить список твитов.
Особенностью API является то, что получить можно последние n твитов, то есть процесс
переодического обращения не эффективен. В общем случае он может привести к дублированию
сообщений или к тому, что часть сообщений не будет получена.
Последнее возможно в случае когда мы просим последние 5 твитов, а пользователь ввел,
например, 8, поэтому 3 сообщения мы уже не получим.
Доступ к сообщениями можно осуществить следующим образом:
library("ROAuth") library("twitteR")
tw<-userTimeline('marie_wallace', n=100) tw.df <- twListToDF(tw)
Пременная tw.df - имеет тип data.frame, то есть в результате создается таблица, которая хранит 100 последних твитов.
Как правило считается предпочтительным использовать OAuth 2.0 для авторизации к LinkedIn API. По сравнению со своим предшественником, OAuth 1.0a, протокол проще и гораздо легче в использовании.
Для получения доступу к API необходимо получить специальный получить ключ. Этот уникальный ключ предназначен для идентификации приложения и позволяет осуществлять доступ к программным вызовам. Ключ выдается автоматически. Далее с использованием REST API можно вызывать функции API которые возрвращают по умолчанию данные в xml, также эти же вызовы могут возвращать json-данные.
API является основным способом для получения данных из Facebook.
Это низкоуровневый запрос по протоколу HTTP, который осуществляет
запросы программным способом для создания и получения постов и
сообщений, а также связей профиля.
# require(RCurl) require(rjson)
# facebook <- function( path = 'me', access_token = token, options){ if(
# !missing(options) ){ options <- sprintf( '?%s', paste( names(options),
# '=', unlist(options), collapse = '&', sep = '' ) ) } else { options <- ''
# } data <- getURL( sprintf(
# 'https://graph.facebook.com/%s%s&access_token=%s', path, options,
# access_token ) ) fromJSON( data ) }
# the code uses 'facebook' function from the previous gist
# (https://gist.github.com/1634662) or see the original
# http://romainfrancois.blog.free.fr/index.php?post/2012/01/15/Crawling-facebook-with-R
# scrape the list of friends friends <- facebook( path='me/friends' ,
# access_token=access_token) extract Facebook IDs friends.id <-
# sapply(friends$data, function(x) x$id) extract names friends.name <-
# sapply(friends$data, function(x) x$name) short names to initials initials
# <- function(x) paste(substr(x,1,1), collapse='') friends.initial <-
# sapply(strsplit(friends.name,' '), initials)
# friendship relation matrix N <- length(friends.id) friendship.matrix <-
# matrix(0,N,N) for (i in 1:N) { tmp <- facebook(
# path=paste('me/mutualfriends', friends.id[i], sep='/') ,
# access_token=access_token) mutualfriends <- sapply(tmp$data, function(x)
# x$id) friendship.matrix[i,friends.id %in% mutualfriends] <- 1 }
В разделе 1 были представлены общие подходы использования данных Теперь рассмотрим продробленнее алгоритм построение матрицы терм-терм.
Традиционно документ представляет собой упорядоченную цепочку терминов, при этом термины в цепочке могут повторяться. Обычные тексты для дальнейшей обработки необходимо привести в особый вид.
Стемминг - отсечение от слова окончаний и суффиксов, чтобы оставшаяся часть, называемая stem, была одинаковой для всех грамматических форм слова. Разумеется в таком виде стеммер может работать только с языками, которые реализуют словоизменение через аффиксы. Примерами таких языков являются русский и английский.
Обычно стеммером пользуются для поиска текста с имитацией учета морфологии. Под имитацией подразумевается неустранимо большое количество ошибок и нерелевантных результатов, которые возникают, если применять только стеммер. В русском языке источником ошибок при стемминге являются всевозможные изменения корня слова - беглые гласные, к примеру. Наглядно проблемы, связанные с использованием стеммера, можно продемонстрировать для русского существительного кошка. Родительный падеж множественного числа имеет форму кошек. Таким образом, самый длинный общий префикс всех форм существительного кошка - это кош. Если выполнить поиск текста по этому префиксу, то в результатах с большой вероятностью будут такие слова, как кошмар. Замечу, что обычно реализации стеммера идут немного другим путем и допускают ошибку иного рода - они возвращают при стемминге префикс кошк и таким образом из результатов поиска исчезают фрагменты текста с формой кошек.
В качестве решения проблемы плохих результатов поиска со стеммером для русского языка можно использовать два дополнительных модуля грамматического словаря - лемматизатор и флексер (склонение и спряжение). С помощью лемматизатора можно приводить слова к базовой форме, поэтому после сопоставления слова со стемом можно уточнить результат с помощью лемматизации. Второй модуль - флексер, который умеет выдавать все грамматические формы слова на основе базовой. Это позволяет уточнять результаты поиска, проверяя найденные фрагменты по набору форм ключевого слова.
Сравнение с лемматизацией и стеммингом
При стемминге часто отбразывается не только окончание. Иногда может быть отброшено часть основы слова. При лемптизации — для каждого слова проводят процесс приведения словоформы к лемме — её нормальной (словарной) форме.
К примеру в русском языке применяются следующие общие правила
В русском языке нормальными формами считаются следующие морфологические формы:
Например, существительное ''ложка'' в винительном и родительном падеже множественного числа имеет форму ''ложек''. Из-за таких беглых гласных стеммер должен либо игнорировать подобные формы, усекая ложки до ложк и отбразывая часть формы слова, либо усекать слово до безусловно неизменяющейся основы, получая лож, что впоследствии может привести к нерелевантным сопоставлениям с словом ''ложе''. Поэтому основной проблемой является совпадения стемов для совершенно несвязанных слов.
Достоинство стеммера это отсутствие больших по объему словарей, что позволяет, быстро обрабытывать текст.
Лемматизатор применяет упрощенный анализ слов, не учитывая контекст. Это приводит к неоднозначностям при определении части речи. Например, лемматизация слов в словосочетании ''на поле рой пчел'' даст для третьего слова два варианта лемматизации: существительное рой и глагол рыть. Такие проблемы разрешаются при помощи морфологических анализаторов.
Системы морфологического анализа и синтеза развиваются уже не одно
десятилетие, и серьезная обработка текста уже, пожалуй, немыслима
без их помощи. Сегодня существуют
коммерческие программ, которые могут успешно справляться с
этими задачами, но, к сожалению, они не могут быть использованы для
научных экспериментов из-за их крайней высокой цены и отсутствия
исходного кода. С другой стороны, существуют бесплатные модули,
которые, впрочем, часто неприемлемы из-за низкой скорости обработки
слов и неполноты словарных баз. Однако, существуют
программные модули которые можно получить на сайте www.aot.ru которые:
Для наших исследований перед построением из текста графа, отображающее слабое знание, мы проводили стемизацию текста. Для стемминга использовался, так называемый, алгоритм Porter. в R стемминг встроен в пакет LSA и для его испольхование при вызове функции построения матрицы достаточно это указать следующее:''stemming=TRUE''.
После стеминга необходимо определить структуру текста, то есть выделить слабо зависимые части текста, эти части могут быть отделены заголовками или пропусками. Для автоматического разбиения можно использовать абзацы.
В абзацах, чаще всего говориться о нескольких понятиях, которые связаны между собой, однако остается проблема третьх понятий, которые выражаются местоимениями, эвристически можно опереться на тот факт, что третьи понятия и их связи между собой и текущими понятиями описаны в других обзацах.
При этом если таких связей нет то можно укрупнять разбиение текста
скажем по два абзаца. Для остановки укрупнения можно использовать
дополнительное внешнее знание. Кроме этого можно опять же
эвристически опереться на минимальное значение числа установленого
опытным путем в 40-х гг. ХХ в. шведским лингвистом В.Г. Ингве
(Yngve) как способность оперативной памяти человека хранить не более
7+/-2 единиц информации одновременно.
После автоматического получения слабых знаний, их можно
автоматизированными процедурами стандартизировать
по ГОСТ Р 7.0.10-2010 (ИСО 15836:2003).
Рассмотрим на примере анализа одного из профилей в твиттер.
library("Snowball")
library("tm")
library("bitops")
library("RCurl")
library("stringr")
source('~/firts/func.R')
source('~/firts/stopw.R')
library('XML')
library("ROAuth")
library("twitteR")
tw<-searchTwitter('@marie_wallace', n = 1500, lang="en",since = "2012-01-01")
tw<-userTimeline('marie_wallace', n=100)
tw.df <- twListToDF(tw)
tdm<-split_tweet(tw.df,sw1,0);
r1<-createR1Matrix(tdm)
cnt1=dim(r1)[1]
levl=1
nm=names(r1[1,])
gr_name="wallace.gv"
cat('digraph G {' , file=gr_name , append=FALSE,sep =" ")
for(i in 1:(cnt1-1))
for(j in (i+1):cnt1) {
if(r1[i,j]>levl)
{
cat( '"',nm[i],'"->"',nm[j],'""; \n' ,file=gr_name ,append=TRUE,sep =" ")
}
}
cat( '}', file=gr_name ,append=TRUE,sep =“ ”)
system2('dot', 'wallace.gv -Tpdf >./wallace.pdf')
Пакет"Snowball" - предоставляет функции стемминга. library(“ROAuth”) library(“twitteR”)
# cred = getTwitterOAuth(YOURKEY, YOURSECRET) registerTwitterOAuth(cred)
Эти строки позволяют авторизоваться для использования функций пакета “twitteR”.
Функция создает матрицу терм-терм split_tweet(tdm)
эта функция не является стандартной поэтому рассмотрим
ее подробнее.
split_tweet<- function(txt1,sw,procent)
{
Sys.setenv(NOAWT=TRUE)
library("tm");
library("RWeka");
library("Snowball");
library("stringr");
library("lsa")
td = tempfile()
dir.create(td)
i=0
for (t1 in txt1$text) { i=i+1 write(t1, file=paste(td, str_c("D",i), sep="/") )
}
tm1=textmatrix(td, stemming=TRUE, minGlobFreq=procent, minWordLength=3,stopwords=sw)
unlink(td, recursive=TRUE)
return (tm1)
}
Данная функция сохраняет сообщения из твитера как текстовые файлы в специально созданную дииректорию. В результате мы получаем корпус текстов, который мы можем проанализировать уже известными способами информационного анализа текстов(Text Minning). Теперь используя функцию textmatrix строим матрицу Терм-Документ.
Имея такую матрицу можно определить связь между термами, будем
считать, что чем чаще слова вместе встречаются, тем сильнее
связь между словам, физический смысл такой связи здесь не
будем рассматривать. Технически для оценки такой связи для каждой
пары необходимо рассчитать следующие три показателя
1. Встречаемость первого слова в наборе документов
2. Встречаемость второго слова в наборе документов
3. Встечаемость пары слов в наборе документов
То есть, пусть дано упорядоченное множество слов \( A \), \( a_i \) и \( a_j \) два разных терма в текст после стемминга или лемматизации. Тогда
Тогда значение силы связи можно определить по следующей формуле:
\[ r_{ij} = \frac{2*Vp_{i,j}}{V_j+V_i} \]
Рассчитанные по этой формуле значения \( R_{ij} \) образуют матрицу терм-терм. Значения матрицы, рассчитанные по предложенной формуле, больше или равно 0 и меньше или равно 1. Это факт делает матрицу непригодной для построения графа, однако если использовать нечеткую логику, то можно преобразовать матрицу терм-терм в матрицу смежности некоторого графа.
Нечеткое множество это пара \( (U, m) \), где \( U \) множество и
\( m \in [0,1]. \)
Для каждого \( x \in U \), значение \( m(x) \) называют ''уровнем'' в множестве пар
\( (U,m) \). По мимо уровней для работы с нечеткими множествами вводят пороговые
значения которые позволяют работать нечеткими множествами как с обычными,
в нашем случае пороговые значения определеяются как превышение над средним
значением в матрице терм-терм.
То есть пусть существует матрица R, тогда для получения матрица смежности необходимо рассчитать среднее значение для \( R \) и получить матрицу смежности используя характеристическую функцию g(x) заданную следующим образом
\[ g(x)=\left\{ \begin{array}{rl} 1 &\mbox{, при } x \gt r_{avg}\\ 0 &\mbox{, при } x \le r_{avg} \end{array} \right. \]
Полученная матрица смежности задает граф, который описывает некоторую структуру понятий для вязтого профиля социальной сети.
Это дает возможность сравнивать различные профили между собой, определяя сходность понятийный структур.
Сведение анализа профиля к информационному анализу текста связанных с ним сообщений, дает возожность выбрать из графа отношений социальной сети, узлы,то есть профили, которые близки по понятийной структуре.
Приведем примеры графов профилей полученных представленными алгоритмами и средствами. Первым графом который был получен автоматически был граф Марии Волес Его общие характеристики представлены в таблице.
Такие же графы можно построить и для русского сегмента твиттера. Если упорядочить списки вершин по коэффициенту централити, для графов полученных из твиттера Mari Wallace и Tom Petrocelli то получим для Mari следующее :
Номер терма | Терм | bet |
---|---|---|
21 | “need” | 0.5 |
35 | “biz” | 1 |
64 | “graph” | 1 |
8 | “mirgray” | 2 |
2 | “look” | 3 |
3 | “lizcpher” | 8 |
71 | “week” | 11.9 |
15 | “agre” | 16.5 |
25 | “twitter” | 20 |
51 | “ibm” | 28 |
45 | “2013” | 30.5 |
18 | “roi” | 32 |
75 | “amp” | 56 |
40 | “analyt” | 78.75 |
60 | “year” | 85.6 |
19 | “http” | 214.9 |
23 | “socbiz” | 257.4 |
26 | “social” | 291.9 |
6 | “swchat” | 419 |
Твиттер Tom Petrocelli был проанализирован посколько в он встретился среди термов в твиттере Mari Wallace и для него получим следующее
Номер терма | Терм | bet |
---|---|---|
93 | “login” | 0.5929 |
94 | “req” | 0.5929 |
56 | “process” | 0.6667 |
17 | “effect” | 1 |
18 | “mari” | 1 |
39 | “servic” | 1.905 |
55 | “enterpris” | 2 |
72 | “sameerpatel” | 2.667 |
43 | “aleap” | 3.5 |
46 | “custom” | 4.583 |
87 | “esg” | 4.893 |
71 | “tridipchakra” | 5.5 |
36 | “engag” | 5.667 |
13 | “final” | 5.833 |
40 | “crm” | 7 |
12 | “hard” | 8 |
60 | “tompetrocelli” | 9.667 |
90 | “global” | 11.81 |
45 | “work” | 14.27 |
31 | “valu” | 15.87 |
5 | “smartphon” | 19.83 |
4 | “make” | 21.5 |
9 | “good” | 24 |
19 | “revenu” | 29.47 |
59 | “cmswire” | 35.5 |
68 | “peopl” | 42 |
54 | “research” | 46.34 |
58 | “market” | 48.24 |
141 | “sap” | 51 |
53 | “move” | 68.91 |
41 | “adopt” | 69.84 |
57 | “busi” | 82.49 |
50 | “esgglob” | 90.71 |
35 | “will” | 97 |
25 | “need” | 100.1 |
8 | “use” | 114 |
6 | “tablet” | 122.7 |
11 | “sapsoci” | 149 |
15 | “like” | 207 |
65 | “network” | 266.8 |
21 | “roi” | 270.6 |
51 | “http” | 558.9 |
23 | “social” | 579.8 |
10 | “sapchat” | 1567 |
Последняя десятка в обоих случаях имеет следующий вид
Терм( TOM) | bet( TOM) | Терм(Mari) | bet(Mari) |
---|---|---|---|
“now” | 300 | “twitter” | 20 |
“valu” | 346.3 | “ibm” | 28 |
“roi” | 354.6 | “2013” | 30.5 |
“tompetrocelli” | 406 | “roi” | 32 |
“use” | 406.3 | “amp” | 56 |
“will” | 542.5 | “analyt” | 78.75 |
“socbiz” | 791 | “year” | 85.6 |
“swchat” | 937.9 | “http” | 214.9 |
“http” | 1300 | “socbiz” | 257.4 |
“sapchat” | 1558 | “social” | 291.9 |
“social” | 2630 | “swchat” | 419 |
Можно выделить следующие термы
Эти термы встречаются в обоих десятках, и теперь посмотрим их подграфы
Рисонок Фрагмент графа Мари
Рисонок Фрагмент графа Том
На основе представленных графов можно предложить гипотезу, о том что между Мари и Томом было некоторое обсуждение, связанное с терминами ROI(возврат интвестици), Revenue(Выручка), Growth(процесс увеличения какого-либо качества со временем), Mesure (оценка)
Кроме этого, упоминается блоге socbiz.
Практическая ценность заключается в том что благодаря графу были добавлены дополнительные связанные термины, которые не обнаружил алгоритм централити.
Таким образом появляеются предпосылки создания автоматизированного расширенного ключевого образа текста не только, как набора слов, но и как некоторой структуры, которую можно сравнивать с структурой полученной из другого текста.
И поскольку сравнивается два графа, то по мимо верщин графа( термины) автоматически происходит сравнение и ребер(наборы терминов употребляемых вместе).
Социотехническая среда представлена не только связями
возникающими от обмена информацией но и самой информацией,
эта информация, представляет собой часть профиля тех
элементов социотехнической среды, которые имеют
способоность владеть чем либо, и поэтому их часто называют
агентами или акторами.
Понятие ''Актор'' можно считать устаревшим, поэтому далее мы будем употреблять термин агент. Информация хранящаяся в социальных сетях, представляет прежде всего набор текстов. Поэтому для анализа информации агентов необходимо провести информационный анализ текстов, которые либо принадлежат, либо ассоциированны с агентом исследований.
Рассмотрим следующую задачу:
Пусть существуют два учебника и программа курса в качестве трех отдельных документов. Известно, что любой курс имеет некоторую структуру. Поэтому разделим каждый документ на части. В качестве единицы текста возьмем тему. Количество тем в учебниках и в программе могут не совпадать. Поэтому прямой информационный анализ матриц текст-документ может ничего не дать.
Таким образом, для нашего случая необходимо соформировать так называемый корпус документов. И на основе его получить матрицу текст-документ ну и использовать метод K-ближайших соседей для проведения кластеризации.
Сами матрицы предсьавлены в придожении а здесь приведем таблицы с центарми получившихся кластеров:
Для программы это будет следующая таблица
d10 | d11 | d12 | d13 | d14 | d15 | d2 | d3 | d4 | d5 | d6 | d7 | d8 | d9 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0.05 | 0.05 | 0.00 | 0.13 | 0.00 | 1.31 | 0.08 | 0.10 | 0.05 | 0.08 | 0.03 | 0.00 | 0.46 | 0.05 |
2 | 0.15 | 0.92 | 0.23 | 4.31 | 1.38 | 1.23 | 0.31 | 0.15 | 0.46 | 0.85 | 0.31 | 1.77 | 0.69 | 1.38 |
3 | 0.18 | 0.18 | 0.04 | 0.28 | 0.11 | 0.00 | 0.06 | 0.00 | 0.15 | 0.13 | 0.09 | 0.23 | 0.09 | 0.11 |
4 | 0.06 | 0.07 | 0.00 | 0.04 | 0.04 | 0.00 | 0.13 | 1.70 | 0.17 | 0.04 | 0.07 | 0.06 | 0.02 | 0.15 |
5 | 0.00 | 1.00 | 1.33 | 2.67 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 1.33 | 0.00 | 8.67 | 0.00 | 0.67 |
6 | 0.00 | 1.33 | 0.50 | 0.58 | 1.92 | 0.00 | 0.17 | 0.17 | 0.08 | 1.83 | 0.00 | 0.08 | 0.00 | 0.08 |
7 | 3.50 | 3.50 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 1.00 | 0.00 | 0.00 | 6.00 | 0.00 | 0.00 | 0.00 |
Для первого учебника Макроэкономики
d1 | d2 | d3 | d4 | d5 | d6 | d7 | d8 | |
---|---|---|---|---|---|---|---|---|
1 | 0.73 | 1.13 | 0.87 | 0.50 | 0.98 | 1.03 | 0.58 | 0.81 |
2 | 5.20 | 0.80 | 2.20 | 19.20 | 34.60 | 66.60 | 9.00 | 2.60 |
3 | 2.69 | 7.92 | 16.00 | 3.46 | 8.46 | 3.69 | 5.31 | 4.69 |
4 | 4.42 | 12.25 | 10.92 | 11.58 | 34.25 | 12.08 | 11.33 | 14.50 |
5 | 34.50 | 91.00 | 54.00 | 23.50 | 52.50 | 54.00 | 40.00 | 89.50 |
6 | 1.04 | 1.33 | 2.79 | 3.79 | 11.96 | 3.12 | 7.42 | 7.75 |
7 | 2.45 | 3.64 | 5.09 | 4.73 | 5.91 | 23.55 | 2.18 | 2.36 |
d1 | d10 | d11 | d12 | d13 | d14 | d15 | d16 | d17 | d18 | d19 | d2 | d20 | d3 | d4 | d5 | d6 | d7 | d8 | d9 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0.02 | 0.69 | 0.31 | 1.69 | 1.36 | 0.77 | 0.48 | 0.65 | 0.78 | 1.09 | 0.79 | 1.53 | 0.91 | 0.47 | 1.05 | 0.51 | 0.80 | 0.62 | 0.36 | 0.47 |
2 | 0.00 | 3.50 | 4.20 | 3.15 | 1.25 | 2.15 | 2.45 | 4.00 | 2.25 | 1.40 | 16.50 | 2.15 | 8.00 | 2.35 | 1.55 | 0.70 | 2.10 | 4.10 | 5.80 | 3.30 |
3 | 0.00 | 2.10 | 1.50 | 34.40 | 7.60 | 20.00 | 13.10 | 20.60 | 14.40 | 16.30 | 0.70 | 8.90 | 2.00 | 3.40 | 26.30 | 3.90 | 9.00 | 2.00 | 3.70 | 11.80 |
4 | 0.00 | 3.50 | 3.25 | 37.75 | 33.00 | 6.50 | 2.75 | 2.75 | 5.75 | 7.00 | 26.50 | 10.25 | 31.75 | 0.75 | 4.50 | 12.25 | 9.00 | 26.75 | 2.75 | 4.00 |
5 | 0.15 | 4.46 | 1.54 | 5.54 | 6.54 | 1.54 | 11.69 | 15.23 | 18.38 | 27.00 | 9.08 | 3.85 | 5.46 | 8.23 | 2.46 | 4.54 | 20.92 | 2.62 | 3.38 | 5.15 |
6 | 0.00 | 1.36 | 0.82 | 5.59 | 2.41 | 1.41 | 6.82 | 5.55 | 7.64 | 8.82 | 1.18 | 8.64 | 1.23 | 6.95 | 3.41 | 1.23 | 5.18 | 1.86 | 1.18 | 6.00 |
7 | 0.00 | 30.22 | 10.44 | 0.78 | 5.44 | 0.11 | 0.67 | 1.00 | 0.56 | 1.00 | 2.56 | 2.89 | 0.22 | 1.44 | 0.78 | 10.00 | 3.89 | 1.00 | 3.33 | 0.11 |
Как видно из таблиц центры кластеров, если их рассматривать как векторы координат имеют разную размерность. Соотвествено очень трудно сравнивать их между собой используя удаленность в смысле евклидова расстояния друг от друг центров кластеров.
Хотя бы поэтому оставим этот способ определение и перейдем к следующему алгоритму.В результате выполнения этого алгоритма получим следующее:
Фрагмент таблицы центров кластеров программы курсаанализ | безработиц | естествен | закон | заработн | минимальн | модел | монопольн | ожидан | |
---|---|---|---|---|---|---|---|---|---|
1 | 0.54 | 0.84 | 0.77 | 0.74 | 0.74 | 0.74 | 0.34 | 0.74 | 0.65 |
2 | 0.69 | 0.07 | 0.09 | 0.05 | 0.05 | 0.05 | 0.85 | 0.05 | 0.06 |
3 | 0.08 | 0.01 | 0.14 | 0.00 | 0.00 | 0.00 | 0.61 | 0.00 | 0.00 |
4 | 0.36 | 0.23 | 0.08 | 0.02 | 0.02 | 0.02 | 0.19 | 0.02 | 0.43 |
5 | 0.09 | 0.35 | 0.12 | 0.02 | 0.02 | 0.02 | 0.35 | 0.02 | 0.06 |
6 | 0.43 | 0.21 | 0.12 | 0.00 | 0.00 | 0.00 | 0.60 | 0.00 | 0.46 |
7 | 0.09 | 0.00 | 0.07 | 0.00 | 0.00 | 0.00 | 0.32 | 0.00 | 0.00 |
анализ | безработиц | естествен | закон | заработн | минимальн | модел | монопольн | ожидан | |
---|---|---|---|---|---|---|---|---|---|
1 | 0.69 | 0.59 | 0.93 | 0.33 | 0.77 | 0.24 | 0.83 | 0.91 | 0.72 |
2 | 0.76 | 0.67 | 0.73 | 0.44 | 0.80 | 0.67 | 0.83 | 0.66 | 0.68 |
3 | 0.78 | 0.83 | 0.74 | 0.41 | 0.84 | 0.42 | 0.85 | 0.66 | 0.82 |
4 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
5 | 0.70 | 0.55 | 0.33 | 0.36 | 0.55 | 0.17 | 0.54 | 0.05 | 0.39 |
6 | 0.42 | 0.29 | 0.23 | 0.10 | 0.50 | 0.81 | 0.55 | 0.13 | 0.22 |
7 | 0.53 | 0.83 | 0.25 | 0.10 | 0.59 | 0.16 | 0.61 | 0.03 | 0.71 |
анализ | безработиц | естествен | закон | заработн | минимальн | модел | монопольн | ожидан | |
---|---|---|---|---|---|---|---|---|---|
1 | 0.62 | 0.38 | 0.40 | 0.43 | 0.39 | 0.43 | 0.64 | 0.13 | 0.40 |
2 | 0.60 | 0.24 | 0.37 | 0.32 | 0.23 | 0.18 | 0.63 | 0.10 | 0.24 |
3 | 0.51 | 0.39 | 0.50 | 0.33 | 0.34 | 0.45 | 0.42 | 0.15 | 0.62 |
4 | 0.24 | 0.36 | 0.22 | 0.43 | 0.40 | 0.43 | 0.38 | 0.12 | 0.20 |
5 | 0.38 | 0.14 | 0.14 | 0.17 | 0.15 | 0.22 | 0.47 | 0.11 | 0.07 |
6 | 0.73 | 0.43 | 0.53 | 0.41 | 0.41 | 0.43 | 0.74 | 0.25 | 0.53 |
7 | 0.53 | 0.38 | 0.40 | 0.42 | 0.42 | 0.39 | 0.64 | 0.27 | 0.30 |
Программа | Учебник 1 | Учебник 2 |
---|---|---|
0.8409 | 0.8 | 0.841 |
Количество компонент
Программа | Учебник 1 | Учебник 2 |
---|---|---|
9 | 49 | 8 |
Матрица учебника 1 нечуствительна к порогу это уже говорит что учебник имеет не похожую на программу структуру. Но для полной картины необходимо исследовать графы с помощью алгоритма активации, суть которого представлена выше.