テキスト視覚化アナリティクス・アプリケーションを構築する

Eclipse とその他のオープンソース・ソフトウェアを使ってワード・ウェイブ・アプリケーションを開発する

テキスト視覚化は、特定のテキストが伝えている内容を視覚的に分析する効果的な方法です。Eclipse とオープンソースのテキスト視覚化アナリティクス・ツールを組み合わせて、2 つのテキストを視覚化して比較するワード・ウェイブ・アプリケーションを構築する方法を学んでください。

2013年 4月 02日 ― 囲み記事「テキストからもっと多くの情報を入手する」と「参考文献」の「学ぶために」に記載されている、IBM InfoSphere Streams へのリンクと IBM InfoSphere BigInsights へのリンクの URL を更新しました。

Sami Salkosuo, Software Architect, IBM

author photoSami Salkosuo は、フィンランドの IBM Software Group に勤めるソフトウェア・クライアント・アーキテクト (ソフトウェア IT アーキテクト) です。15 年近く IBM に勤務する彼は現在、製造部門の顧客を担当しています。また、OpenNTF.org で公開されているオープンソース・プロジェクト、Lotus Notes 対応 Command Line Email Client の作成者でもあります。余暇は、インディーズの著者として SF を執筆しています。Sami のブログを読むか、Twitter で彼をフォローしてください。



2013年 6月 13日

テキストからもっと多くの情報を入手する

テキストから重要な情報や概念を抽出することで、テキストをさらに有効に活用することができます。IBM ビッグ・データ・プラットフォームの先進的なテキスト・アナリティクス機能には、アクセラレーターを使用したツールキット、IDE、宣言型言語 (AQL) が組み込まれています。開発者はこれらを利用して、テキストを構文解析し、検索対象の要素を見つけてその意味を理解し、構造化された形で要素を抽出して他のアプリケーションで使用することができます。先進的なテキスト・アナリティクス機能は、IBM InfoSphere Streams 製品または IBM InfoSphere BigInsights 製品で利用することができます。InfoSphere Streams および InfoSphere BigInsights の詳細を学んでください。

テキスト視覚化は、特定のテキストが伝えている内容を素早く解明し、ときには目を見張るような結果をもたらす強力な手法です。視覚化は副産物として、テキスト (複数の場合もあります) のアドホック分析を行うための手段も提供します。この記事では、オープンソースのツールとライブラリーを使用して、テキスト視覚化アナリティクス・ソフトウェアを開発する方法を説明します。このサンプル・アプリケーションは、同じコンテキストまたは似たようなコンテキストを持つ 2 つのテキストを比較分析することにより、ユーザーがそれらのテキストやコンテキストに対する新しい洞察を得られるようにします。

この記事で構築するアプリケーションは、ワード・クラウド視覚化をベースとしたものです。ワード・クラウド視覚化では、特定のテキストを分析し、テキストに含まれる各単語に、その出現頻度に応じたランクを付けます。ランクが付けられた単語は、そのランクに応じたサイズが設定されます。ランクの高い単語ほど、大きなフォント・サイズで表示されるという仕組みです。視覚化で単語がどのように配置されるかは、場合によって異なりますが、通常はクラウド (雲) のような形になるように配置されます (図 1 を参照)。

図 1. ワード・クラウド
IBM Many Eyes を使用して、「IBM 2011 Annual Report」の「IBM 2011 Annual Report」の「A Letter from the President and CEO」から生成されたワード・クラウド

私は図 1 のワード・クラウドを生成するために、IBM Many Eyes (「参考文献」を参照) を使用して「IBM 2011 Annual Report」の「A Letter from the President and CEO」を分析しました。

この記事のアプリケーションで生成するのは、ワード・ウェイブ、つまり波のような形のテキスト視覚化です。ワード・ウェイブでは、ランクの高いワードが左上隅に配置されます。図 2 に、図 1 で視覚化したのと同じテキストを使用したワード・ウェイブの例を示します。

図 2. ワード・ウェイブの例
図 1 で視覚化したのと同じテキストをワード・ウェイブで視覚化した例

テキストを視覚化すると、ランクの高いワードが明らかになります。視覚化に基づくテキストの分析では、ランクの高いワードは、重要度が高いとみなされます。したがって、比較が役立ってくるのは、2 つのテキスト視覚化を一緒に表示する場合です。両方のテキストのコンテキストが同じまたは似ているとしたら、比較が特に有意義なものになります。例えば、同じ業界の 2 つの会社の戦略をそれぞれ記述するテキストを比較すると、その 2 社の間での優先事項の類似点と相違点が明らかになります。

図 3 は、2 つのテキストを比較した最終的な結果の概略図を示したものです。最初のテキストを視覚化した結果が上部に、2 番目のテキストを視覚化した結果が下部に示されています。ランクの高いワードは、いずれも左側に配置されています。

図 3. 視覚化でのテキスト比較の概略図
2 つのテキストの最終的な比較の概略図

この記事 (および記載するコード) は、以下の内容を説明することを目的としています。

  • テキストを視覚化して比較するコマンドライン・アプリケーションを、オープンソースのツールとライブラリーを使用して開発する
  • ワード・ウェイブによる視覚化を利用して、特定のテキストを (図 2 のように) 視覚化する
  • 1 つの画像の中に 2 つの視覚化を結合し、比較分析できるようにする
  • 視覚化を基に、視覚的に説得力のある動画を作成する

開発の詳細については、この記事で深く掘り下げることはしません。そのため、読者に Java 開発と Eclipse プログラミング・モデルの経験があると理解の助けになります。アプリケーションのソース・コードのすべて (このアプリケーションの Eclipse プロジェクトのファイルと、そのままデプロイできる更新サイトのファイル) は、ダウンロードすることができます。

まずは、開発環境のコンポーネントについて、概要を説明します。

前提条件

この記事で説明する手順に従うには、Eclipse をインストールして、必要なすべてのライブラリーをダウンロードする必要があります。この記事で使用したバージョンは以下のとおりです。

開発環境

この開発環境は、各種のオープンソース・ツールとライブラリーで構成されており、これらを組み合わせることでワード・ウェイブと動画を簡単に作成することができます。画像、動画、コマンドライン・インターフェースの重たい処理は、これらのツールとライブラリーが行ってくれるため、アプリケーションのコード自体は比較的短くなっています。

Eclipse

Eclipse を IDE として使用すると、Command Line Program を利用することが可能になります。

Command Line Program

Command Line Program は、コマンドライン・アプリケーションを作成するためのサード・パーティー製 Eclipse RCP (Rich Client Platform) アプリケーションです。このアプリケーションは、フィーチャーおよび更新サイトを含め、Eclipse プラグイン・プログラミング・モデルを使用しています (Eclipse の概念については、「参考文献」のリンクを参照してください)。Command Line Program は、コマンドライン・アプリケーション (コマンドライン構文解析、ヘルプ・コマンド、ロギング、その他の基本関数など) のインフラストラクチャーを提供します。この記事では、Command Line Program の拡張コマンドとして視覚化分析ソフトウェアを開発することになります。

Processing と WordCram

Processing は、画像とアニメーションを作成するための言語兼開発環境です。Processing の概要については、「Processing によるデータ視覚化: 第 1 回」を参照してください。Processing は簡単に習得して使用できるにもかかわらず、極めて高度なことを実現することができます (「参考文献」で、OpenProcessing.org に公開されている例へのリンクを参照してください)。WordCram は、ワード・クラウドを作成するためのカスタマイズ可能な Processing 用ライブラリーです。

Monte Media Library

Monte Media Library は、動画および画像を作成、読み取り、操作するためのシンプルで優れたオープンソースのライブラリーです。作成者の Werner Randelshofer 氏は、Monte Media Library は自分の個人的な研究のために作成した実験的なものであると、彼の Web サイトで述べているものの、ありがたいことに他の開発者も使えるようにこのライブラリーを公開しています。他に使用できるライブラリーもありますが、それらのライブラリーは扱いにくそうで、ネイティブ・コードが必要になります。それらとは異なり、Monte Media Library は使いやすく、Pure Java コードで作られています。


アプリケーションの開発

ツールの概要を理解したところで、ここからはアプリケーションの開発に取り掛かります。まず、TextVisualizationAndAnalysis という名前のアプリケーションを作成し、Compare という名前の拡張コマンドを Command Line Program に追加します。

Command Line Program の拡張機能を開発するには、Command Line Program プロジェクトが必要です。CLP_Plugin_Main プロジェクトをダウンロードして、Eclipse ワークスペースにインポートしてください。このプロジェクトには、Command Line Program のソース・コードが含まれており、これから作成するプロジェクトで拡張機能を開発するための拡張ポイントがあります。

プラグイン・プロジェクトを作成する

Command Line Program の拡張コマンドを開発するには、他のあらゆる Eclipse 拡張プロジェクトでの場合と同じく、最初にプラグイン・プロジェクトを作成します。

  1. 新規プラグイン・プロジェクトを作成し、プロジェクト名として「TextVisualizationAndAnalysis」と入力します。
  2. Eclipse のバージョンとして「3.5 or greater (3.5 以上)」を選択し、「Next (次へ)」をクリックします。
  3. バージョン番号として「0.0.1」と入力し、「This plug-in will make contributions to the UI (このプラグインを 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」をプロジェクトに追加します。このプラグインは、Eclipse ワークスペースにインポートした Command Line Program Eclipse プロジェクトに付属しているものです。
  7. 「Extensions (拡張)」タブに進み、com.softabar.clpp.application.command 拡張ポイント (Command Line Program が提供) を継承する拡張機能を追加します。
  8. 拡張機能の詳細を入力します。「name (名前)」フィールドには「compare (比較)」と入力します。「help (ヘルプ)」フィールドには「Visualize and compare two text files. (2 つのテキストを視覚化および比較します。)」と入力し、「class (クラス)」フィールドには「textvisualizationandanalysis.CompareCommand」と入力します (図 4 を参照)。
    図 4. Command Line Program の新規コマンド
    「Extension Element Details (拡張要素詳細)」ダイアログを示すスクリーン・キャプチャー

クラスは後で作成します。また、後で必要に応じて、プラグインに新しい情報を追加してください。

必要なライブラリーを追加する

Compare コマンドを作成するには、以下のライブラリーをプラグインに追加します。

  • Processing の core.jar
  • WordCram の WordCram.jar、jsoup-1.3.3.jar、および (オプションの) cue.language.jar
  • Monte Media Library の monte-cc.jar

以下の手順に従って、上記のライブラリーを追加します。

  1. プラグイン・プロジェクト内に lib ディレクトリーを作成し、そこに JAR ファイルを追加します。
  2. lib ディレクトリーをプラグイン・ビルドに追加するために、plugin.xml を開いて、「Build (ビルド)」タブを選択します。「Binary Build (バイナリー・ビルド)」ダイアログで lib ディレクトリーのチェック・ボックスをクリックして、このディレクトリーを選択します (図 5 を参照)。
    図 5. プラグインのバイナリー・ビルド
    「Binary Build (バイナリー・ビルド)」ダイアログのスクリーン・キャプチャー
  3. 「Runtime (ランタイム)」タブを開き、「Classpath (クラスパス)」ダイアログで「Add (追加)」を選択して、ライブラリーをプラグインのクラスパスに追加します。図 6 に、すべてのライブラリー (cue.language.jar は含まれていません) が追加された「Classpath (クラスパス)」ダイアログを示します。
    図 6. ライブラリーをプラグインのクラスパスに追加する
    「Classpath (クラスパス)」ダイアログのスクリーン・キャプチャー
  4. plugin.xml ファイルを保存します。

コードを作成する

以上の手順が完了したら、このコマンドの実際のコードを作成する作業に取り掛かることができます。以降のリストに、コマンドのソース・コードを記載します (package 文と import 文は意図的に省略しています)。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 のメソッドを利用するために、processing.core.PApplet クラスを継承しています。その上で、2 つのインターフェース、com.softabar.clpp.program.ICommandwordcram.WordColorer を実装します。com.softabar.clpp.program.ICommand は Command Line Program 用のインターフェースであり、コマンドの実行時に Command Line Program によって呼び出されます。wordcram.WordColorer インターフェースは、ワード・クラウド (またはワード・ウェイブ) の色を処理します。一部の変数が static として宣言されているのは、実行中の Processing コードから、これらの変数を参照できなければならないためです。

リスト 2 に、ICommand インターフェースの execute() メソッドを記載します。

リスト 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();
}

リスト 2execute() メソッドは、org.apache.commons.cli.CommandLine インスタンスを引数に取ります。この引数は、コマンドのオプションを取得するためのものです。サポートされるオプションは、後で plugin.xml に追加します。オプションを取得して設定した後、generateWordCloud() メソッドを呼び出してワード・クラウドを作成します。その後、動画を作成するために createVideo() メソッドを呼び出します。

リスト 3 に記載する generateWordCloud() メソッドは、processing.PApplet クラスの main メソッドを呼び出した後、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 に、ワード・クラウドを生成するためのセットアップ・メソッドを示します。

リスト 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 に記載されている setup() は、Processing が描画を開始する前に呼び出すメソッドです。このメソッドで、画面サイズと背景色を初期化し、グラフィック・バッファーを作成します。このグラフィック・バッファーに、WordCram によって生成されるワード・クラウドを描画します。このコードは、Eclipse 内からテストする変数も指定しています。

ワード・クラウドを生成するライブラリー、WordCram は、リスト 5 で初期化されます。ワード・クラウドの側面 (配置や色など) は、指定することができます。WordCram には、いくつかの Placer (ここで使用しているウェイブなど) に加え、単語用の Colorer がいくつか用意されています。ここでは独自の 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");
    }
}

ワード・クラウドの生成は、一度に 1 単語ずつ行われます。リスト 6 では、2 つのワード・クラウドにそれぞれ個別のバッファーを使用しています。画面には、この両方のバッファーが描画されます。ワード・クラウドが完成すると、描画を終了し、スキップされたすべての単語をリストアップします。動画を作成する場合は、各フレームを 1 つの画像として保存します。これらの画像が、1 つの動画を生成するために使用されます。

リスト 7 に記載する listSkippedWords() メソッドの目的は、視覚化で配置できなかった単語のリストを出力することです。

リスト 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);
    }
}

スキップされた単語が 1 つでも返された場合、それは、視覚化した結果に重要な単語が含まれていない可能性があることを意味します。その場合、視覚化の結果に基づいて後で行われる分析が、誤解を招いたり、さらには誤ったものになったりする可能性すらあります。スキップされた単語が返されたとしたら、プログラムを再実行して、すべての単語がワード・クラウドに配置されるようにしてください。

リスト 8colorFor() メソッドは、WordCram の WordColorer インターフェースを実装します。このメソッドは、事前定義されたリストから無作為に選択した色を返します。

リスト 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 を見れば、画像から簡単に動画を作成できることがわかります。動画フォーマットを指定したら、あとは一度に 1 つの画像を使用して動画を作成すればよいのです。

コマンドラインのオプションを plugin.xml に追加する

これで、コードは完成しました。このコードをデプロイするには、その前にコマンドラインのオプションを plugin.xml に追加して、Command Line Program がこれらのオプションを構文解析できるようにする必要があります。

  1. plugin.xml を開き、「Extensions (拡張)」タブを開きます。
  2. compare-command」を選択して右クリックし、「New (新規)」 > 「option (オプション)」の順に選択します。
  3. このアプリケーションには、input1input2video の各オプションが必要です。input1input2 は、比較する 2 つのテキスト・ファイルのファイル名をそれぞれ指定します。video は動画を生成する場合のオプションです (これを省略すると、動画は生成されません)。図 7 に、input1 オプションの定義 (「Text 1 file to compare (比較対象のテキスト 1 ファイル)」) と、必要に応じて追加できるその他のオプションを示します。
図 7. コマンドのオプション
「Extensions (拡張)」タブの「Extension Element Details (拡張要素詳細)」ダイアログのスクリーン・キャプチャー

Command Line Program の Compare コマンドが完成したので、このコマンドをデプロイすることができます。


アプリケーションのデプロイ

TextVisualizationAndAnalysis アプリケーションを使用するには、このアプリケーションを Command Line Program にデプロイする必要があります。TextVisualizationAndAnalysis プラグインのフィーチャーと更新サイトを作成してから、作成したコマンドを Command Line Program にインストールします。

フィーチャーを作成する

Eclipse 内のフィーチャーとは、インストール可能かつ更新可能なプラグインの集まりのことです。Command Line Program は標準の Eclipse フィーチャー機能を使用して、新しい拡張コマンドをインストール、更新、アンインストールできるようにしています。Compare コマンドのフィーチャーを作成する簡単な手順は以下のとおりです。

  1. フィーチャー・プロジェクトを作成して、「TextVisualizationAndAnalysisFeature」という名前を付けます。
  2. バージョン番号を 0.0.1 に設定して、「Next (次へ)」をクリックします。
  3. TextVisualizationAndAnalysis プラグインを選択して、「Finish (完了)」をクリックします。

更新サイトを生成する

更新サイトには、アプリケーションにインストール可能なフィーチャーがあります。更新サイトはローカル・ディレクトリーにすることも、リモート Web サーバーにすることもできます。TextVisualizationAndAnalysis プログラムの更新サイトを生成する手順は、以下のとおりです。

  1. 更新サイト・プロジェクトを作成し、「TextVisualizationAndAnalysisUpdateSite」という名前を付けます。
  2. 「Update Site Map (更新サイト・マップ)」ページで、「Managing the Site (サイトを管理中)」の下にある「Add Feature (フィーチャーの追加)」を選択し、「TextVisualizationAndAnalysisFeature」を追加します (図 8 を参照)。
    図 8. 更新サイト・マップのページ
    更新サイト・マップのページのスクリーン・キャプチャー
  3. 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'

input に指定したファイル名を視覚化のタイトルとして使用するには、以下のコマンドを実行します。

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 アプリケーションが実行可能になったので、このアプリケーションで 2 つの類似したテキストを視覚化します。視覚化するテキストは、同じ業界の 2 つの企業 (Coca-Cola Company (コカ・コーラ社) と PepsiCo (ペプシコ社)) の一般公開されている社是です。視覚化した後、結果を分析します。その前提となっているのは、ワード・ウェイブによって、この 2 つの企業が自社の現在と将来に最も重要であると考えていることが視覚化されるであろうということです (ソース・テキストと、プラグイン・プロジェクトの完全なアプリケーション・コードを入手するには、「ダウンロード」を参照してください)。

視覚化

前の「アプリケーションを実行する」セクションの最後に記載したコマンドを使用して、画像と動画を生成しました。図 9 は、2 つのテキストの視覚化による比較です。

図 9. 2 つの同様のテキストの視覚化
視覚化による Coca-Cola Company (コカ・コーラ社) と PepsiCo (ペプシコ社) の社是の比較

図 9 の上に示されたワード・ウェイブは、Coca-Cola Company (コカ・コーラ社) の「Mission, Vision & Values」で述べられている内容で、下に示されているのは PepsiCo (ペプシコ社) の「PepsiCo Values & Philosophy」で述べられている内容です。この 2 つのワード・ウェイブには、これらのテキストで最もよく使われている 50 の単語がそれぞれ示されています。出現頻度が最も高い単語は、左上隅に配置されており、右に行くにしたがって、フォント・サイズが小さくなっていきます。つまり、右下隅に表示されている単語は、左上隅に表示されている単語よりも出現頻度が低いということです。

囲み記事で、1 単語ずつ生成される視覚化の 10 秒間の動画を視聴してください。

分析

図 9 の視覚化による比較を分析するには、左側から全体の 4 分の 1 までの部分に表示されている単語を最も重視してください。まず視覚化された結果で、それぞれのワード・ウェイブの左側から 4 分の 1 あたりの位置に縦の線を引きます。

図 10. 2 つのテキストの分析
図 9 の視覚化による比較を分析し、左側から全体の 4 分の 1 までの部分にある単語に重点を置く

私の推測では、線の左側にある単語は、両方の企業が最も重視していることです。

Coca-Cola Company (コカ・コーラ社) では、自社のビジョンに重点を置き、そのビジョンを実現するためのロードマップを作成しているものと思われます。また、世界をビジネスの対象とみなし、ビジョンを実現するための企業のアクションとその品質を重んじているようです。

PepsiCo (ペプシコ社) では、そのビジネスの目的を、財政上の業績を含めた企業の成長に置いているものと思われます。さらに、環境と社会の側面を重視しているとも受け取れます。

この視覚化による簡単な比較は、同じ業界の 2 つの企業での考え方の違いを示しています。この分析から得られる妥当な結論は、Coca-Cola Company (コカ・コーラ社) は世界における将来の位置付けに関心を持つ一方、PepsiCo (ペプシコ社) はビジネスとその成長に関心を持っているということです。


アプリケーションの更新

ある時点で、TextVisualizationAndAnalysis アプリケーションを更新しなければならない可能性も考えられます。更新するには、インストールする場合と同じメカニズムを使用します。アプリケーションを更新するための手順は以下のとおりです。

  1. コードまたは他のファイルに必要な変更を加えます。
  2. プラグインとフィーチャーのバージョン番号を増分します。
    • 重要: プラグインとフィーチャーの両方のバージョンを変更する必要があります。両方とも変更しなければ、変更が行われたことを更新メカニズムで検出できません。
    • バージョン番号は、少なくともサービス・セグメントのレベルで増分する必要があります。例えば、古いバージョンが 0.0.1 だとしたら、新しいバージョンは 0.0.2 になります。
  3. 更新サイトとビルド更新サイトに新しいバージョンを追加します。
  4. 以下のコマンドを実行します。
    clp.cmd admin --update --dir='c:\workspace\TextVisualizationAndAnalysisUpdateSite'
  5. 通常どおりにアプリケーションを実行します。

まとめ

視覚化は、テキストから新しい洞察を探り出すための強力なツールです。この記事では、既存のオープンソース・ツールを使って、2 つのテキストを比較して分析する視覚化アプリケーションを開発しました。この TextVisualizationAndAnalysis アプリケーションは、例えば、企業戦略、有名人の経歴、フィクション作品など、あらゆるタイプのテキストを比較するのに使用することができます。さらに、この記事で学んだツールと手法を使えば、独自の視覚化アプリケーションを作成することも可能です。


ダウンロード

内容ファイル名サイズ
Plug-in projects, ready to import into EclipseTextVisualizationAndAnalysis_projects.zip1.3MB
Update site for deploying to Command Line ProgramTextVisualizationAndAnalysisUpdateSite.zip1.3MB

参考文献

学ぶために

  • Eclipse プラグインの概念: 「Plug-in Development Environment Guide」で、フィーチャーや更新サイト、その他の Eclipse プラグインの概念を読んでください。
  • Processing によるデータ視覚化: 第 1 回 言語と環境」(M. Tim Jones 著、developerWorks、2010年11月): Processing 言語および環境を紹介する全 3 回からなる連載記事の第 1 回を読んでください。
  • OpenProcessing: このサイトにアクセスして、Processing で作成されたさまざまなスケッチを見てください。
  • Mission, Vision & Values」: この記事の例で使用した、2012年の春に発表された Coca-Cola Company (コカ・コーラ社) の社是です。
  • PepsiCo Values & Philosophy」: この記事の例で使用した、2012年の春に発表された PepsiCo (ペプシコ社) の社是です (例では「Guiding Principles」セクションを除外しました)。
  • IBM Many Eyes による視覚化: 図 1 に示したワード・クラウドをはじめ、IBM Many Eyes で生成された数々の視覚化が紹介されています。
  • Sami Salkosuo のブログ: Sami のブログに、この記事で使用したツールで生成された多数のワード・クラウド視覚化が掲載されています。
  • IBM InfoSphere Streams: 非常にスケーラブルで強力なアナリティクス・プラットフォームを入手してください。IBM InfoSphere Streams では、1 秒あたり数百万のイベントやメッセージに至るまでの極めて高いデータ・スループット・レートを処理することができます。
  • IBM InfoSphere BigInsights: 保管されている膨大な構造化データと非構造化データの管理と分析に、IBM のビッグ・データ・アナリティクス用の完成度の高い Hadoop ディストリビューション、InfoSphere BigInsights を使用してください。InfoSphere BigInsights は、先進のアナリティクス、アプリケーション・アクセラレーター、マルチディストリビューション・サポート、パフォーマンス最適化、エンタープライズ統合などのエンタープライズ対応の機能で Hadoop を強化しています。
  • developerWorks Open source テクニカル・トピック: 開発や IBM 製品でオープンソース技術を使用する際に役立つ広範なハウツー情報、ツール、およびプロジェクト更新を見つけてください。

製品や技術を入手するために

  • Eclipse: お使いのプラットフォームに対応する Eclipse をダウンロードしてください。
  • Command Line Program: Softabar の Command Line Program は、コマンドライン・アプリケーションを構築するためのオープンソース・プラットフォームです。
  • Monte Media Library: Monte Media Library は、メディア・データを処理するための Java ライブラリーです。
  • Processing: Processing は、画像、アニメーション、ユーザーとの対話部分を作成するためのオープンソースのプログラミング言語兼環境です。
  • WordCram: WordCram は、ワード・クラウドを生成するための Processing ライブラリーです。
  • VLC: VLC は無料で入手できるオープンソースのマルチメディア・プレイヤーです。
  • IBM InfoSphere Streams: InfoSphere Streams をダウンロードして、何千ものリアルタイム・ソースからの情報を到着と同時に取り込み、素早く分析して相関させるアプリケーションを構築してください。
  • IBM InfoSphere BigInsights: InfoSphere BigInsights をダウンロードして、保管されている膨大な構造化データおよび非構造化データの管理と分析に使用してください。

議論するために

  • developerWorks コミュニティーに参加してください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者によるブログ、フォーラム、グループ、Wiki を調べることができます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology
ArticleID=933541
ArticleTitle=テキスト視覚化アナリティクス・アプリケーションを構築する
publish-date=06132013