Skip to content

Instantly share code, notes, and snippets.

@unnonouno
Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save unnonouno/b482b9526ea4a6433d1d to your computer and use it in GitHub Desktop.
Save unnonouno/b482b9526ea4a6433d1d to your computer and use it in GitHub Desktop.
string_featureの変更点

今までの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を利用できるようになる。このインターフェースのほうが自由度が高い

プラグインを利用しない人には影響はない

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment