Примітивний контент-аналіз.

Для цього прикладу візьмемо задачу, знайому більшості колег, що працюють над створенням та наповненням web-сайтів. Задача полягає у визначенні частоти, з якою зустрічаються слова у заданому тексті. Скептики, звичайно, будуть настоювати на тому, що не потрібно “винаходити велосипед” – програм та web-сервісів для контент-аналізу в мережі можна знайти більш ніж достатньо. Не варта їм перечити – достатньо побажати, щоб не забули включити у свій пошуковий запит чарівну фразу “скачать бесплатно” для забезпечення чудового вечора перегдяду шедерврів реклами сайтів для дорослих, сенсаційних новин про знаменитостей та супер-ідей мережевого бізнесу. Якщо ж без жартів, то зрозуміло, що розглянутий далі макрос не може претендувати на роль незамінного помічника при аналізі написаних тексів, а є лише черговим прикладом використання OOo Basic, і його мета лише продемонструвати що і як саме можна зробити за допомогою макросів.

Отож. Уточнимо задачу і сформулюємо завдання для макроса наступним чином:
для тексту, що міститься в документі визначити кількість входження кожного слова, що в ньому зустрічається і повідомити у зручний для користувачеві та простий для реалізації спосіб. Очевидно, врахування різних форм і відмінків слів є алгоритмічно складною задачою, від реалізації якої в нашому простому прикладі доведеться відмовитися. Вважатимемо, що текст для аналізу записано у документі з макросом і до нього можна звернутися через об’єкт ThisComponent, після створення і налагодження макроса спосіб отримання тексту можна буде змінити.

Першим етапом створення нашого макроса буде “навчити” його ділити текст на окремі слова. Як відомо із підрозділу про роботу з текстовими документами Writer, це можна організувати за допомогою текстового курсора, який має методи для переміщення між словами у тексті. Наприклад, таким чином:

Sub WordsParser()
Dim Cursor As Object
Dim n As Integer
Cursor = ThisComponent.Text.createTextCursor
Cursor.gotoStart(False)
n = 0
Do While Cursor.gotoNextWord(True)
MsgBox Cursor.getString()
Cursor.gotoStartOfWord(False)
n = n + 1
Loop
MsgBox “У тексті всього “ & n & ” слів”
End Sub

Про дію, аргументи та результат використаних методів можна довідатися у згаданому вище підрозділі підручника. Для перевірки роботи макроса можна набрати декілька слів у документі. Не надто багато, щоб не стомитися, клацаючи по кнопці вікна повідомлення MsgBox, викликом якого тимчасово замінено подальшу обробку слів тексту.

Наступний етап – власне, опрацювання виділених з документа слів – можна реалізувати різними способами. Наприклад, записувати слова в деякий динамічний список і кожне наступне слово порівнювати з елементами цього списку – у разі співпадіння збільшувати лічильник елемента, з яким співпало слово, в протилежному випадку – дописувати слово у кінець списку. Перевага такого способу – статистика буде оримана відразу, недолік – двже велика кількість порівнянь, що може замітно вплинути на час виконання навіть при невеликих обсягах тексту. Інший спосіб – записати всі слова з тексту в деякий статичний масив, а вже потім здійснювати його обробку. Традиційний його недолік – резервування наперед значного обсягу пам’яті, яка потім може виявитися не задіяною.

А чому б не скористатися засобом Open Office, який спеціально призначений для опрацювання списків – електронною таблицею Calc?! “Виписавши” слова тексту у стовпець електронної таблиці ми отримаємо не тільки зручну для опрацювання форму, але і набір готових інструментів для роботи з цим списком. Отже, наступний крок – виписати слова з документа у стовпчик ЕТ, далі його можна буде посортувати засобами Calc, що значно спростить підрахунок.

Маленька проблема – виконання макроса починалося з документа Writer – вирішується, як кажуть, в одну стрічку:

StatTable = StarDesktop.LoadComponentFromUrl(“private:factory/scalc”, _
“_blank”, 0, noArgs())

для якої щоправда доведеться створити додаткову змінну noArgs() для аргументів методу LoadComponentFromUrl. Цей метод, взагалі кажучи, завантажує документ із вказаної URL-адреси, але спеціальне значення URL – “private:factory/scalc” вказує методу, що потрібно створити нову електронну таблицю. Створення нової ЕТ, очевидно, тягне за собою і запуск самої програми OOo Сalc. Конструкцію в тілі циклу

MsgBox Cursor.getString()

що “моргала” нам повідомленням з черговим словом замінимо на конструкцію

StatTable.Sheets(0).getCellByPosition(0,n).SetString(Cursor.getString())

яка це ж чергове слово запише в чергову комірку першого стовпця створеної електронної таблиці. Залишилося посортувати отиманий стовпець слів. Тут ми, нарешті, не будемо винаходити велосипед, а лише приладнаємо до нього маленький двигун. Эндрю Питоньяк. OpenOffice.org Объяснение Макросов. — Hentzenwerke Publishing, 2004, сторінка 400. Візьмемо готовий макрос для сортування вказаного діапазону і приладнаємо до нього аргумент, яким і буде потрібний діапазон. Отримаємо підпрограму:

Sub SortColZero(oRange As Object)
Dim oSortFields(0) as new com.sun.star.util.SortField
Dim oSortDesc(0) as new com.sun.star.beans.PropertyValue
oSortFields(0).Field = 0
oSortFields(0).SortAscending = TRUE
oSortDesc(0).Name = “SortFields”
oSortDesc(0).Value = oSortFields()
oRange.Sort(oSortDesc())
End Sub

Тепер впишемо виклик цієї підпрограми наприкінці основного макроса:

SortColZero(StatTable.Sheets(0).getCellRangeByName(“A1:A” & CStr(n)))

Отож. Якщо ви не пропустили жодного кроку і все зробили правильно можете скопіювати кільканадцять сторінок тексту у свій документ і випробувати створений інструмент. Хоча він ще і потребує доводки та вдосконалення, але навіть в такому вигляді вже дає уявлення про те скільки і яких слів використано у набраному тексті.

продовження теми

Залишити відповідь