Базовая матрица контент-анализа в Micosoft SQL Server

Здравствуйте, уважаемые читатели блога о контент-анализе!

Сегодня будет пост о создании базовой матрицы контент-анализа в MICROSOFT SQL SERVER.

sqlserv

В MS SQL Server я совершенно не профи, но кое что могу показать. Этот пост сугубо для непрофессионалов в области SQL. В нём будет рассказано, как можно создать базовую матрицу контент-анализа, аналогичную создаваемой в программе ЛЕКТА (ЕЁ ПРИМЕР ВОТ ТУТ), используя MS SQL сервер. Матрица отражает присутствие каждого слова из группы слов в каждом из текстов. Есть в тексте слово — в ячейке 1, нет слова — 0. Далее, можно, например, факторизовать матрицу, дабы редуцировать количество переменных до меньшего количество факторов — по сути, просто выделить более общие темы, представленные группами слов из вашего словаря на основе корреляций переменных исходной матрицы контент-анализа.

На MS SQL сервере такую работу провести совсем нетрудно, а главное, нет необходимости вводить в словарь контент-анализа все возможные словоформы слов словаря — достаточно одной формы. Остальные словоформы MS SQL сервер найдет сам. Например, в YOSHIKODER надо позаботиться и о внесении всех словоформ слов словаря.

Кстати, полнофункциональная демо версия MS SQL сервера действует пол года.

Установить сервер от MICROSOFT можно ЗДЕСЬ.

Разбираться с задачей будем на основе многострадального массива текстов о Нижнем Новгороде (это массив из 250 глубинных интервью). В принципе, тематика для нас абсолютно не важна — нам нужны только тексты. Массив фрагментов интервью находится тут —  nn texts. Файлик сохраняем в формате CSV. Обязательно как-нибудь назовите первый столбец на латинице.

Для того, чтобы работать с текстами, первоначально нам необходимо загрузить их на сервер. Для этого удобнее использовать мастер импорта и экспорта MS SQL сервера (устанавливается вместе с сервером). В списке программ находим мастер, открываем. Видим следующее и нажимаем ДАЛЕЕ:

sql1

В качестве источника выбираем НЕСТРУКТУРИРОВАННЫЙ ФАЙЛ

sql2

Выбираем наш файл на жестком диске через поле ОБЗОР.

sql5

Переходим в подменю ДОПОЛНИТЕЛЬНО и задаём максимальное количество символов в ячейках с нашими текстами. Например, 1500.  Если тексты в таблице будут длиннее — экспорт не будет произведен. После этого нажимаем ДАЛЕЕ.

sql6

В подменю СТОЛБЦЫ в качестве разделителя лучше указать вертикальную черту:

sql7

Далее нужно выбрать источник данных SQL SERVER NATIVE CLIENT 11.0, потом ввести название сервера (вы его задаёте при установке MS SQL сервера) — у меня aryumin. Далее выбрать название базы данных — я для этого поста создал базу данных под названием nn. (База данных создаётся через MS SQL Sever Managment studio (она также устанавливается при установке сервера).

sql4

Нажимаем далее, далее, далее и потом ГОТОВО.

sql8

Тексты успешно импортированы.

Теперь заходим в MS SQL SERVER MANAGMENT STUDIO, создаём новый запрос (кнопка создать запрос), подключающий нас к базе данных nn

USE nn
GO

Выделяем запрос и нажимаем ВЫПОЛНИТЬ

sql9

Ниже на скрине вы видите запрос

SELECT * FROM [dbo].[nn texts]

Это запрос покажет нам всю импортированную на сервер таблицу. Выделим его и нажмём ВЫПОЛНИТЬ

sql10

Собственно вот и наши тексты из таблицы.

Для дальнейшей работы нам во-первых потребуется создать дополнительный столбец и создать на нём уникальный индекс:

ALTER TABLE [dbo].[nn texts]
ADD ID INT IDENTITY(1,1) NOT NULL

sql11Теперь нам надо создать уникальный индекс на добавленном столбце. Выполняем запрос:

CREATE UNIQUE INDEX nn ON [dbo].[nn texts](id)

sql12Теперь создаём каталог полнотекстового индекса:

CREATE FULLTEXT CATALOG nn_catalog

sql13

Теперь нам надо создать полнотекстовый индекс на столбце с нашими текстами. Для этого нажимаем правой кнопкой мыши на название нашей таблицы в обозревателе объектов и переходим в меню ПОЛНОТЕКСТОВЫЙ ИНДЕКС/ОПРЕДЕЛИТЬ ПОЛНОТЕКСТОВЫЙ ИНДЕКС.

sql14

В мастере полнотекстового индекса выбираем столбец таблицы, которому будет присвоен индекс:

sql15

Дальше:

sql17

Теперь выберем созданный нами каталог полнотекстового индекса nn_catalog:

sql18

Снова ДАЛЕЕ, ДАЛЕЕ и ГОТОВО. Получаем сообщение о том, что всё ОК (надеюсь и у вас ОК 🙂 )

sql19

Теперь наша задача просмотреть присутствие слов или групп слов с учетом всех их словоформ в каждом из текстов. Соответственно, словари могут быть самыми разными. Для поиска наиболее часто встречающихся слов можете воспользоваться лемматизатором. Например, вот ЭТИМ.

Допустим, у нас всего три группы слов (разумеется, если это словарь наиболее частотных слов, у вас их может быть и сто, и двести, и триста,  пр). Группы неполные — пишу их просто для примера, наполняя всего несколькими основными словами по теме:

  1. Достопримечательности и культура Нижнего Новгорода: достопримечательности, памятник, кремль, музей, выставка, экспозиция, художник, картина, консерватория, филармония
  2. Транспортная инфраструктура: дороги, пробки, машины, авто, автомобили, парковки, парковаться, трамвай, троллейбус, метро, пассажир, трасса, шоссе
  3. Зоны отдыха: парк, сквер

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

sql20

Таким образом — вот запрос:

DECLARE @culture varchar(200), @dorogi varchar(200), @parki varchar(200)
SET @culture = ‘достопримечательности, памятник, кремль, музей, выставка, экспозиция, художник, картина, консерватория, филармония’
SET @dorogi = ‘дороги, пробки, машины, авто, автомобили, парковки, парковаться, трамвай, троллейбус, метро, пассажир, трасса, шоссе’
SET @parki = ‘парк, сквер’
SELECT ID, texts_nn,
(SELECT 1 WHERE FREETEXT(texts_nn, @culture)) AS ‘культура’,
(SELECT 1 WHERE FREETEXT(texts_nn, @dorogi)) AS ‘транспорт’,
(SELECT 1 WHERE FREETEXT(texts_nn, @parki)) AS ‘отдых’
FROM [dbo].[nn texts]

Результат виден под запросом. В строке, где слово из группы встречается в тексте, стоит 1, если не встречается — NULL

Можно выгрузить таблицу, нажав на нее правой кнопкой мыши и выбрав КОПИРОВАТЬ С ЗАГОЛОВКАМИ или СОХРАНИТЬ РЕЗУЛЬТАТ КАК:

sql21

Ну а дальше можете посчитать частотность слов каждой группы в EXCEL или приступить к качественной интерпретации. Если хотите просто посмотреть частотность каждой из категорий слов, можете использовать вот такой запрос:

sql22Вот сам запрос:

SELECT ‘достопримечательности’   AS ‘наименование тематики’, COUNT(texts_nn) AS ‘количество сообщений’
FROM [dbo].[nn texts] where FREETEXT(texts_nn,’достопримечательности, памятник, кремль, музей, выставка, экспозиция, художник, картина, консерватория, филармония’)
UNION ALL
SELECT ‘транспорт’ AS ‘наименование тематики’, COUNT(texts_nn) AS ‘количество сообщений’
FROM [dbo].[nn texts] where FREETEXT(texts_nn, ‘дороги, пробки, машины, авто, автомобили, парковки, парковаться, трамвай, троллейбус, метро, пассажир, трасса, шоссе’)
UNION ALL
SELECT ‘пакрки’ AS ‘наименование тематики’, COUNT(texts_nn) AS ‘количество сообщений’
FROM [dbo].[nn texts] where FREETEXT(texts_nn, ‘парк, сквер’)

 

Для компактности можно также присвоить слова категорий переменным:

sql23

Вот сам запрос:

DECLARE @culture varchar(200), @dorogi varchar(200), @parki varchar(200)
SET @culture = ‘достопримечательности, памятник, кремль, музей, выставка, экспозиция, художник, картина, консерватория, филармония’
SET @dorogi = ‘дороги, пробки, машины, авто, автомобили, парковки, парковаться, трамвай, троллейбус, метро, пассажир, трасса, шоссе’
SET @parki = ‘парк, сквер’
SELECT ‘достопримечательности’   AS ‘наименование тематики’, COUNT(texts_nn) AS ‘количество сообщений’
FROM [dbo].[nn texts] where FREETEXT(texts_nn, @culture)
UNION ALL
SELECT ‘транспорт’ AS ‘наименование тематики’, COUNT(texts_nn) AS ‘количество сообщений’
FROM [dbo].[nn texts] where FREETEXT(texts_nn, @dorogi)
UNION ALL
SELECT ‘пакрки’ AS ‘наименование тематики’, COUNT(texts_nn) AS ‘количество сообщений’
FROM [dbo].[nn texts] where FREETEXT(texts_nn, @parki)

 

Под компактностью я подразумеваю вынос рядов слов за пределы самого запроса — вначале создаём переменные и задаём им группы слов в качестве значений, а уже потом ищем. Если у вас много слов категорий, то это разумное решение.

Как я уже сказал, дальше можно, например, факторизовать матрицу, как это описано ТУТ. Это актуально в частности, если вы создали словарь наиболее часто встречающихся слов, и хотите их интегрировать в более крупные тематические группы.

Вот 🙂

Если есть какие-то вопросы — пишите в комментариях.

Спасибо!

 

Print Friendly, PDF & Email

Автор

Алексей Рюмин

Здравствуйте, уважаемый гость блога! Меня зовут Алексей Рюмин. На этом блоге мне хочется поделиться с Вами материалами о контент-анализе. Надеюсь, они окажутся полезными и интересными Вам. Приятного прочтения блога!