【Java初心者】Wekaによる機械学習 09-Ngramフィルターの自作

今回も、自分の試行錯誤の結果を記録しておくようなものです。
間違いがありましたらご指摘をお願いします。

# Wekaのフィルター

Arffファイルを加工する時、テキストデータとして読み込むことが多かったんだけど、フィルターを使っているうちに、「これは便利だね」と思うようになった。

このため、フィルターを自作してみることにした。

# フィルターの種類

こちらの記事を見ると、フィルターを自作するのに参考になる記述がある。

https://waikato.github.io/weka-wiki/writing_filter/

```
One can basically distinguish between two different kinds of filters:

・batch filters - they need to see the whole dataset before they can start processing it, which they do in one go
・stream filters - they can start producing output right away and the data just passes through while being modified

All filters are derived from the abstract superclass weka.filters.Filter.
```
和訳すると
```
基本的に、フィルターには2つの異なる種類があります：
バッチフィルター - データセット全体を見てから処理を開始する必要があり、一度にすべてを処理します。
ストリームフィルター - すぐに出力を生成し始めることができ、データは変更されながら通過します。
すべてのフィルターは、抽象スーパークラスweka.filters.Filterから派生しています。
```
ということでした。

行単位で処理するならば、stream filters (weka.filters.SimpleStreamFilter) を継承すればいいのではないかと思って書いてみることにした。

# Ngramフィルター

Ngramについては、こちらに詳しく書かれています。

https://mojitoba.com/2019/09/23/what-is-ngram/

次のような文章を
```
プログラミングを覚える際、単なる写経ではすぐに飽きてしまうかも知れません。
```
Ngramで3文字ずつ分割すると(Trigramというようです)こちらのようになります。
```
プログ ログラ グラミ ラミン ミング ングを グを覚 を覚え 覚える える際 る際、 際、単 、単な 単なる なる写 る写経 写経で 経では ではす はすぐ すぐに ぐに飽 に飽き 飽きて きてし てしま しまう まうか うかも かも知 も知れ 知れま れませ ません せん。 
```

以下のことが言えます。
* 高速に処理できる
* 形態素解析の辞書に依存しない。つまり、辞書の出来栄えに左右されないし、新出単語があっても心配ない
* 説明変数が多くなる
* ストップワードの設定ができなくなる(やろとすればできますが意味があるのか・・・)

スピードが求められる全文検索エンジンでは、実装例が色々あるみたいです。

# 利用するソフト(ライブラリー)

自分はJavaアプリから利用するので、今回もmini-wekaを使います。https://mvnrepository.com/artifact/com.github.fracpete/mini-weka

# データ

カレントディレクトリにraw.txtというCSVを保存します。
```
番号,テキスト,分類
1,多くの画像やファイルがあり、それを複数のフォルダに分類分けするにはどうしたら良いでしょうか。1つずつファイルを開いて内容を見てからファイルに振り分けるのはとても面倒です。それを手軽にしてくれるのがVisualFileSorterです。準備してしまえば、さくさくと作業できるでしょう。,n
1,プログラミングを覚える際、単なる写経ではすぐに飽きてしまうかも知れません。もう少しゲーム的な要素があると、楽しんで学べそうです。それが一人ではなく、他の人と競うものであれば尚のことです。今回紹介するRobotRumbleはドット（ロボット）を使ったプログラミング対戦ゲームです。,n
1,インターネットにおいてプライバシーは大きな課題です。情報漏洩はもちろんのこと、GAFAなどに情報が吸い上げられている状況は、多くの国で懸念されています。インターネットはもっと自由であるべきです。今回紹介するFoxqlはP2Pをベースにしたソーシャルネットワークです。,n
1,忙しさにかまけていると、つい自分の誕生日を忘れてしまったりします。小さい頃と違って年齢を重ねることに大きな喜びを感じなくなると、特にそうかも知れません。しかし、他の人の誕生日を忘れるのは厳禁です。相手の信頼を損ねる結果につながるかも知れません。そこで使ってみたいのがBirthday.reportです。,n
1,Minecraftを遊ぶ場合、専用のアプリケーションやスマートフォン/タブレットアプリなどを利用します。ちょっと試したいというだけにしては敷居が高いかも知れません。インストーラーをダウンロードしている内に気が変わってしまう可能性もあります。そこで使ってみたいのがWeb-Minecraftです。,y
1,PWAはWebアプリケーションながら、まるでローカルアプリケーションのようなUIや機能を実現する技術群になります。HTML5のAPIもどんどん増えており、それらを使うことでローカルアプリケーションと同じような操作が行えるようになっています。今回紹介するgitcloneasaPWAはその一例です。,y
1,実際には試せていないのでご注意を。先日、テープやCD、ラジオもてんこ盛りになったラジカセ。,n
2,NFTに注目が集まっており、デジタルアートの価値が跳ね上がっています。その中には作者が人間ではない、いわゆる機械やAIによって書かれたアートもあります。,n
2,開発者向けにサービスを提供している場合、ドキュメントは最重要な施策の一つです。ドキュメントがみすぼらしいと、誰も使いたいと思わないでしょう。過不足なく書かれたドキュメントを作るのは大変なことです。今回紹介するDocuowlはそんなドキュメントを生成するソフトウェアになります。,n
1,Yahoo!ニュースでは各メディアから提供されたニュース記事が掲載されています。しかし画像などの情報が抜け落ちていたり、リンクがなかったりと情報不足になっていることが良くあります。その結果、元記事を探したりする人も多いのではないでしょうか。そこで使ってみたいのがYahoo!ニュースの元記事を探すです。,n
1,Web上で提供されるゲームアプリというとパズルゲームが多いように思います。あまり高速な動作を必要とされないゲームであれば作りやすいでしょう。しかしJavaScriptも高速化しており、他のジャンルでも十分ゲーム開発が可能になっています。今回紹介するmk.jsはCanvasベースのファイティングゲームになります。,y
```

# 実際のコード

## 自作フィルター

```java
package example;

import com.google.common.base.Strings;
import java.util.ArrayList;
import java.util.List;
import weka.core.Instance;
import weka.core.Instances;
import weka.filters.SimpleStreamFilter;

public class NGramFilter extends SimpleStreamFilter {

    private String attributeIndex; // 対象属性のインデックス
    private final int N; // 対象属性のインデックス

    public NGramFilter(int length) {
        this.N = length;
    }

    @Override
    protected Instances determineOutputFormat(Instances instances) throws Exception {
        // 出力フォーマットは入力と同じ
        return new Instances(instances);
    }
    
    public void setAttributeIndexes(String attIndex) {
        this.attributeIndex = attIndex;
    }

    /**
     * 実際の実行
     *
     * @param instance 処理するデータ
     * @return
     */
    @Override
    protected Instance process(Instance instance) {
        try {
            String[] attrs = attributeIndex.split("");
            for (String attr : attrs) {
                int attrInt = Integer.parseInt(attr);
                // 指定された属性の値を取得
                String currentValue = instance.stringValue(attrInt);
                // 置換処理
                String ngram = getNgram(currentValue, N);
                instance.setValue(attrInt, ngram); // ※
            }
            return instance; // 処理したインスタンスを返す
        } catch (Exception e) {
            throw e;
        }
    }

    @Override
    public String globalInfo() {
        return "NGramフィルター";
    }

    /**
     * 文章の中から文字ずつの配列を作る
     *
     * @param inputStr 処理する前の文字列
     * @param n 長さをどうするか。3の場合はTriGram
     * @return
     */
    private String getNgram(String inputStr, int n) {
        List<String> element = new ArrayList<>();
        if (inputStr.length() < n) {
            element.add((inputStr + Strings.repeat(" ", n - 1)).substring(0, n));
        } else {
            for (int i = 0; i < inputStr.length() - (n - 1); i++) {
                element.add(inputStr.substring(i, i + n));
            }
        }
        return String.join(" ", element);
    }
}

```

## フィルターを使うためのコード

* CSVをARFFにする
* Ngram処理(3文字) するAttributeをStringにする。そのままではnominalになっているので
* 上記フィルターにかける　

という3つの工程を書きます。一度にやる方法もあると思いますが、説明のために一つずつやります。

```java
package example;

import java.io.File;
import java.io.IOException;
import weka.core.Instances;
import weka.core.converters.CSVLoader;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.NominalToString;

public class NGramTest2 {

    public static void main(String[] args) throws IOException, Exception {
        System.out.println("---CSV---");
        CSVLoader loader = new CSVLoader();
        loader.setSource(new File("raw.txt"));
        Instances csvInstances = loader.getDataSet();

        System.out.println(csvInstances.toString());

        System.out.println("----nominal2String---");

        NominalToString nominalToString = new NominalToString();
        nominalToString.setAttributeIndexes("2");
        nominalToString.setInputFormat(csvInstances);
        Instances Nomi2StrInstances = Filter.useFilter(csvInstances, nominalToString);
        System.out.println(Nomi2StrInstances);

        System.out.println("---NGram---");
        NGramFilter nGramFilter = new NGramFilter(3);
        nGramFilter.setAttributeIndexes("1");
        Nomi2StrInstances.setClassIndex(2); // なんでこれが必要なんだろう
        nGramFilter.setInputFormat(Nomi2StrInstances);
        Instances NgramInstances = Filter.useFilter(Nomi2StrInstances, nGramFilter);
        System.out.println(NgramInstances);

    }

}

```

# 実行結果

```
---CSV---
@relation raw.txt

@attribute 番号 numeric
@attribute テキスト {多くの画像やファイルがあり、それを複数のフォルダに分類分けするにはどうしたら良いでしょうか。1つずつファイルを開いて内容を見てからファイルに振り分けるのはとても面倒です。それを手軽にしてくれるのがVisualFileSorterです。準備してしまえば、さくさくと作業できるでしょう。,プログラミングを覚える際、単なる写経ではすぐに飽きてしまうかも知れません。もう少しゲーム的な要素があると、楽しんで学べそうです。それが一人ではなく、他の人と競うものであれば尚のことです。今回紹介するRobotRumbleはドット（ロボット）を使ったプログラミング対戦ゲームです。,インターネットにおいてプライバシーは大きな課題です。情報漏洩はもちろんのこと、GAFAなどに情報が吸い上げられている状況は、多くの国で懸念されています。インターネットはもっと自由であるべきです。今回紹介するFoxqlはP2Pをベースにしたソーシャルネットワークです。,忙しさにかまけていると、つい自分の誕生日を忘れてしまったりします。小さい頃と違って年齢を重ねることに大きな喜びを感じなくなると、特にそうかも知れません。しかし、他の人の誕生日を忘れるのは厳禁です。相手の信頼を損ねる結果につながるかも知れません。そこで使ってみたいのがBirthday.reportです。,Minecraftを遊ぶ場合、専用のアプリケーションやスマートフォン/タブレットアプリなどを利用します。ちょっと試したいというだけにしては敷居が高いかも知れません。インストーラーをダウンロードしている内に気が変わってしまう可能性もあります。そこで使ってみたいのがWeb-Minecraftです。,PWAはWebアプリケーションながら、まるでローカルアプリケーションのようなUIや機能を実現する技術群になります。HTML5のAPIもどんどん増えており、それらを使うことでローカルアプリケーションと同じような操作が行えるようになっています。今回紹介するgitcloneasaPWAはその一例です。,実際には試せていないのでご注意を。先日、テープやCD、ラジオもてんこ盛りになったラジカセ。,NFTに注目が集まっており、デジタルアートの価値が跳ね上がっています。その中には作者が人間ではない、いわゆる機械やAIによって書かれたアートもあります。,開発者向けにサービスを提供している場合、ドキュメントは最重要な施策の一つです。ドキュメントがみすぼらしいと、誰も使いたいと思わないでしょう。過不足なく書かれたドキュメントを作るのは大変なことです。今回紹介するDocuowlはそんなドキュメントを生成するソフトウェアになります。,Yahoo!ニュースでは各メディアから提供されたニュース記事が掲載されています。しかし画像などの情報が抜け落ちていたり、リンクがなかったりと情報不足になっていることが良くあります。その結果、元記事を探したりする人も多いのではないでしょうか。そこで使ってみたいのがYahoo!ニュースの元記事を探すです。,Web上で提供されるゲームアプリというとパズルゲームが多いように思います。あまり高速な動作を必要とされないゲームであれば作りやすいでしょう。しかしJavaScriptも高速化しており、他のジャンルでも十分ゲーム開発が可能になっています。今回紹介するmk.jsはCanvasベースのファイティングゲームになります。}
@attribute 分類 {n,y}

@data
1,多くの画像やファイルがあり、それを複数のフォルダに分類分けするにはどうしたら良いでしょうか。1つずつファイルを開いて内容を見てからファイルに振り分けるのはとても面倒です。それを手軽にしてくれるのがVisualFileSorterです。準備してしまえば、さくさくと作業できるでしょう。,n
1,プログラミングを覚える際、単なる写経ではすぐに飽きてしまうかも知れません。もう少しゲーム的な要素があると、楽しんで学べそうです。それが一人ではなく、他の人と競うものであれば尚のことです。今回紹介するRobotRumbleはドット（ロボット）を使ったプログラミング対戦ゲームです。,n
1,インターネットにおいてプライバシーは大きな課題です。情報漏洩はもちろんのこと、GAFAなどに情報が吸い上げられている状況は、多くの国で懸念されています。インターネットはもっと自由であるべきです。今回紹介するFoxqlはP2Pをベースにしたソーシャルネットワークです。,n
1,忙しさにかまけていると、つい自分の誕生日を忘れてしまったりします。小さい頃と違って年齢を重ねることに大きな喜びを感じなくなると、特にそうかも知れません。しかし、他の人の誕生日を忘れるのは厳禁です。相手の信頼を損ねる結果につながるかも知れません。そこで使ってみたいのがBirthday.reportです。,n
1,Minecraftを遊ぶ場合、専用のアプリケーションやスマートフォン/タブレットアプリなどを利用します。ちょっと試したいというだけにしては敷居が高いかも知れません。インストーラーをダウンロードしている内に気が変わってしまう可能性もあります。そこで使ってみたいのがWeb-Minecraftです。,y
1,PWAはWebアプリケーションながら、まるでローカルアプリケーションのようなUIや機能を実現する技術群になります。HTML5のAPIもどんどん増えており、それらを使うことでローカルアプリケーションと同じような操作が行えるようになっています。今回紹介するgitcloneasaPWAはその一例です。,y
1,実際には試せていないのでご注意を。先日、テープやCD、ラジオもてんこ盛りになったラジカセ。,n
2,NFTに注目が集まっており、デジタルアートの価値が跳ね上がっています。その中には作者が人間ではない、いわゆる機械やAIによって書かれたアートもあります。,n
2,開発者向けにサービスを提供している場合、ドキュメントは最重要な施策の一つです。ドキュメントがみすぼらしいと、誰も使いたいと思わないでしょう。過不足なく書かれたドキュメントを作るのは大変なことです。今回紹介するDocuowlはそんなドキュメントを生成するソフトウェアになります。,n
1,Yahoo!ニュースでは各メディアから提供されたニュース記事が掲載されています。しかし画像などの情報が抜け落ちていたり、リンクがなかったりと情報不足になっていることが良くあります。その結果、元記事を探したりする人も多いのではないでしょうか。そこで使ってみたいのがYahoo!ニュースの元記事を探すです。,n
1,Web上で提供されるゲームアプリというとパズルゲームが多いように思います。あまり高速な動作を必要とされないゲームであれば作りやすいでしょう。しかしJavaScriptも高速化しており、他のジャンルでも十分ゲーム開発が可能になっています。今回紹介するmk.jsはCanvasベースのファイティングゲームになります。,y
----nominal2String---
@relation raw.txt-weka.filters.unsupervised.attribute.NominalToString-C2

@attribute 番号 numeric
@attribute テキスト string
@attribute 分類 {n,y}

@data
1,多くの画像やファイルがあり、それを複数のフォルダに分類分けするにはどうしたら良いでしょうか。1つずつファイルを開いて内容を見てからファイルに振り分けるのはとても面倒です。それを手軽にしてくれるのがVisualFileSorterです。準備してしまえば、さくさくと作業できるでしょう。,n
1,プログラミングを覚える際、単なる写経ではすぐに飽きてしまうかも知れません。もう少しゲーム的な要素があると、楽しんで学べそうです。それが一人ではなく、他の人と競うものであれば尚のことです。今回紹介するRobotRumbleはドット（ロボット）を使ったプログラミング対戦ゲームです。,n
1,インターネットにおいてプライバシーは大きな課題です。情報漏洩はもちろんのこと、GAFAなどに情報が吸い上げられている状況は、多くの国で懸念されています。インターネットはもっと自由であるべきです。今回紹介するFoxqlはP2Pをベースにしたソーシャルネットワークです。,n
1,忙しさにかまけていると、つい自分の誕生日を忘れてしまったりします。小さい頃と違って年齢を重ねることに大きな喜びを感じなくなると、特にそうかも知れません。しかし、他の人の誕生日を忘れるのは厳禁です。相手の信頼を損ねる結果につながるかも知れません。そこで使ってみたいのがBirthday.reportです。,n
1,Minecraftを遊ぶ場合、専用のアプリケーションやスマートフォン/タブレットアプリなどを利用します。ちょっと試したいというだけにしては敷居が高いかも知れません。インストーラーをダウンロードしている内に気が変わってしまう可能性もあります。そこで使ってみたいのがWeb-Minecraftです。,y
1,PWAはWebアプリケーションながら、まるでローカルアプリケーションのようなUIや機能を実現する技術群になります。HTML5のAPIもどんどん増えており、それらを使うことでローカルアプリケーションと同じような操作が行えるようになっています。今回紹介するgitcloneasaPWAはその一例です。,y
1,実際には試せていないのでご注意を。先日、テープやCD、ラジオもてんこ盛りになったラジカセ。,n
2,NFTに注目が集まっており、デジタルアートの価値が跳ね上がっています。その中には作者が人間ではない、いわゆる機械やAIによって書かれたアートもあります。,n
2,開発者向けにサービスを提供している場合、ドキュメントは最重要な施策の一つです。ドキュメントがみすぼらしいと、誰も使いたいと思わないでしょう。過不足なく書かれたドキュメントを作るのは大変なことです。今回紹介するDocuowlはそんなドキュメントを生成するソフトウェアになります。,n
1,Yahoo!ニュースでは各メディアから提供されたニュース記事が掲載されています。しかし画像などの情報が抜け落ちていたり、リンクがなかったりと情報不足になっていることが良くあります。その結果、元記事を探したりする人も多いのではないでしょうか。そこで使ってみたいのがYahoo!ニュースの元記事を探すです。,n
1,Web上で提供されるゲームアプリというとパズルゲームが多いように思います。あまり高速な動作を必要とされないゲームであれば作りやすいでしょう。しかしJavaScriptも高速化しており、他のジャンルでも十分ゲーム開発が可能になっています。今回紹介するmk.jsはCanvasベースのファイティングゲームになります。,y
---NGram---
@relation raw.txt-weka.filters.unsupervised.attribute.NominalToString-C2-example20220115.NGramFilter

@attribute 番号 numeric
@attribute テキスト string
@attribute 分類 {n,y}

@data
1,'多くの くの画 の画像 画像や 像やフ やファ ファイ ァイル イルが ルがあ があり あり、 り、そ 、それ それを れを複 を複数 複数の 数のフ のフォ フォル ォルダ ルダに ダに分 に分類 分類分 類分け 分けす けする するに るには にはど はどう どうし うした したら たら良 ら良い 良いで いでし でしょ しょう ょうか うか。 か。1 。1つ 1つず つずつ ずつフ つファ ファイ ァイル イルを ルを開 を開い 開いて いて内 て内容 内容を 容を見 を見て 見てか てから からフ らファ ファイ ァイル イルに ルに振 に振り 振り分 り分け 分ける けるの るのは のはと はとて とても ても面 も面倒 面倒で 倒です です。 す。そ 。それ それを れを手 を手軽 手軽に 軽にし にして してく てくれ くれる れるの るのが のがV がVi Vis isu sua ual alF lFi Fil ile leS eSo Sor ort rte ter erで rです です。 す。準 。準備 準備し 備して してし てしま しまえ まえば えば、 ば、さ 、さく さくさ くさく さくと くと作 と作業 作業で 業でき できる きるで るでし でしょ しょう ょう。',n
1,'プログ ログラ グラミ ラミン ミング ングを グを覚 を覚え 覚える える際 る際、 際、単 、単な 単なる なる写 る写経 写経で 経では ではす はすぐ すぐに ぐに飽 に飽き 飽きて きてし てしま しまう まうか うかも かも知 も知れ 知れま れませ ません せん。 ん。も 。もう もう少 う少し 少しゲ しゲー ゲーム ーム的 ム的な 的な要 な要素 要素が 素があ がある あると ると、 と、楽 、楽し 楽しん しんで んで学 で学べ 学べそ べそう そうで うです です。 す。そ 。それ それが れが一 が一人 一人で 人では ではな はなく なく、 く、他 、他の 他の人 の人と 人と競 と競う 競うも うもの もので のであ であれ あれば れば尚 ば尚の 尚のこ のこと ことで とです です。 す。今 。今回 今回紹 回紹介 紹介す 介する するR るRo Rob obo bot otR tRu Rum umb mbl ble leは eはド はドッ ドット ット（ ト（ロ （ロボ ロボッ ボット ット） ト）を ）を使 を使っ 使った ったプ たプロ プログ ログラ グラミ ラミン ミング ング対 グ対戦 対戦ゲ 戦ゲー ゲーム ームで ムです です。',n
1,'インタ ンター ターネ ーネッ ネット ットに トにお におい おいて いてプ てプラ プライ ライバ イバシ バシー シーは ーは大 は大き 大きな きな課 な課題 課題で 題です です。 す。情 。情報 情報漏 報漏洩 漏洩は 洩はも はもち もちろ ちろん ろんの んのこ のこと こと、 と、G 、GA GAF AFA FAな Aなど などに どに情 に情報 情報が 報が吸 が吸い 吸い上 い上げ 上げら げられ られて れてい ている いる状 る状況 状況は 況は、 は、多 、多く 多くの くの国 の国で 国で懸 で懸念 懸念さ 念され されて れてい ていま います ます。 す。イ 。イン インタ ンター ターネ ーネッ ネット ットは トはも はもっ もっと っと自 と自由 自由で 由であ である あるべ るべき べきで きです です。 す。今 。今回 今回紹 回紹介 紹介す 介する するF るFo Fox oxq xql qlは lはP はP2 P2P 2Pを Pをベ をベー ベース ースに スにし にした したソ たソー ソーシ ーシャ シャル ャルネ ルネッ ネット ットワ トワー ワーク ークで クです です。',n
1,'忙しさ しさに さにか にかま かまけ まけて けてい ている いると ると、 と、つ 、つい つい自 い自分 自分の 分の誕 の誕生 誕生日 生日を 日を忘 を忘れ 忘れて れてし てしま しまっ まった ったり たりし りしま します ます。 す。小 。小さ 小さい さい頃 い頃と 頃と違 と違っ 違って って年 て年齢 年齢を 齢を重 を重ね 重ねる ねるこ ること ことに とに大 に大き 大きな きな喜 な喜び 喜びを びを感 を感じ 感じな じなく なくな くなる なると ると、 と、特 、特に 特にそ にそう そうか うかも かも知 も知れ 知れま れませ ません せん。 ん。し 。しか しかし かし、 し、他 、他の 他の人 の人の 人の誕 の誕生 誕生日 生日を 日を忘 を忘れ 忘れる れるの るのは のは厳 は厳禁 厳禁で 禁です です。 す。相 。相手 相手の 手の信 の信頼 信頼を 頼を損 を損ね 損ねる ねる結 る結果 結果に 果につ につな つなが ながる がるか るかも かも知 も知れ 知れま れませ ません せん。 ん。そ 。そこ そこで こで使 で使っ 使って ってみ てみた みたい たいの いのが のがB がBi Bir irt rth thd hda day ay. y.r .re rep epo por ort rtで tです です。',n
1,'Min ine nec ecr cra raf aft ftを tを遊 を遊ぶ 遊ぶ場 ぶ場合 場合、 合、専 、専用 専用の 用のア のアプ アプリ プリケ リケー ケーシ ーショ ション ョンや ンやス やスマ スマー マート ートフ トフォ フォン ォン/ ン/タ /タブ タブレ ブレッ レット ットア トアプ アプリ プリな リなど などを どを利 を利用 利用し 用しま します ます。 す。ち 。ちょ ちょっ ょっと っと試 と試し 試した したい たいと いとい という いうだ うだけ だけに けにし にして しては ては敷 は敷居 敷居が 居が高 が高い 高いか いかも かも知 も知れ 知れま れませ ません せん。 ん。イ 。イン インス ンスト ストー トーラ ーラー ラーを ーをダ をダウ ダウン ウンロ ンロー ロード ードし ドして してい ている いる内 る内に 内に気 に気が 気が変 が変わ 変わっ わって ってし てしま しまう まう可 う可能 可能性 能性も 性もあ もあり ありま ります ます。 す。そ 。そこ そこで こで使 で使っ 使って ってみ てみた みたい たいの いのが のがW がWe Web eb- b-M -Mi Min ine nec ecr cra raf aft ftで tです です。',y
1,'PWA WAは AはW はWe Web ebア bアプ アプリ プリケ リケー ケーシ ーショ ション ョンな ンなが ながら がら、 ら、ま 、まる まるで るでロ でロー ローカ ーカル カルア ルアプ アプリ プリケ リケー ケーシ ーショ ション ョンの ンのよ のよう ような うなU なUI UIや Iや機 や機能 機能を 能を実 を実現 実現す 現する する技 る技術 技術群 術群に 群にな になり なりま ります ます。 す。H 。HT HTM TML ML5 L5の 5のA のAP API PIも Iもど もどん どんど んどん どん増 ん増え 増えて えてお ており おり、 り、そ 、それ それら れらを らを使 を使う 使うこ うこと ことで とでロ でロー ローカ ーカル カルア ルアプ アプリ プリケ リケー ケーシ ーショ ション ョンと ンと同 と同じ 同じよ じよう ような うな操 な操作 操作が 作が行 が行え 行える えるよ るよう ように うにな になっ なって ってい ていま います ます。 す。今 。今回 今回紹 回紹介 紹介す 介する するg るgi git itc tcl clo lon one nea eas asa saP aPW PWA WAは Aはそ はその その一 の一例 一例で 例です です。',y
1,'実際に 際には には試 は試せ 試せて せてい ていな いない ないの いので のでご でご注 ご注意 注意を 意を。 を。先 。先日 先日、 日、テ 、テー テープ ープや プやC やCD CD、 D、ラ 、ラジ ラジオ ジオも オもて もてん てんこ んこ盛 こ盛り 盛りに りにな になっ なった ったラ たラジ ラジカ ジカセ カセ。',n
2,'NFT FTに Tに注 に注目 注目が 目が集 が集ま 集まっ まって ってお ており おり、 り、デ 、デジ デジタ ジタル タルア ルアー アート ートの トの価 の価値 価値が 値が跳 が跳ね 跳ね上 ね上が 上がっ がって ってい ていま います ます。 す。そ 。その その中 の中に 中には には作 は作者 作者が 者が人 が人間 人間で 間では ではな はない ない、 い、い 、いわ いわゆ わゆる ゆる機 る機械 機械や 械やA やAI AIに Iによ によっ よって って書 て書か 書かれ かれた れたア たアー アート ートも トもあ もあり ありま ります ます。',n
2,'開発者 発者向 者向け 向けに けにサ にサー サービ ービス ビスを スを提 を提供 提供し 供して してい ている いる場 る場合 場合、 合、ド 、ドキ ドキュ キュメ ュメン メント ントは トは最 は最重 最重要 重要な 要な施 な施策 施策の 策の一 の一つ 一つで つです です。 す。ド 。ドキ ドキュ キュメ ュメン メント ントが トがみ がみす みすぼ すぼら ぼらし らしい しいと いと、 と、誰 、誰も 誰も使 も使い 使いた いたい たいと いと思 と思わ 思わな わない ないで いでし でしょ しょう ょう。 う。過 。過不 過不足 不足な 足なく なく書 く書か 書かれ かれた れたド たドキ ドキュ キュメ ュメン メント ントを トを作 を作る 作るの るのは のは大 は大変 大変な 変なこ なこと ことで とです です。 す。今 。今回 今回紹 回紹介 紹介す 介する するD るDo Doc ocu cuo uow owl wlは lはそ はそん そんな んなド なドキ ドキュ キュメ ュメン メント ントを トを生 を生成 生成す 成する するソ るソフ ソフト フトウ トウェ ウェア ェアに アにな になり なりま ります ます。',n
1,'Yah aho hoo oo! o!ニ !ニュ ニュー ュース ースで スでは では各 は各メ 各メデ メディ ディア ィアか アから から提 ら提供 提供さ 供され された れたニ たニュ ニュー ュース ース記 ス記事 記事が 事が掲 が掲載 掲載さ 載され されて れてい ていま います ます。 す。し 。しか しかし かし画 し画像 画像な 像など などの どの情 の情報 情報が 報が抜 が抜け 抜け落 け落ち 落ちて ちてい ていた いたり たり、 り、リ 、リン リンク ンクが クがな がなか なかっ かった ったり たりと りと情 と情報 情報不 報不足 不足に 足にな になっ なって ってい ている いるこ ること ことが とが良 が良く 良くあ くあり ありま ります ます。 す。そ 。その その結 の結果 結果、 果、元 、元記 元記事 記事を 事を探 を探し 探した したり たりす りする する人 る人も 人も多 も多い 多いの いので のでは ではな はない ないで いでし でしょ しょう ょうか うか。 か。そ 。そこ そこで こで使 で使っ 使って ってみ てみた みたい たいの いのが のがY がYa Yah aho hoo oo! o!ニ !ニュ ニュー ュース ースの スの元 の元記 元記事 記事を 事を探 を探す 探すで すです です。',n
1,'Web eb上 b上で 上で提 で提供 提供さ 供され される れるゲ るゲー ゲーム ームア ムアプ アプリ プリと リとい という いうと うとパ とパズ パズル ズルゲ ルゲー ゲーム ームが ムが多 が多い 多いよ いよう ように うに思 に思い 思いま います ます。 す。あ 。あま あまり まり高 り高速 高速な 速な動 な動作 動作を 作を必 を必要 必要と 要とさ とされ されな れない ないゲ いゲー ゲーム ームで ムであ であれ あれば れば作 ば作り 作りや りやす やすい すいで いでし でしょ しょう ょう。 う。し 。しか しかし かしJ しJa Jav ava vaS aSc Scr cri rip ipt ptも tも高 も高速 高速化 速化し 化して してお ており おり、 り、他 、他の 他のジ のジャ ジャン ャンル ンルで ルでも でも十 も十分 十分ゲ 分ゲー ゲーム ーム開 ム開発 開発が 発が可 が可能 可能に 能にな になっ なって ってい ていま います ます。 す。今 。今回 今回紹 回紹介 紹介す 介する するm るmk mk. k.j .js jsは sはC はCa Can anv nva vas asベ sベー ベース ースの スのフ のファ ファイ ァイテ イティ ティン ィング ングゲ グゲー ゲーム ームに ムにな になり なりま ります ます。',y
```

# 注意点(ハマりどころ)

自作フィルターの
```java
instance.setValue(attrInt, ngram); // ※
```

で、データを置き換えるわけですが、NominalToStringフィルターで、処理するAttributeをStringにしないと、文字列を挿入しようとするときにエラーとなります。

今後は、一括処理をしたほうが早いフィルターとして、batch filtersを利用する方法を考えてみたいと思います。

また、CSVからARFFに変換する時、
```java
csvLoader.setStringAttributes("2");
```
という行をいれると、NominalToStringフィルターを通さずに処理できます。