今までのspiltterインターフェースでは、入力された文字列情報を分割し、その部分文字列を特徴情報として利用していた。この方法は、
- 部分文字列以外の文字列情報を利用できない。そのため、例えば自然言語処理でよくあるような、原型に戻したりstemmingしたり、といった処理が行えない
- 特徴の重みを任意に変えることができない。そのため、たとえば文書長のような特徴を利用できない
といった欠点があった。 そこで、2つの欠点を克服できるようなstring_featureインターフェースを作成した上で、従来のsplitterはstring_featureのサブクラスとして、自然に拡張できるようにした。従来のsplitterとsplit関数はそのまま残し、過去に作成された資源は再コンパイルによって利用できる。
string_featureは、入力された文字列に対して、特徴表現文字列とそのスコアのペアの集合を返す。これにより、上記の欠点は以下のように克服できる。
- 原型に戻すなど、任意の特徴文字列を返すことができる
- 任意のおもみをスコアとして返すことができる
従来のsplitterは以下のようにふるまう。
- 従来は部分文字列の区間を返していたが、これを特徴表現文字列として返す。振る舞いは変わらない
- スコアは常に1とする
さて、文字列特徴を切り出したあと、tfなどのサンプル単位での出現数に応じた重み付け処理があった。従来は出現数をカウントしてtfなどの重みを計算していたが、各特徴に重みがついたため、tfを自然に拡張する必要がある(今までは単純に出現数を数えていた)。そこで、出現したスコアの総和を、重み付き出現数として従来の出現数の代わりに使う。上に書いたとおり、splitterはスコアとして常に1を返すので、この総和は出現数と一致する。
- word_splitter
- インターフェースは変わらない
- バイナリの互換性は切れるので、プラグインの再ビルドが必要
- string_feature
- 新たにより自由度の高いstring_featureを利用できるようになる
- word_splitterのsplit関数の代わりに、string_featureのextract関数を実装する。なお、word_splitterのextract実装の中ではsplit関数を呼ぶ形になっている
- extract関数は、std::stringを受け取って、std::vector<string_feature_element>を返す関数となる
- string_feature_elementは部分文字列std::string valueと、それに対するスコアdouble scoreを持つ。また、デバッグ用に切り出した特徴の位置を示すbegin, lengthも含まれる(重みの計算には利用されない)
- プラグインを開発する人
- string_featureを利用できるようになる。このインターフェースのほうが自由度が高い
プラグインを利用しない人には影響はない