Построение приложения для визуализации текста и его анализа

Источник: IBM

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

Приложение, которое вы создадите, основано на визуализации в виде облака слов. Визуализация в виде облака слов анализирует заданный текст и ранжирует составляющие его слова пропорционально частоте их появления в этом тексте. Затем в зависимости от результатов ранжирования слов они отображаются разным шрифтом; слово с наивысшим рангом отображается в визуализации самым крупным шрифтом. Размещение слов в визуализации может меняться, однако обычно визуализация напоминает облако (см. рис. 1):

Рисунок 1. Облако слов

Word cloud generated from the letter from the President and CEO in the IBM 2011 Annual Report, using IBM Many Eyes

При генерации облака слов, показанного на рис. 1, я с помощью продукта IBM Many Eyes проанализировал письмо от президента и генерального директора IBM, предваряющее итоговый отчет IBM за 2011 год.

Описываемое в этой статье приложение генерирует волну слов- т. е. осуществляет визуализацию текста в виде волны. Эта волна слов помещает слова с высоким рангом в левый верхний угол. На рис. 2 показан пример, в котором используется тот же текст, который был визуализирован на рис. 1:

Рисунок 2. Пример волны слов

Визуализация текста выявляет слова с высоким рангом. Анализ текста на основе визуализации предполагает, что слова с более высоким рангом в иерархии имеют более высокую важность. Для сравнения результаты визуализации двух текстов отображают рядом. Такое сравнение наиболее осмысленно, если контексты обоих текстов одинаковы или похожи. Например, сравнение текстов, описывающих стратегии двух компаний одной отрасли, выявило бы схожие и различные черты в приоритетах этих двух компаний.

На рис. 3 показан примерный набросок итогового сравнения двух текстов. Визуализация первого текста находится в верхней части, а визуализация второго текста - в нижней части. Слова с высоким рангом в обоих текстах находятся слева.

Рисунок 3. Набросок сравнения текстов в визуализации

Rough sketch of a final comparison of two texts

Цели данной статьи и приведенного в ней программного кода - продемонстрировать порядок решения следующих задач.

  • Разработка приложения с поддержкой командной строки для визуализации и сравнения текстов с использованием инструментов и библиотек с открытым исходным кодом.
  • Визуализация (как на рис. 2) заданного текста в виде волны слов.
  • Объединение двух визуализаций в одном изображении с целью сравнения и анализа.
  • Создание зрительно привлекательного видеоролика на основе визуализации

Статья не углубляется в детали разработки, поэтому читателям желательно иметь опыт работы с Java™ и с моделью программирования Eclipse. Весь исходный код приложения доступен для загрузки, в том числе проекты Eclipse для приложения и готовый к развертыванию сайт обновления.

Для начала рассмотрим компоненты среды разработки.

Предварительные условия

Для выполнения описанных в этой статье шагов необходимо установить среду Eclipse и загрузить все необходимые библиотеки. При написании данной статьи использовались следующие версии.

Среда разработки

Среда разработки состоит из различных инструментов и библиотек с открытым исходным кодом, которые, при их совместном использовании, облегчают создание волны слов и видеороликов. Сам программный код приложения имеет относительно небольшую длину. Основные обязанности по обработке изображений и видео, а также по поддержке интерфейса командной строки берут на себя инструменты и библиотеки.

Eclipse

При использовании Eclipse в качестве IDE-среды вы сможете реализовать все возможности приложения Command Line Program.

Command Line Program

Command Line Program - это стороннее приложение типа Eclipse Rich Client Platform (RCP) для создания приложений с поддержкой командной строки. Это приложение использует модель программирования на основе плагинов Eclipse, включая функции и сайты обновления. Приложение Command Line Program предоставляет инфраструктуру для приложений на основе командной строки, в том числе такие базовые функции, как анализ командной строки, команда помощи, команда журналирования и т. д. Наш план состоит в том, чтобы разработать программное обеспечение визуализации и анализа в виде команды расширения для приложения Command Line Program.

Processing и WordCram

Processing Б - это одновременно язык и среда разработки для создания изображений и анимаций. В качестве введения в Processing прочитайте статью Data visualization with Processing, Part 1 (Визуализация данных с помощью языка Processing. Часть 1). Язык Processing прост в изучении и использовании, но при этом с его помощью можно делать серьезные вещи. WordCram - это настраиваемая библиотека для Processing, позволяющая создавать облака слов.

Monte Media Library

Monte Media Library - это простая и мощная библиотека с открытым исходным кодом для создания видеороликов и изображений, а также для их чтения и для манипулирования ими. Автор этой библиотеки (Werner Randelshofer) говорит на своем веб-сайте, что библиотека Monte Media Library является экспериментальным инструментом для его личных исследований. К счастью, он тем не менее решил опубликовать эту библиотеку, что позволяет использовать ее и другим людям. В отличие от других общедоступных библиотек, которые выглядят громоздкими и требуют нативного кода, библиотека Monte Media Library проста в использовании и представляет собой код типа pure Java.

Разработка приложения

Теперь, когда вы познакомились с соответствующими инструментами, можно приступать к разработке приложения под названием TextVisualizationAndAnalysis и к добавлению команды расширения с именем Compare к приложению Command Line Program.

Вам потребуется проект Command Line Program, чтобы вы могли разработать расширение для него. Загрузите проект CLP_Plugin_Main и импортируйте его в рабочее пространство Eclipse. Этот проект включает в себя исходный код для приложения Command Line Program и предоставляет пользователю точки расширения для разработки расширений в его собственных проектах.

Создание проекта подключаемого модуля

Чтобы разработать команду расширения для приложения Command Line Program, сначала создайте проект плагина, как и в случае любого другого проекта для расширения Eclipse:

  1. Создайте новый проект плагина и введите TextVisualizationAndAnalysis в качестве имени этого проекта.
  2. Выберите 3.5 or greater в качестве версии Eclipse и нажмите Next.
  3. Введите 0.0.1 в качестве номера версии, снимите флажок (если он установлен) This plug-in will make contributions to the UI и оставьте значения по умолчанию в остальных полях. Нажмите Next для перехода к заключительному экрану.
  4. Снимите флажок (если он установлен) Create a plug-in using one of the templates и нажмите Finish для создания проекта.
  5. Теперь ваш новый проект находится в рабочем пространстве Eclipse, а на экране открыт файл plugin.xml (если этого не произошло и если файл plugin.xml не существует в каталоге проекта, откройте файл META-INF/MANIFEST.MF).
  6. Откройте вкладку Dependencies и в разделе Required Plug-ins добавьте плагин com.softabar.clpp.application в свой проект. Этот плагин поставляется вместе с проектом Command Line Program Eclipse, который вы импортировали в рабочее пространство Eclipse.
  7. Перейдите на вкладку Extensions и добавьте расширение для точки расширения com.softabar.clpp.application.command, которая предоставлена приложением Command Line Program.
  8. Введите детали этого расширения. Введите compare в поле name. Введите Visualize and compare two text files в поле help. Введите textvisualizationandanalysis.Compare Command в поле class (см. рис. 4).
  9. Рисунок 4. Новая команда для приложения Command Line Program
     Screen capture of the Extension Element Details dialog
 

Класс будет создан позднее. Кроме того, позднее вы сможете добавить к своему плагину новую информацию (при необходимости).

Добавление требуемых библиотек

Чтобы создать команду Compare, добавьте к плагину следующие библиотеки:

  • core.jar из Processing
  • WordCram.jar, jsoup-1.3.3.jar и (при желании) cue.language.jar from WordCram
  • monte-cc.jar из the Monte Media Library

Для этого выполните следующие действия.

Создайте каталог lib в проекте плагина и добавьте JAR-файлы в этот каталог.

Чтобы добавить каталог lib к сборке плагина, откройте файл plugin.xml и выберите вкладку Build. Чтобы выбрать каталог lib в диалоговом окне Binary Build, поставьте флажок в одноименном контрольном окошке, (см. рис. 5).

Рисунок 5. Двоичная сборка плагина (binary build)

  Screen capture of the Binary Build dialog

Откройте вкладку Runtime и в диалоговом окне Classpath выберите Add для добавления библиотек в classpath плагина. На рис. 6 показано диалоговое окно Classpath со всеми добавленными библиотеками (за исключением cue.language.jar).

Рисунок 6. Добавление библиотек в classpath плагина
Screen capture of the Classpath dialog

Сохраните файл plugin.xml.

Написание кода

Теперь можно приступать к написанию фактического кода команды. Исходный код для команды показан в следующих листингах (инструкции упаковки и импорта были специально удалены). Кроме того, необходимо добавить в файл plugin.xml определенную информацию, которую я покажу вам после того, как вы просмотрите все листинги с программным кодом.

Листинг 1 содержит декларацию класса и переменные.

Листинг 1. Декларация класса и переменные
public class CompareCommand extends PApplet implements ICommand, WordColorer {
    private static final long serialVersionUID = -188003470351748783L;
    private static CLPPLogger logger = CLPPLogger.getLogger(CompareCommand.class);
    private static boolean testing = true;
    private static boolean processingDone = false;
    private static String fileName;
    private static String outputDir;
    private static File inputTextFile1;
    private static File inputTextFile2;
    private static boolean drawTitle;
    private static String title1;
    private static String title2;
    private static boolean createVideo = false;
    private static int frameRate;
    private int frameWidth = 1280;
    private int frameHeight = 720;
    private int maxWords = 50;
    // font to be used
    private String font = "c:/windows/fonts/georgiab.ttf";
    private WordCram wordCram1;
    private PGraphics buffer1;
    private WordCram wordCram2;
    private PGraphics buffer2;
    // colors used in word waves

    private int[] colors = { 0x22992A, 0x9C3434, 0x257CCD, 0x950C9E };

В листинге 1 производится расширение класса processing.core.PApplet с целью использования методов Processing. Затем реализуются два интерфейса: com.softabar.clpp.program.ICommand и wordcram.WordColorer. Интерфейс com.softabar.clpp.program.ICommand предназначен для приложения Command Line Program; приложение Command Line Program осуществляет вызов этого интерфейса при исполнении нашей команды. Интерфейс wordcram.WordColorer манипулирует цветами облаков слов (или волн). Некоторые переменные декларированы как static, поскольку код Processing должен видеть их в процессе исполнения.

В листинге 2 показан метод execute() интерфейса ICommand:

Листинг 2. Метод execute()
public void execute(CommandLine commandLine, IProgramContext programContext) {
    testing = false;
    String inputFileStr = commandLine.getOptionValue("input1");
    inputTextFile1 = new File(inputFileStr);
    if (!inputTextFile1.exists()) {
      Output.error(inputFileStr + " does not exist.");
      return;
    }
    inputFileStr = commandLine.getOptionValue("input2");
    inputTextFile2 = new File(inputFileStr);
    if (!inputTextFile2.exists()) {
      Output.error(inputFileStr + " does not exist.");
      return;
    }
    drawTitle = commandLine.hasOption("title");
    fileName = commandLine.getOptionValue("filename", "results");
    outputDir = commandLine.getOptionValue("outputdir", ".");
    if (!outputDir.endsWith("/")) {
      outputDir = outputDir + "/";
    }
    title1 = commandLine.getOptionValue("title1", inputTextFile1.getName());
    title2 = commandLine.getOptionValue("title2", inputTextFile2.getName());
    String frate = commandLine.getOptionValue("framerate", "5");
    frameRate = Integer.parseInt(frate);
    createVideo = commandLine.hasOption("video");
    Output.println("Generating comparison word waves...");
    generateWordCloud();
    createVideo();
}

В листинге 2 метод execute() получает экземпляр org.apache.commons.cli.CommandLine как параметр; этот параметр получает опции для команды. Добавьте поддерживаемые опции в файл plugin.xml позже. После того как вы получили и настроили опции, создайте облако слов посредством вызова метода generateWordCloud(). Затем создайте видеоролик посредством вызова метода createVideo().

В листинге 3 показан метод generateWordCloud(), который осуществляет вызов метода main в классе processing.PApplet, а затем ждет, пока Processing/WordCram закончит рендеринг облака слов.

Листинг 3. Метод generateWordCloud()
private void generateWordCloud() {
    try {
      main(new String[] { "--present", getClass().getName() });
      // wait until word wave is finished
      while (!processingDone) {
        try {
          Thread.sleep(0, 1);
        } catch (InterruptedException e) {
        }
      }
    } catch (Exception e) {
      logger.error(e.toString(), e);
      Output.error(e.toString());
    }
}

В листинге 4 показан метод setup для генерации облаков слов.

Листинг 4. Метод setup()
public void setup() {
    if (testing) {
      logger.debug("testing");
      inputTextFile1 = new File("c:/CocaCola_MissionVisionValues.txt");
      inputTextFile2 = new File("c:/PepsiCo_MissionVisionValues.txt");
      outputDir = "c:/output/";
      fileName = "results";
      drawTitle = true;
      createVideo = false;
      title1 = "Coke";// inputTextFile1.getName();
      title2 = "Pepsi";// inputTextFile2.getName();
    }
    logger.debug("frameWidth: {}, frameHeight: {}", frameWidth, frameHeight);
    size(frameWidth, frameHeight);
    background(255);
    logger.debug("setup");
    // create buffer to draw the upper word wave
    buffer1 = createGraphics(frameWidth, frameHeight / 2, JAVA2D);
    buffer1.beginDraw();
    buffer1.background(255);
    wordCram1 = initWordCram(inputTextFile1, buffer1);
    // create buffer to draw the lower word wave
    buffer2 = createGraphics(frameWidth, frameHeight / 2, JAVA2D);
    buffer2.beginDraw();
    buffer2.background(255);
    wordCram2 = initWordCram(inputTextFile2, buffer2);
    // set up font for titles
    fill(0);
    textFont(createFont(font, 40));
    textAlign(CENTER);
}

В листинге 4 среда Processing осуществляет вызов метода setup() до начала рисования. На этом этапе вы инициализируете размер экрана и цвет фона, а также создаете графические буферы, в которые помещается облако слов, сгенерированное WordCram. Кроме того, этот код задает переменные для тестирования из среды Eclipse.

Библиотека WordCram, отвечающая за генерацию облаков слов, инициализируется в листинге 5. Вы можете задать такие аспекты облака слов, как размещение и цвета. Библиотека WordCram предоставляет несколько механизмов размещения (placer), таких как используемая в этой статье волна, а также несколько механизмов окрашивания для слов (colorer). В данном случае вы используете свой собственный механизм окрашивания.

Листинг 5. Метод initWordCram()
private WordCram initWordCram(File inputFile, PGraphics buffer) {
    WordCram wordCram = new WordCram(this);
    if (buffer != null) {
      wordCram = wordCram.withCustomCanvas(buffer);
    }
    // initialize WordCram with specified placer, text file,
    // colorer, and other details
    wordCram = wordCram.fromTextFile(inputFile.getPath());
    wordCram = wordCram.withColorer(this);
    wordCram = wordCram.withWordPadding(2);
    wordCram = wordCram.withPlacer(Placers.wave());
    wordCram = wordCram.withAngler(Anglers.randomBetween(-0.15f, 0.15f));
    wordCram = wordCram.withFont(createFont(font, 40));
    wordCram = wordCram.sizedByWeight(7, 52);
    wordCram = wordCram.maxNumberOfWordsToDraw(maxWords);
    return wordCram;
}

В листинге 6 показано, что генерацию облака слов осуществляет метод draw().

Листинг 6. Метод draw()
public void draw() {
    logger.debug("Draw..");
    // draw one word at a time
    if (wordCram1.hasMore()) {
      // draw next word in upper word wave
      wordCram1.drawNext();
      buffer1.endDraw();
      image(buffer1, 0, 0);

      buffer1.beginDraw();
      // draw next word in lower word wave
      wordCram2.drawNext();
      buffer2.endDraw();
      image(buffer2, 0, frameHeight / 2);
      buffer2.beginDraw();
    } else {
      buffer1.endDraw();
      buffer2.endDraw();
      image(buffer1, 0, 0);
      image(buffer2, 0, frameHeight / 2);
      listSkippedWords(inputTextFile1.getName(), wordCram1);
      listSkippedWords(inputTextFile2.getName(), wordCram2);
      noLoop();
      // if no video then
      // save only last frame result
      if (!createVideo) {
        saveFrame(outputDir + fileName + ".png");
      }
      // for testing purposes within Eclipse
      if (testing) {
        createVideo();
      }
      processingDone = true;
    }
    if (drawTitle) {
      color(0);
      textSize(20);
      text(title1, 0, 0, frameWidth, 50);
      text(title2, 0, frameHeight / 2, frameWidth, 50);
    }
    if (createVideo) {
      saveFrame(outputDir + fileName + "-####.png");
    }
}

Генерация облака слов производится пословно. В листинге 6 используется два различных буфера для двух облаков слов; затем оба этих буфера переносятся на экран. Когда облако слов будет готово, вы заканчиваете рисование и перечисляете все пропущенные слова. В случае создания видеоролика вы сохраняете каждый кадр в виде изображения; эти изображения используются для генерации видео.

Метод listSkippedWords() в листинге 7 выводит печать список слов, которые невозможно включить в визуализацию.

Листинг 7. Метод listSkippedWords()
private void listSkippedWords(String desc, WordCram wordcram) {
    Word[] words = wordcram.getWords();
    int skipped = 0;
    // for each word check whether it was skipped
    List<String> skippedWords = new Vector<String>();
    for (Word word : words) {
      if (word.wasSkipped()) {
        int skippedBecause = word.wasSkippedBecause();
        if (skippedBecause == WordCram.NO_SPACE) {
          // increase number of skipped words
          // only if no space for word
          skippedWords.add(word.word);
          skipped++;
        }
      }
    }
    // print number of skipped words
    if (skipped > 0) {
      logger.debug("skippedWords: {}, {}", desc, skippedWords);
      Output.println(desc + ": no space for " + skipped + " words: "
          + skippedWords);
    }
}

Возврат пропущенных слов означает, что в визуализация могут быть пропущены важные слова. Последующий анализ на основе такой визуализации способен ввести в заблуждение и даже породить ложные выводы. В случае возвращения каких-либо пропущенных слов вы можете снова запустить программу на исполнение, чтобы она попыталась разместить в облаке слов все слова.

Метод colorFor() в листинге 8 реализует интерфейс WordColorer от WordCram. Этот метод возвращает выбранные по случайному закону цвета из заранее заданного списка.

Листинг 8. Метод colorFor()
public int colorFor(Word w) {
    int index = (int) random(colors.length);
    int colorHex = colors[index];
    int r = colorHex >> 16;
    int g = (colorHex >> 8) & 0x0000ff;
    int b = colorHex & 0x0000ff;
    logger.debug("R: {}, G: {}, B: {}", new Integer[] { r, g, b });
    return color(r, g, b);
}

В листинге 9 показан заключительный метод createVideo(), вызов которого осуществляется в листинге 6.

Листинг 9. Метод createVideo()
private void createVideo() {
    if (createVideo) {
      Output.println("Generating video...");
      try {
        File aviFile = new File(outputDir, fileName + ".avi");
        // format specifies the type of video we are creating
        // video encoding, frame rate, and size is specified here
        Format format = new Format(org.monte.media.FormatKeys.EncodingKey,
            org.monte.media.VideoFormatKeys.ENCODING_AVI_PNG,
            org.monte.media.VideoFormatKeys.DepthKey, 24,
            org.monte.media.FormatKeys.MediaTypeKey, MediaType.VIDEO,
            org.monte.media.FormatKeys.FrameRateKey,
            new Rational(frameRate, 1),
            org.monte.media.VideoFormatKeys.WidthKey, width,
            org.monte.media.VideoFormatKeys.HeightKey, height);
        logger.debug("Framerate: {}", frameRate);
        AVIWriter out = null;
        try {
          // create new AVI writer with previously specified format
          out = new AVIWriter(aviFile);
          out.addTrack(format);
          int i = 1;
          // read the first image file
          String frameFileName = String.format(fileName + "-%04d.png", i);
          File frameFile = new File(outputDir, frameFileName);
          while (frameFile.exists()) {
            logger.debug("Frame filename: {}", frameFileName);
            // while frame images exist
            // create a Buffer and write it to AVI writer
            Buffer buf = new Buffer();
            buf.format = new Format(org.monte.media.FormatKeys.EncodingKey,
                org.monte.media.VideoFormatKeys.ENCODING_BUFFERED_IMAGE,
                org.monte.media.VideoFormatKeys.DataClassKey,
                BufferedImage.class).append(format);
            buf.sampleDuration = format.get(
                org.monte.media.FormatKeys.FrameRateKey).inverse();
            buf.data = ImageIO.read(frameFile);
            out.write(0, buf);
            // read next frame image
            i++;
            frameFileName = String.format(fileName + "-%04d.png", i);
            frameFile = new File(outputDir, frameFileName);
          }
        } finally {
          if (out != null) {
            out.close();
          }
          Output.println("Done.");
        }
      } catch (IOException e) {
        logger.error(e.toString(), e);
        Output.error(e.toString());
      }
    }
}

Листинг 9 демонстрирует простоту создания видео из изображений. Вам требуется лишь задать формат видео, а затем создать видео по одному изображению за раз.

Добавление опций командной строки к файлу plugin.xml

Итак, наш программный код готов. Прежде чем его можно будет развернуть, добавьте опции командной строки в файл plugin.xml, чтобы приложение Command Line Program смогло осуществлять их разбор.

  1. Откройте файл plugin.xml, а затем откройте вкладку Extensions.
  2. Выберите опцию compare-command, нажмите правую кнопку, а затем выберите New > option.
  3. Нашему приложению требуются опции input1, input2 и video. Опции input1 и input2 задают имена для двух текстовых файлов, которые вы собираетесь сравнивать. Опция video генерирует видео (если она опущена, то видео не генерируется). На рис. 7 показано определение опции input1 (Text 1 file to compare), а также другие опции, которые можно добавить в случае необходимости.
Рисунок 7. Опции команды

Screen capture of the Extension Element details dialog in the Extensions tab

Теперь команда

Compare

для Command Line Program готова, и вы можете развернуть ее.

Развертывание приложения

Чтобы использовать приложение TextVisualizationAndAnalysis, необходимо развернуть его в среде Command Line Program. Создайте функцию и сайт обновления для плагина TextVisualizationAndAnalysis, а затем установите его в среде Command Line Program.

Создание функции

Функции в Eclipse представляют собой устанавливаемые и обновляемые наборы плагинов. Приложение Command Line Program использует стандартную функциональность Eclipse для установки, обновления и удаления новых команд-расширений. Чтобы создать функцию для команды Compare, выполните следующие шаги.

  1. Создайте проект функции и присвойте ему имя TextVisualizationAndAnalysisFeature.
  2. В качестве номера версии укажите 0.0.1 и нажмите Next.
  3. Выберите плагин TextVisualizationAndAnalysis и нажмите Finish.

Генерация сайта обновления

Сайты обновления содержат функции, которые можно установить в соответствующие приложения. Сайт обновления может быть локальным каталогом или дистанционно расположенным веб-сервером. Чтобы создать сайт обновления для программы TextVisualizationAndAnalysis выполните следующие шаги.

Создайте проект сайта обновления и присвойте ему имя

TextVisualizationAndAnalysisUpdateSite

На странице Update Site Map под заголовком Managing the Site выберите Add Feature для добавления функции

TextVisualizationAndAnalysisFeature

(см. рис. 8).

Рисунок 8. Страница Update Site Map
Screen capture of the Update Site Map page

Нажмите Build All.

Установка команды

Вы не сможете выполнить команду отдельно, поскольку ее необходимо установить в среду Command Line Program. Установка осуществляется с помощью самого приложения Command Line Program. Введите команду admin (в данном случае предполагается, что созданный сайт обновления находится в каталоге c:/workspace/).

clp.cmd admin --install --dir='c:\workspace\TextVisualizationAndAnalysisUpdateSite'

Исполнение приложения

Ниже показано несколько примеров команд, которые показывают, каким образом можно исполнять описываемое приложение.

Генерация и показ изображения с результатами сравнения текстов.

clp.cmd compare --input1='c:/path/file1.txt' --input2='c:/path/file2.txt'

Использование имен входных файлов в качестве заголовка для визуализации.

clp.cmd compare --input1='c:/path/file1.txt' --input2='c:/path/file2.txt' --title

Использование настраиваемых заголовков.

clp.cmd compare --input1='c:/path/file1.txt' --input2='c:/path/file2.txt'
   --title --title1='Text1' --title2='Text2'

Генерация изображения и видео.

clp.cmd compare --input1='c:/path/file1.txt' --input2='c:/path/file2.txt' -title --video

Кодирование видео

Обратите внимание, что в листинге 6 для кодирования видео задан формат PNG. Это видео может не воспроизводиться в некоторых проигрывателях; его можно воспроизвести при помощи мультимедийного проигрывателя с открытым исходным кодом VLC.

Результаты и анализ

Теперь можно приступать к практическому использованию приложения TextVisualizationAndAnalysis. Я использую его для визуализации двух похожих текстов: публично доступных заявлений типа "миссия организации" (mission statement) от двух корпораций из одной отрасли - Coca Cola Company и PepsiCo. Затем я использую визуализацию для проведения анализа. Предполагается, что волны слов будут визуализировать то, что думают вышеуказанные корпорации, и что является самым важным для них - в данный момент и в будущем.

Визуализация

Я использовал последнюю команду из предыдущего раздела Исполнение приложения, для генерации изображения и видео. На рис. 9 визуализированы результаты сравнения этих двух текстов.

Рисунок 9. Визуализация двух подобных текстов

Visualization comparison of the mission statements from the Coca Cola Company and PepsiCoНа рис. 9 верхняя волна слов визуализирует заявление Mission, Vision & Values корпорации Coca-Cola; нижняя волна слов визуализирует заявление Values & Philosophy корпорации PepsiCo. Эти волны слов демонстрируют по 50 самых упоминаемых слов в соответствующих текстах, при этом слова с более высокой частотой упоминания размещаются в левом верхнем углу. Размер шрифта уменьшается в направлении слева направо; другими словами, слова в правом нижнем углу упоминаются менее часто, чем слова в левом верхнем углу.

На врезке представлен десятисекундный видеоролик с пословной генерацией визуализации

Анализ

Чтобы проанализировать сравнение визуализаций на рис. 9, присвоим максимальную важность словам в левом верхнем квадранте. Сначала для каждой волны слов нарисуем на визуализации вертикальную линию, смещенную от ее левой границы на расстояние одной четверти ширины волны (рис. 10).

Рисунок 10. Анализ двух текстов

Analyzing the visualization comparison in Figure 9 to assign word importance in the left quarter

Я исхожу из предположения, что слова слева от вышеупомянутой линии обе корпорации рассматривают как самые важные.

Складывается впечатление, что корпорация Coca-Cola концентрируется на своей концепции и имеет перспективный план по реализации этой концепции. Кроме того, она рассматривает весь мир как свой бизнес и оценивает свои действия и качество своей работы с точки реализации своей концепции.

Применительно к корпорации PepsiCo складывается впечатление, что ее бизнес-цель состоит в росте, в том числе в росте финансовых показателей. Кроме того, похоже, что эта корпорация придает большое значение экологическим и социальным аспектам.

Даже такое краткое сравнение результатов визуализации показывает, что две компании из одной отрасли могут существенно различаться по своим взглядам. Наш анализ позволяет обосновать следующее заключение: корпорация Coca-Cola Company больше озабочена своим местом в будущем мире, а корпорация PepsiCo больше думает о бизнесе и о своем росте.

Обновление приложения

В определенный момент времени вы захотите обновить приложение TextVisualizationAndAnalysis. При обновлении используется тот же механизм, что и при установке. Для обновления приложения выполните следующие шаги.

  1. Внесите необходимые изменения в программный код или в другие файлы.
  2. Увеличьте номер версии у плагина и у функции.
    • Важное замечание: Изменение номера версии требуется и для плагина, и для функции. В противном случае механизм обновления не сможет обнаружить, что изменения были произведены.
    • Номер версии должен увеличиваться инкрементно, с минимально допустимым шагом. Например, прежняя версия имела номер 0.0.1, а новая версия будет иметь номер 0.0.2.
  3. Добавьте новую версию на сайт обновления и на сайт обновленных сборок.
  4. Выполните следующую команду.
    clp.cmd admin --update --dir='c:\workspace\TextVisualizationAndAnalysisUpdateSite'
  5. Запустите приложение на исполнение в обычном режиме.
 

Заключение

Визуализация - это мощный инструмент для достижения нового уровня понимания текстов. Используя существующие инструменты с открытым исходным кодом, мы создали визуализирующее приложение, которое сравнивает и анализирует два любых текста. Приложение TextVisualizationAndAnalysis также подходит для сравнения текстов любого другого типа - например, корпоративных стратегий, биографий знаменитостей или беллетристических произведений. Однако самое замечательное заключается в том, что вы сможете использовать изученные вами инструменты и методы для создания собственных приложений визуализации.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=35470